diff options
279 files changed, 11050 insertions, 5603 deletions
diff --git a/cmake/compiler/clang/settings.cmake b/cmake/compiler/clang/settings.cmake index 4dad4cb7820..261a55b285f 100644 --- a/cmake/compiler/clang/settings.cmake +++ b/cmake/compiler/clang/settings.cmake @@ -1,5 +1,5 @@ # Set build-directive (used in core to tell which buildtype we used) -add_definitions(-D_BUILD_DIRECTIVE='"$(CONFIGURATION)"') +add_definitions(-D_BUILD_DIRECTIVE='"${CMAKE_BUILD_TYPE}"') if(WITH_WARNINGS) set(WARNING_FLAGS "-W -Wall -Wextra -Winit-self -Wfatal-errors -Wno-mismatched-tags") diff --git a/cmake/macros/FindPCHSupport.cmake b/cmake/macros/FindPCHSupport.cmake index b068b69c26b..49d4be904d1 100644 --- a/cmake/macros/FindPCHSupport.cmake +++ b/cmake/macros/FindPCHSupport.cmake @@ -11,7 +11,7 @@ FUNCTION(GET_COMMON_PCH_PARAMS PCH_HEADER PCH_FE INCLUDE_PREFIX) SET(INCLUDE_FLAGS ${INCLUDE_FLAGS_LIST} PARENT_SCOPE) ENDFUNCTION(GET_COMMON_PCH_PARAMS) -FUNCTION(GENERATE_CXX_PCH_COMMAND TARGET_NAME INCLUDE_FLAGS IN PCH_SRC OUT) +FUNCTION(GENERATE_CXX_PCH_COMMAND TARGET_NAME_LIST INCLUDE_FLAGS IN PCH_SRC OUT) IF (CMAKE_BUILD_TYPE) STRING(TOUPPER _${CMAKE_BUILD_TYPE} CURRENT_BUILD_TYPE) ENDIF () @@ -55,50 +55,69 @@ FUNCTION(GENERATE_CXX_PCH_COMMAND TARGET_NAME INCLUDE_FLAGS IN PCH_SRC OUT) DEPENDS ${OUT} ) - ADD_DEPENDENCIES(${TARGET_NAME} generate_${PCH_SRC_N}) + FOREACH(TARGET_NAME ${TARGET_NAME_LIST}) + ADD_DEPENDENCIES(${TARGET_NAME} generate_${PCH_SRC_N}) + ENDFOREACH() + ENDFUNCTION(GENERATE_CXX_PCH_COMMAND) -FUNCTION(ADD_CXX_PCH_GCC TARGET_NAME PCH_HEADER PCH_SOURCE) +FUNCTION(ADD_CXX_PCH_GCC TARGET_NAME_LIST PCH_HEADER PCH_SOURCE) GET_COMMON_PCH_PARAMS(${PCH_HEADER} "gch" "-I") - GENERATE_CXX_PCH_COMMAND(${TARGET_NAME} "${INCLUDE_FLAGS}" ${PCH_HEADER} ${PCH_SOURCE} ${PCH_HEADER_OUT}) - SET_TARGET_PROPERTIES( - ${TARGET_NAME} PROPERTIES - COMPILE_FLAGS "-include ${CMAKE_CURRENT_BINARY_DIR}/${PCH_HEADER_NAME}" - ) + GENERATE_CXX_PCH_COMMAND("${TARGET_NAME_LIST}" "${INCLUDE_FLAGS}" ${PCH_HEADER} ${PCH_SOURCE} ${PCH_HEADER_OUT}) + + FOREACH(TARGET_NAME ${TARGET_NAME_LIST}) + SET_TARGET_PROPERTIES( + ${TARGET_NAME} PROPERTIES + COMPILE_FLAGS "-include ${CMAKE_CURRENT_BINARY_DIR}/${PCH_HEADER_NAME}" + ) + ENDFOREACH() ENDFUNCTION(ADD_CXX_PCH_GCC) -FUNCTION(ADD_CXX_PCH_CLANG TARGET_NAME PCH_HEADER PCH_SOURCE) +FUNCTION(ADD_CXX_PCH_CLANG TARGET_NAME_LIST PCH_HEADER PCH_SOURCE) GET_COMMON_PCH_PARAMS(${PCH_HEADER} "pch" "-I") - GENERATE_CXX_PCH_COMMAND(${TARGET_NAME} "${INCLUDE_FLAGS}" ${PCH_HEADER} ${PCH_SOURCE} ${PCH_HEADER_OUT}) - SET_TARGET_PROPERTIES( - ${TARGET_NAME} PROPERTIES - COMPILE_FLAGS "-include-pch ${PCH_HEADER_OUT}" - ) + GENERATE_CXX_PCH_COMMAND("${TARGET_NAME_LIST}" "${INCLUDE_FLAGS}" ${PCH_HEADER} ${PCH_SOURCE} ${PCH_HEADER_OUT}) + + FOREACH(TARGET_NAME ${TARGET_NAME_LIST}) + SET_TARGET_PROPERTIES( + ${TARGET_NAME} PROPERTIES + COMPILE_FLAGS "-include-pch ${PCH_HEADER_OUT}" + ) + ENDFOREACH() ENDFUNCTION(ADD_CXX_PCH_CLANG) -FUNCTION(ADD_CXX_PCH_MSVC TARGET_NAME PCH_HEADER PCH_SOURCE) +FUNCTION(ADD_CXX_PCH_MSVC TARGET_NAME_LIST PCH_HEADER PCH_SOURCE) GET_COMMON_PCH_PARAMS(${PCH_HEADER} "pch" "/I") - SET_TARGET_PROPERTIES( - ${TARGET_NAME} PROPERTIES - COMPILE_FLAGS "/FI${PCH_HEADER_NAME} /Yu${PCH_HEADER_NAME}" - ) + + FOREACH(TARGET_NAME ${TARGET_NAME_LIST}) + SET_TARGET_PROPERTIES( + ${TARGET_NAME} PROPERTIES + COMPILE_FLAGS "/FI${PCH_HEADER_NAME} /Yu${PCH_HEADER_NAME}" + ) + ENDFOREACH() + SET_SOURCE_FILES_PROPERTIES( ${PCH_SOURCE} PROPERTIES COMPILE_FLAGS "/Yc${PCH_HEADER_NAME}" ) ENDFUNCTION(ADD_CXX_PCH_MSVC) -FUNCTION(ADD_CXX_PCH TARGET_NAME PCH_HEADER PCH_SOURCE) - IF (MSVC) - ADD_CXX_PCH_MSVC(${TARGET_NAME} ${PCH_HEADER} ${PCH_SOURCE}) - ELSEIF ("${CMAKE_GENERATOR}" MATCHES "Xcode") - SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES +FUNCTION(ADD_CXX_PCH_XCODE TARGET_NAME_LIST PCH_HEADER PCH_SOURCE) + FOREACH(TARGET_NAME ${TARGET_NAME_LIST}) + SET_TARGET_PROPERTIES("${TARGET_NAME}" PROPERTIES XCODE_ATTRIBUTE_GCC_PRECOMPILE_PREFIX_HEADER YES XCODE_ATTRIBUTE_GCC_PREFIX_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/${PCH_HEADER}" ) + ENDFOREACH() +ENDFUNCTION(ADD_CXX_PCH_XCODE) + +FUNCTION(ADD_CXX_PCH TARGET_NAME_LIST PCH_HEADER PCH_SOURCE) + IF (MSVC) + ADD_CXX_PCH_MSVC("${TARGET_NAME_LIST}" ${PCH_HEADER} ${PCH_SOURCE}) + ELSEIF ("${CMAKE_GENERATOR}" MATCHES "Xcode") + ADD_CXX_PCH_XCODE("${TARGET_NAME_LIST}" ${PCH_HEADER} ${PCH_SOURCE}) ELSEIF ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") - ADD_CXX_PCH_CLANG(${TARGET_NAME} ${PCH_HEADER} ${PCH_SOURCE}) + ADD_CXX_PCH_CLANG("${TARGET_NAME_LIST}" ${PCH_HEADER} ${PCH_SOURCE}) ELSEIF ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU") - ADD_CXX_PCH_GCC(${TARGET_NAME} ${PCH_HEADER} ${PCH_SOURCE}) + ADD_CXX_PCH_GCC("${TARGET_NAME_LIST}" ${PCH_HEADER} ${PCH_SOURCE}) ENDIF () ENDFUNCTION(ADD_CXX_PCH) diff --git a/issue_template.md b/issue_template.md new file mode 100644 index 00000000000..87f2e21af41 --- /dev/null +++ b/issue_template.md @@ -0,0 +1,23 @@ +**Description**: + +**Current behaviour**: Tell us what happens + +**Expected behaviour**: Tell us what should happen instead + +**Steps to reproduce the problem**: + +1. +2. +3. + +**Branch(es)**: 335/6x + +**TC hash/commit**: + +**TDB version**: + +**Operating system**: + + +[//]: # (This template is for problem reports, for other type of reports edit it accordingly) +[//]: # (If this is a crash report, include the crashlog with https://gist.github.com/) diff --git a/pull_request_template.md b/pull_request_template.md new file mode 100644 index 00000000000..7438ed561cf --- /dev/null +++ b/pull_request_template.md @@ -0,0 +1,13 @@ +**Changes proposed**: + +- +- +- + +**Target branch(es)**: 335/6x + +**Issues addressed**: Fixes # + +**Tests performed**: (Does it build? Tested in-game?) + +**Known issues and TODO list**: diff --git a/revision_data.h.in.cmake b/revision_data.h.in.cmake index 64c754c700b..2e2fe2c318c 100644 --- a/revision_data.h.in.cmake +++ b/revision_data.h.in.cmake @@ -3,7 +3,9 @@ #define _HASH "@rev_hash@" #define _DATE "@rev_date@" #define _BRANCH "@rev_branch@" + #define _CMAKE_COMMAND "@CMAKE_COMMAND@" #define _SOURCE_DIRECTORY "@CMAKE_SOURCE_DIR@" + #define _BUILD_DIRECTORY "@BUILDDIR@" #define _MYSQL_EXECUTABLE "@MYSQL_EXECUTABLE@" #define _FULL_DATABASE "TDB_full_world_335.60_2015_11_07.sql" #define VER_COMPANYNAME_STR "TrinityCore Developers" @@ -12,6 +14,4 @@ #define VER_FILEVERSION_STR "@rev_hash@ @rev_date@ (@rev_branch@ branch)" #define VER_PRODUCTVERSION VER_FILEVERSION #define VER_PRODUCTVERSION_STR VER_FILEVERSION_STR - #define COMPILER_C_FLAGS "@CMAKE_C_FLAGS@" - #define COMPILER_CXX_FLAGS "@CMAKE_CXX_FLAGS@" #endif // __REVISION_DATA_H__ diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql index 69c6c990e1e..02061aaf976 100644 --- a/sql/base/characters_database.sql +++ b/sql/base/characters_database.sql @@ -783,6 +783,7 @@ CREATE TABLE `character_instance` ( `guid` int(10) unsigned NOT NULL DEFAULT '0', `instance` int(10) unsigned NOT NULL DEFAULT '0', `permanent` tinyint(3) unsigned NOT NULL DEFAULT '0', + `extendState` TINYINT(2) UNSIGNED NOT NULL DEFAULT '1', PRIMARY KEY (`guid`,`instance`), KEY `instance` (`instance`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; @@ -2539,7 +2540,7 @@ CREATE TABLE `updates` ( LOCK TABLES `updates` WRITE; /*!40000 ALTER TABLE `updates` DISABLE KEYS */; -INSERT INTO `updates` VALUES ('2015_03_20_00_characters.sql','B761760804EA73BD297F296C5C1919687DF7191C','ARCHIVED','2015-03-21 21:44:15',0),('2015_03_20_01_characters.sql','894F08B70449A5481FFAF394EE5571D7FC4D8A3A','ARCHIVED','2015-03-21 21:44:15',0),('2015_03_20_02_characters.sql','97D7BE0CAADC79F3F11B9FD296B8C6CD40FE593B','ARCHIVED','2015-03-21 21:44:51',0),('2015_06_26_00_characters_335.sql','C2CC6E50AFA1ACCBEBF77CC519AAEB09F3BBAEBC','ARCHIVED','2015-07-13 23:49:22',0),('2015_09_28_00_characters_335.sql','F8682A431D50E54BDC4AC0E7DBED21AE8AAB6AD4','ARCHIVED','2015-09-28 21:00:00',0),('2015_08_26_00_characters_335.sql','C7D6A3A00FECA3EBFF1E71744CA40D3076582374','ARCHIVED','2015-08-26 21:00:00',0),('2015_10_06_00_characters.sql','16842FDD7E8547F2260D3312F53EFF8761EFAB35','ARCHIVED','2015-10-06 16:06:38',0),('2015_10_07_00_characters.sql','E15AB463CEBE321001D7BFDEA4B662FF618728FD','ARCHIVED','2015-10-07 23:32:00',0),('2015_10_12_00_characters.sql','D6F9927BDED72AD0A81D6EC2C6500CBC34A39FA2','ARCHIVED','2015-10-12 15:35:47',0),('2015_10_28_00_characters.sql','622A9CA8FCE690429EBE23BA071A37C7A007BF8B','ARCHIVED','2015-10-19 14:32:22',0),('2015_10_29_00_characters_335.sql','4555A7F35C107E54C13D74D20F141039ED42943E','ARCHIVED','2015-10-29 17:05:43',0),('2015_11_03_00_characters.sql','CC045717B8FDD9733351E52A5302560CD08AAD57','ARCHIVED','2015-10-12 15:23:33',0),('2015_11_07_00_characters.sql','BAF9F6B8F97A30D04BDBBA8127A62A1720F9B904','RELEASED','2015-11-07 15:40:47',0); +INSERT INTO `updates` VALUES ('2015_03_20_00_characters.sql','B761760804EA73BD297F296C5C1919687DF7191C','ARCHIVED','2015-03-21 21:44:15',0),('2015_03_20_01_characters.sql','894F08B70449A5481FFAF394EE5571D7FC4D8A3A','ARCHIVED','2015-03-21 21:44:15',0),('2015_03_20_02_characters.sql','97D7BE0CAADC79F3F11B9FD296B8C6CD40FE593B','ARCHIVED','2015-03-21 21:44:51',0),('2015_06_26_00_characters_335.sql','C2CC6E50AFA1ACCBEBF77CC519AAEB09F3BBAEBC','ARCHIVED','2015-07-13 23:49:22',0),('2015_09_28_00_characters_335.sql','F8682A431D50E54BDC4AC0E7DBED21AE8AAB6AD4','ARCHIVED','2015-09-28 21:00:00',0),('2015_08_26_00_characters_335.sql','C7D6A3A00FECA3EBFF1E71744CA40D3076582374','ARCHIVED','2015-08-26 21:00:00',0),('2015_10_06_00_characters.sql','16842FDD7E8547F2260D3312F53EFF8761EFAB35','ARCHIVED','2015-10-06 16:06:38',0),('2015_10_07_00_characters.sql','E15AB463CEBE321001D7BFDEA4B662FF618728FD','ARCHIVED','2015-10-07 23:32:00',0),('2015_10_12_00_characters.sql','D6F9927BDED72AD0A81D6EC2C6500CBC34A39FA2','ARCHIVED','2015-10-12 15:35:47',0),('2015_10_28_00_characters.sql','622A9CA8FCE690429EBE23BA071A37C7A007BF8B','ARCHIVED','2015-10-19 14:32:22',0),('2015_10_29_00_characters_335.sql','4555A7F35C107E54C13D74D20F141039ED42943E','ARCHIVED','2015-10-29 17:05:43',0),('2015_11_03_00_characters.sql','CC045717B8FDD9733351E52A5302560CD08AAD57','ARCHIVED','2015-10-12 15:23:33',0),('2015_11_07_00_characters.sql','BAF9F6B8F97A30D04BDBBA8127A62A1720F9B904','RELEASED','2015-11-07 15:40:47',0),('2016_02_10_00_characters.sql','F1B4DA202819CABC7319A4470A2D224A34609E97','RELEASED','2016-02-10 00:00:00',0); /*!40000 ALTER TABLE `updates` ENABLE KEYS */; UNLOCK TABLES; diff --git a/sql/updates/characters/2016_02_10_00_characters.sql b/sql/updates/characters/2016_02_10_00_characters.sql new file mode 100644 index 00000000000..d49ed155bc8 --- /dev/null +++ b/sql/updates/characters/2016_02_10_00_characters.sql @@ -0,0 +1,2 @@ +-- extend=0 is expired, extend=1 is normal, extend=2 is extended +ALTER TABLE `character_instance` ADD COLUMN `extendState` TINYINT(2) UNSIGNED NOT NULL DEFAULT '1'; diff --git a/sql/updates/world/2016_02_09_01_world.sql b/sql/updates/world/2016_02_09_01_world.sql new file mode 100644 index 00000000000..7878ea7faa2 --- /dev/null +++ b/sql/updates/world/2016_02_09_01_world.sql @@ -0,0 +1,211 @@ +-- Razorfen Kraul (Update SAI) +-- Razorfen Handler + +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=4530; +DELETE FROM `smart_scripts` WHERE `entryorguid`=4530; +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 +(4530, 0, 0, 0, 9, 0, 100, 0, 0, 30, 2300, 3900, 11, 6660, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Razorfen Handler - Within 0-30 Range - Cast \'Shoot\''); + +-- Razorfen Quilguard + +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=4436; +DELETE FROM `smart_scripts` WHERE `entryorguid`=4436 AND `id` IN (1, 2); +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 +(4436, 0, 1, 0, 4, 0, 100, 1, 0, 0, 0, 0, 11, 8258, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Razorfen Quilguard - On Aggro - Cast \'Devotion Aura\''), +(4436, 0, 2, 0, 0, 0, 100, 0, 4000, 8000, 12000, 16000, 11, 15548, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Razorfen Quilguard - In Combat - Cast \'Thunderclap\''); + +-- Razorfen Geomancer + +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=4520; +DELETE FROM `smart_scripts` WHERE `entryorguid`=4520 AND `id` IN (0, 1); +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 +(4520, 0, 0, 0, 0, 0, 100, 0, 0, 0, 3400, 4800, 11, 9532, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Razorfen Geomancer - In Combat CMC - Cast \'Lightning Bolt\''), +(4520, 0, 1, 0, 25, 0, 100, 0, 0, 0, 0, 0, 11, 8270, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Razorfen Geomancer - On Reset - Cast to summon Earth Rumbler'); + +-- Razorfen Defender + +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=4442; +DELETE FROM `smart_scripts` WHERE `entryorguid`=4442 AND `id` IN (0, 1, 2); +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 +(4442, 0, 0, 0, 0, 0, 100, 1, 1000, 1000, 180000, 180000, 11, 7164, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Razorfen Defender - In Combat - Cast \'Defensive Stance\''), +(4442, 0, 1, 0, 0, 0, 100, 0, 6000, 11000, 19000, 25000, 11, 11972, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Razorfen Defender - In Combat - Cast \'Shield Bash\''), +(4442, 0, 2, 0, 0, 0, 100, 0, 2000, 5000, 12000, 15000, 11, 3248, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Razorfen Defender - In Combat - Cast \'Improved Blocking\''); + +-- Death's Head Adept + +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=4516; +DELETE FROM `smart_scripts` WHERE `entryorguid`=4516; +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 +(4516, 0, 0, 0, 0, 0, 100, 2, 0, 0, 2400, 3800, 11, 9672, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Death\'s Head Adept - In Combat CMC - Cast \'Frostbolt\''), +(4516, 0, 1, 0, 0, 0, 100, 2, 3000, 6000, 10000, 15000, 11, 113, 1, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 'Death\'s Head Adept - In Combat - Cast \'Chains of Ice\' '), +(4516, 0, 2, 0, 2, 0, 100, 3, 0, 15, 0, 0, 25, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Death\'s Head Adept - Between 0-15% Health - Flee For Assist (No Repeat)'); + +-- Razorfen Groundshaker + +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=4523; +DELETE FROM `smart_scripts` WHERE `entryorguid`=4523; +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 +(4523, 0, 0, 0, 0, 0, 100, 0, 7700, 14500, 11000, 26300, 11, 6524, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Razorfen Groundshaker - In Combat - Cast \'Ground Tremor\''), +(4523, 0, 1, 0, 0, 0, 100, 0, 3000, 6000, 10000, 15000, 11, 8046, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Razorfen Groundshaker - In Combat - Cast \'Earth Shock\''); + +-- Razorfen Beastmaster + +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=4532; +DELETE FROM `smart_scripts` WHERE `entryorguid`=4532; +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 +(4532, 0, 0, 0, 9, 0, 100, 0, 0, 30, 2300, 3900, 11, 6660, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Razorfen Beastmaster - Within 0-30 Range - Cast \'Shoot\''), +(4532, 0, 1, 0, 25, 0, 100, 0, 0, 0, 0, 0, 11, 8276, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Razorfen Beastmaster - On Reset - Cast to summon Tamed Hyena'), +(4532, 0, 2, 0, 9, 0, 100, 1, 0, 30, 4000, 6000, 11, 8275, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Razorfen Beastmaster - Within 0-30 Range - Cast \'Poisoned Shot\'(No Repeat)'); + + -- Razorfen Dustweaver + +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=4522; +DELETE FROM `smart_scripts` WHERE `entryorguid`=4522; +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 +(4522, 0, 0, 0, 0, 0, 100, 0, 12000, 12000, 28000, 28000, 11, 6728, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Razorfen Dustweaver - In Combat - Cast \'Enveloping Winds\''); + +-- Razorfen Beast Trainer + +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=4531; +DELETE FROM `smart_scripts` WHERE `entryorguid`=4531; +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 +(4531, 0, 0, 0, 0, 0, 100, 0, 0, 30, 2300, 3900, 11, 6660, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Razorfen Beast Trainer - Within 0-30 Range - Cast \'Shoot\''), +(4531, 0, 1, 0, 0, 0, 100, 0, 0, 30, 4000, 6000, 11, 6984, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Razorfen Beast Trainer - Within 0-30 Range - Cast \'Frost Shot\''); + +-- Aggem Thorncurse <Death's Head Prophet> + +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=4424; +DELETE FROM `smart_scripts` WHERE `entryorguid`=4424; +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 +(4424, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 9128, 32, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Aggem Thorncurse - In Combat - Cast \'Battle Shout\''), +(4424, 0, 1, 0, 0, 0, 100, 0, 10000, 10000, 26000, 26000, 11, 8286, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Aggem Thorncurse - In Combat - Cast \'Summon Boar Spirit\''); + +-- Razorfen Totemic + +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=4440; +DELETE FROM `smart_scripts` WHERE `entryorguid`=4440; +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 +(4440, 0, 0, 0, 0, 0, 100, 0, 6000, 6000, 30000, 30000, 11, 4971, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Razorfen Totemic - In Combat - Cast \'Healing Ward\' (No Repeat)'), +(4440, 0, 1, 0, 0, 0, 100, 0, 4000, 4000, 32000, 32000, 11, 8376, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Razorfen Totemic - In Combat - Cast \'Earthgrab Totem\''); + +-- Death Speaker Jargba + +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=4428; +DELETE FROM `smart_scripts` WHERE `entryorguid`=4428; +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 +(4428, 0, 0, 0, 0, 0, 100, 2, 0, 0, 2400, 3800, 11, 9613, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Death Speaker Jargba - In Combat CMC - Cast \'Shadow Bolt\''), +(4428, 0, 1, 0, 0, 0, 100, 2, 7000, 10000, 10000, 15000, 11, 14515, 1, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 'Death Speaker Jargba - In Combat - Cast \'Dominate Mind\''); + +-- Quilguard Champion + +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=4623; +DELETE FROM `smart_scripts` WHERE `entryorguid`=4623; +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 +(4623, 0, 0, 0, 4, 0, 100, 1, 0, 0, 0, 0, 11, 8258, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Quilguard Champion - On Aggro - Cast \'Devotion Aura\''), +(4623, 0, 1, 0, 0, 0, 100, 1, 1000, 1000, 180000, 180000, 11, 7164, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Quilguard Champion - In Combat - Cast \'Defensive Stance\''), +(4623, 0, 2, 0, 0, 0, 100, 0, 2000, 10000, 6000, 15000, 11, 15572, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Quilguard Champion - In Combat - Cast \'Sunder Armor\'(No Repeat)'); + +-- Overlord Ramtusk + +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=4420; +DELETE FROM `smart_scripts` WHERE `entryorguid`=4420 AND `id` IN (1, 2); +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 (4420, 0, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 9128, 32, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Overlord Ramtusk - In Combat - Cast \'Battle Shout\''), +(4420, 0, 2, 0, 0, 0, 100, 0, 4000, 8000, 12000, 16000, 11, 15548, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Overlord Ramtusk - In Combat - Cast \'Thunderclap\''); + +-- Razorfen Earthbreaker + +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=4525; +DELETE FROM `smart_scripts` WHERE `entryorguid`=4525; +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 (4525, 0, 0, 0, 0, 0, 100, 0, 7700, 14500, 11000, 26300, 11, 8272, 32, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Razorfen Groundshaker - In Combat - Cast \'Mind Tremor\''), +(4525, 0, 1, 0, 0, 0, 100, 0, 3000, 6000, 10000, 15000, 11, 8046, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Razorfen Groundshaker - In Combat - Cast \'Earth Shock\''); + +-- Kraul Bat + +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=4538; +DELETE FROM `smart_scripts` WHERE `entryorguid`=4538; +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 +(4538, 0, 0, 0, 0, 0, 100, 0, 5000, 8000, 10000, 12000, 11, 12553, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Kraul Bat - In Combat - Cast \'Shock\''); + +-- Ward Guardian + +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=4427; +DELETE FROM `smart_scripts` WHERE `entryorguid`=4427; +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 +(4427, 0, 0, 0, 14, 0, 100, 0, 500, 40, 10000, 12000, 11, 959, 1, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Ward Guardian - Friendly At 500 Health - Cast \'Healing Wave\''), +(4427, 0, 1, 0, 9, 0, 100, 0, 0, 35, 3400, 4800, 11, 8400, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Ward Guardian - Within 0-35 Range - Cast \'Fireball\''); + +-- Agathelos the Raging + +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=4422; +DELETE FROM `smart_scripts` WHERE `entryorguid`=4422; +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 +(4422, 0, 0, 0, 0, 0, 100, 0, 5000, 8000, 12000, 14000, 11, 8285, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Agathelos the Raging - In Combat - Cast \'Rampage\''); + +-- Death's Head Priest + +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=4517; +DELETE FROM `smart_scripts` WHERE `entryorguid`=4517; +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 +(4517, 0, 0, 0, 1, 0, 100, 2, 1000, 1000, 1800000, 1800000, 11, 1245, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Death\'s Head Priest - Out of Combat - Cast \'Power Word: Fortitude\''), +(4517, 0, 1, 0, 0, 0, 100, 2, 0, 0, 2400, 3800, 11, 9613, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Death\'s Head Priest - In Combat CMC - Cast \'Shadow Bolt\' (No Repeat)'), +(4517, 0, 2, 0, 2, 0, 100, 2, 0, 40, 14000, 20000, 11, 6063, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Death\'s Head Priest - Between 0-40% Health - Cast \'Heal\' (Normal Dungeon)'), +(4517, 0, 3, 0, 2, 0, 100, 3, 0, 15, 0, 0, 25, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Death\'s Head Priest - Between 0-15% Health - Flee For Assist (No Repeat)'); + +-- Razorfen Warden + +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=4437; +DELETE FROM `smart_scripts` WHERE `entryorguid`=4437; +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 +(4437, 0, 0, 0, 0, 0, 100, 0, 3500, 7500, 20100, 33400, 11, 6533, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Razorfen Warden - In Combat - Cast \'Net\' (No Repeat)'); + +-- Raging Agam'ar + +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=4514; +DELETE FROM `smart_scripts` WHERE `entryorguid`=4514; +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 +(4514, 0, 0, 0, 2, 0, 100, 1, 0, 50, 0, 0, 11, 8269, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Raging Agam\'ar - Between 0-50% Health - Cast \'Frenzy\''); + +-- Agam'ar + +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=4511; +DELETE FROM `smart_scripts` WHERE `entryorguid`=4511; +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 +(4511, 0, 0, 0, 4, 0, 15, 1, 0, 0, 0, 0, 11, 6268, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Agam\'ar - On Aggro - Cast \'Rushing Charge\' (No Repeat)'); + +-- Blood of Agamaggan + +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=4541; +DELETE FROM `smart_scripts` WHERE `entryorguid`=4541; +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 +(4541, 0, 0, 0, 0, 0, 100, 0, 5000, 9000, 15000, 25000, 11, 8282, 32, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Blood of Agamaggan - In Combat - Cast \'Curse of Blood\''); + +-- Roogug + +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=6168; +DELETE FROM `smart_scripts` WHERE `entryorguid`=6168; +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 +(6168, 0, 0, 0, 0, 0, 100, 0, 0, 40, 3700, 7500, 11, 9532, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Roogug - In Combat CMC - Cast \'Lightning Bolt\''), +(6168, 0, 1, 0, 0, 0, 100, 0, 0, 30, 6000, 8000, 11, 943, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Roogug - In Combat - Cast \'Lightning Bolt\''); + +-- Charlga Razorflank <The Crone> SAI +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=4421; +DELETE FROM `smart_scripts` WHERE `entryorguid`=4421 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 +(4421, 0, 0, 0, 4, 0, 100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Charlga Razorflank - On Aggro - Yell Line 0'), +(4421, 0, 1, 0, 5, 0, 100, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Charlga Razorflank - On Killed Unit - Yell Line 1'), +(4421, 0, 2, 0, 2, 0, 100, 1, 0, 75, 0, 0, 1, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Charlga Razorflank - Between 0-75% Health - Yell Line 2''(No Repeat)'), +(4421, 0, 3, 0, 2, 0, 100, 1, 0, 50, 0, 0, 1, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Charlga Razorflank - Between 0-50% Health - Yell Line 3''(No Repeat)'), +(4421, 0, 4, 0, 2, 0, 100, 1, 0, 25, 0, 0, 1, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Charlga Razorflank - Between 0-25% Health - Yell Line 4''(No Repeat)'), +(4421, 0, 5, 0, 0, 0, 100, 0, 0, 0, 78000, 78000, 11, 8361, 32, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Charlga Razorflank - In combat - Cast \'Purity\''), +(4421, 0, 6, 0, 2, 0, 100, 0, 0, 80, 15000, 18000, 11, 6077, 32, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Charlga Razorflank - Between 0-80% Health - Cast \'Renew\''), +(4421, 0, 7, 0, 0, 0, 100, 0, 6000, 6000, 8000, 8000, 11, 8292, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Charlga Razorflank - In Combat - Cast \'Chain Bolt\''), +(4421, 0, 8, 0, 3, 0, 100, 0, 0, 5, 0, 0, 11, 8358, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Charlga Razorflank - Between 0-5% Mana - Cast \'Mana Spike\''); + +DELETE FROM `creature_text` WHERE `entry`= 4421 AND `groupid` IN (0, 1, 2, 3, 4); +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`BroadcastTextId`,`TextRange`,`comment`) VALUES +(4421,0,0,"Troublesome whelps. I'll teach you to interfere!", 14,0,100,0,0,0,6179,3,'Charlga Razorflank - on initial aggro'), +(4421,1,0,"Who's next?", 14,0,100,0,0,0,6180,3,'Charlga Razorflank - killing a player'), +(4421,2,0,"You outsiders will pay for encroaching on our land!",14,0,100,0,0,0,6181,3,'Charlga Razorflank - on 75% hp reached'), +(4421,3,0,"Bah! My power rules here!", 14,0,100,0,0,0,6182,3,'Charlga Razorflank - on 50% hp reached'), +(4421,4,0,"Our new allies will avenge us!", 14,0,100,0,0,0,6183,3,'Charlga Razorflank - on 25% hp reached'); diff --git a/sql/updates/world/2016_02_09_02_world.sql b/sql/updates/world/2016_02_09_02_world.sql new file mode 100644 index 00000000000..891c8c2ff4b --- /dev/null +++ b/sql/updates/world/2016_02_09_02_world.sql @@ -0,0 +1,21 @@ +-- Sunblade Mage Guard SAI +SET @ENTRY := 24683; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY 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 +(@ENTRY,0,0,1,1,0,100,0,0,0,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sunblade Mage Guard - Out of Combat - Disable Combat Movement"), +(@ENTRY,0,1,0,61,0,100,0,0,0,0,0,20,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sunblade Mage Guard - Out of Combat - Stop Attacking"), +(@ENTRY,0,2,0,0,0,100,7,0,0,0,0,11,44475,1,0,0,0,0,1,0,0,0,0,0,0,0,"Sunblade Mage Guard - In Combat - Cast 'Magic Dampening Field' (No Repeat) (Dungeon)"), +(@ENTRY,0,3,4,9,0,100,0,0,60,5000,5000,11,44478,0,0,0,0,0,2,0,0,0,0,0,0,0,"Sunblade Mage Guard - Within 0-60 Range - Cast 'Glaive Throw'"), +(@ENTRY,0,4,0,61,0,100,0,0,60,5000,5000,40,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sunblade Mage Guard - Within 0-60 Range - Set Sheath Ranged"), +(@ENTRY,0,5,6,9,0,100,0,45,80,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sunblade Mage Guard - Within 45-80 Range - Enable Combat Movement"), +(@ENTRY,0,6,0,61,0,100,0,45,80,0,0,20,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sunblade Mage Guard - Within 45-80 Range - Start Attacking"), +(@ENTRY,0,7,0,9,0,100,0,0,5,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sunblade Mage Guard - Within 0-5 Range - Enable Combat Movement"), +(@ENTRY,0,8,9,9,0,100,0,0,0,0,0,40,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sunblade Mage Guard - Within 0-0 Range - Set Sheath Melee"), +(@ENTRY,0,9,0,61,0,100,0,0,0,0,0,20,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sunblade Mage Guard - Within 0-0 Range - Start Attacking"), +(@ENTRY,0,10,11,9,0,100,0,5,20,0,0,21,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sunblade Mage Guard - Within 5-20 Range - Disable Combat Movement"), +(@ENTRY,0,11,0,61,0,100,0,5,20,0,0,20,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sunblade Mage Guard - Within 5-20 Range - Stop Attacking"), +(@ENTRY,0,12,0,2,0,100,7,0,15,0,0,23,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sunblade Mage Guard - Between 0-15% Health - Increment Phase (No Repeat) (Dungeon)"), +(@ENTRY,0,13,14,2,0,100,1,0,15,0,0,21,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sunblade Mage Guard - Between 0-15% Health - Enable Combat Movement (No Repeat)"), +(@ENTRY,0,14,0,61,0,100,1,0,15,0,0,25,1,0,0,0,0,0,7,0,0,0,0,0,0,0,"Sunblade Mage Guard - Between 0-15% Health - Flee For Assist (No Repeat)"), +(@ENTRY,0,15,0,7,0,100,0,0,0,0,0,40,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Sunblade Mage Guard - On Evade - Set Sheath Melee"); diff --git a/sql/updates/world/2016_02_09_02_world_335.sql b/sql/updates/world/2016_02_09_02_world_335.sql new file mode 100644 index 00000000000..a8612c5d88d --- /dev/null +++ b/sql/updates/world/2016_02_09_02_world_335.sql @@ -0,0 +1,29 @@ +-- move script 'npc_myranda_the_hag' to SAI (PR #16438) +UPDATE `gossip_menu_option` SET `option_id`=1 WHERE `menu_id`=3801; +DELETE FROM `gossip_menu` WHERE `entry`=3801 AND `text_id`=4773; +INSERT INTO `gossip_menu` (`entry`, `text_id`) VALUES +(3801, 4773); + +UPDATE `creature_template` SET `AIName`='SmartAI', `ScriptName`='' WHERE `entry`=11872; +DELETE FROM `smart_scripts` WHERE `entryorguid`=11872 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 +(11872, 0, 0, 1, 62, 0, 100, 0, 3801, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Myranda the Hag - On Gossip Option 0 Selected - Close Gossip'), +(11872, 0, 1, 0, 61, 0, 100, 0, 3801, 0, 0, 0, 85, 17961, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Myranda the Hag - On Gossip Option 0 Selected - Invoker Cast \'Scarlet Illusion\''); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=3801; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=3801; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(15, 3801, 0, 0, 0, 28, 0, 5862, 0, 0, 0, 0, 0, '', 'Only show gossip menu option if quest \'Scarlet Subterfuge\' is complete'), +(15, 3801, 0, 0, 0, 28, 0, 5944, 0, 0, 1, 0, 0, '', 'Only show gossip menu option if quest \'In Dreams\' is not complete'), +(15, 3801, 0, 0, 0, 8, 0, 5944, 0, 0, 1, 0, 0, '', 'Only show gossip menu option if quest \'In Dreams\' is not rewarded'), +(15, 3801, 0, 0, 0, 1, 0, 17961, 0, 0, 1, 0, 0, '', 'Only show gossip menu option if no \'Scarlet Illusion\' Aura'), +(15, 3801, 0, 0, 1, 8, 0, 5862, 0, 0, 0, 0, 0, '', 'Only show gossip menu option if quest \'Scarlet Subterfuge\' is rewarded'), +(15, 3801, 0, 0, 1, 28, 0, 5944, 0, 0, 1, 0, 0, '', 'Only show gossip menu option if quest \'In Dreams\' is not complete'), +(15, 3801, 0, 0, 1, 8, 0, 5944, 0, 0, 1, 0, 0, '', 'Only show gossip menu option if quest \'In Dreams\' is not rewarded'), +(15, 3801, 0, 0, 1, 1, 0, 17961, 0, 0, 1, 0, 0, '', 'Only show gossip menu option if no \'Scarlet Illusion\' Aura'), +(14, 3801, 4773, 0, 0, 28, 0, 5862, 0, 0, 0, 0, 0, '', 'Only show text if quest \'Scarlet Subterfuge\' is complete'), +(14, 3801, 4773, 0, 0, 28, 0, 5944, 0, 0, 1, 0, 0, '', 'Only show text if quest \'In Dreams\' is not complete'), +(14, 3801, 4773, 0, 0, 8, 0, 5944, 0, 0, 1, 0, 0, '', 'Only show text if quest \'In Dreams\' is not rewarded'), +(14, 3801, 4773, 0, 1, 8, 0, 5862, 0, 0, 0, 0, 0, '', 'Only show text if quest \'Scarlet Subterfuge\' is rewarded'), +(14, 3801, 4773, 0, 1, 28, 0, 5944, 0, 0, 1, 0, 0, '', 'Only show text if quest \'In Dreams\' is not complete'), +(14, 3801, 4773, 0, 1, 8, 0, 5944, 0, 0, 1, 0, 0, '', 'Only show text if quest \'In Dreams\' is not rewarded'); diff --git a/sql/updates/world/2016_02_09_03_world.sql b/sql/updates/world/2016_02_09_03_world.sql new file mode 100644 index 00000000000..bd012f0d172 --- /dev/null +++ b/sql/updates/world/2016_02_09_03_world.sql @@ -0,0 +1,124 @@ +-- +-- DB/Quest: Translation to Ello +DELETE FROM `waypoints` WHERE `entry`=412; +INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`) VALUES +(412, 1, -10290.1, 73.7148, 38.849), +(412, 2, -10290.4, 81.547, 38.7702), +(412, 3, -10283.2, 86.6661, 38.7694), +(412, 4, -10271.1, 83.5772, 39.1122), +(412, 5, -10266, 76.0585, 39.4047), +(412, 6, -10272.4, 65.7703, 39.524), +(412, 7, -10283.4, 59.1681, 40.6902), +(412, 8, -10300.2, 45.8306, 47.3053), +(412, 9, -10315.3, 45.1015, 48.0097), +(412, 10, -10324.4, 38.7441, 47.3935), +(412, 11, -10330.2, 27.0829, 50.5753), +(412, 12, -10335.3, 13.4164, 50.1259), +(412, 13, -10342.2, 3.3501, 51.1675), +(412, 14, -10354.6, -13.0266, 47.1154), +(412, 15, -10379.4, -27.1456, 49.2841), +(412, 16, -10401, -30.8108, 48.1353), +(412, 17, -10416.5, -28.4794, 48.4772), +(412, 18, -10436.4, -34.2376, 46.5064), +(412, 19, -10468.7, -38.8985, 48.7035), +(412, 20, -10500.2, -44.6662, 45.882), +(412, 21, -10539.1, -39.3422, 43.0622), +(412, 22, -10568, -35.1434, 37.2048), +(412, 23, -10585.6, -37.5056, 37.4296), +(412, 24, -10606.3, -51.7202, 36.0713), +(412, 25, -10629.2, -64.211, 32.6163), +(412, 26, -10645.9, -73.4561, 32.7337), +(412, 27, -10671, -81.8316, 35.6535), +(412, 28, -10687.6, -85.57, 34.1549), +(412, 29, -10702.8, -89.2772, 37.9242), +(412, 30, -10709.1, -97.5837, 37.892), +(412, 31, -10725.6, -101.348, 34.5892), +(412, 32, -10748, -99.1517, 38.2323), +(412, 33, -10759.9, -93.0657, 38.5876), +(412, 34, -10774.9, -89.8001, 34.8007), +(412, 35, -10788.6, -86.7376, 33.4988), +(412, 36, -10802.7, -88.6347, 29.0679), +(412, 37, -10811.5, -97.1736, 29.2451), +(412, 38, -10821.4, -121.335, 30.142), +(412, 39, -10826.2, -134.391, 31.7845), +(412, 40, -10830.6, -148.284, 31.7985), +(412, 41, -10835.3, -164.201, 33.8299), +(412, 42, -10840.4, -182.63, 34.0254), +(412, 43, -10843.3, -193.104, 35.8227), +(412, 44, -10848.7, -215.175, 37.7986), +(412, 45, -10851.7, -235.779, 38.6853), +(412, 46, -10857.4, -264.019, 38.0974), +(412, 47, -10866.6, -293.454, 37.9429), +(412, 48, -10882.9, -332.562, 37.9688), +(412, 49, -10900, -365.26, 39.4542), +(412, 50, -10904.1, -393.833, 41.0451), +(412, 51, -10905.7, -431.964, 42.7237), +(412, 52, -10908, -461.901, 46.7191), +(412, 53, -10911.2, -510.492, 52.0594), +(412, 54, -10915.1, -533.78, 53.8047), +(412, 55, -10927, -565.685, 54.042), +(412, 56, -10936.5, -581.62, 53.8887), +(412, 57, -10950.1, -597.371, 55.177), +(412, 58, -10957.9, -619.554, 55.0689), +(412, 59, -10958.8, -637.183, 55.2047), +(412, 60, -10954.3, -652.46, 55.4423), +(412, 61, -10931.8, -681.568, 55.3955), +(412, 62, -10916.9, -710.733, 55.6988), +(412, 63, -10902.9, -734.1, 55.1313), +(412, 64, -10878.3, -760.091, 55.5638), +(412, 65, -10851.1, -787.76, 56.1885), +(412, 66, -10831.9, -818.655, 56.2795), +(412, 67, -10825.2, -833.223, 55.5758), +(412, 68, -10808.3, -873.497, 55.9567), +(412, 69, -10796.7, -912.719, 55.8731), +(412, 70, -10796.1, -934.562, 56.2303), +(412, 71, -10800.5, -949.721, 56.5614), +(412, 72, -10807.1, -969.027, 56.2941), +(412, 73, -10806.8, -992.166, 53.8349), +(412, 74, -10804.6, -1030.41, 47.0768), +(412, 75, -10801.3, -1047.26, 44.0233), +(412, 76, -10787.8, -1074.49, 37.7652), +(412, 77, -10783.3, -1095.07, 33.6488), +(412, 78, -10781.2, -1112.66, 30.3863), +(412, 79, -10763.6, -1138.91, 27.0977), +(412, 80, -10738, -1158.02, 26.4475), +(412, 81, -10705.3, -1179.29, 26.3723), +(412, 82, -10682.3, -1190.45, 27.2793), +(412, 83, -10662.5, -1193.06, 28.2884), +(412, 84, -10641.6, -1189.92, 28.5594), +(412, 85, -10615.7, -1182.78, 28.5022), +(412, 86, -10586.8, -1177.32, 28.3931), +(412, 87, -10576.4, -1179.26, 28.1946), +(412, 88, -10566.7, -1189.27, 27.8756), +(412, 89, -10557, -1192.38, 28.0606), +(412, 90, -10550.4, -1185.71, 27.8428), +(412, 91, -10554.4, -1167.97, 27.5984); + +-- Lord Ello Ebonlocke SAI +SET @ENTRY := 263; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY 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 +(@ENTRY,0,0,0,1,0,100,0,20000,30000,120000,120000,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Lord Ello Ebonlocke - Out of Combat - Say Line 0"), +(@ENTRY,0,1,0,20,0,100,0,252,0,0,0,12,412,3,3600000,0,0,0,8,0,0,0,-10290.171875,72.781136,38.881119,4.801499,"Lord Ello Ebonlocke - On Quest 'Translation to Ello' Finished - Summon Creature 'Stitches'"); + +-- Stitches SAI +SET @ENTRY := 412; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY 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 +(@ENTRY,0,0,0,0,0,100,0,6900,12100,3500,11300,11,3106,0,0,0,0,0,2,0,0,0,0,0,0,0,"Stitches - In Combat - Cast 'Aura of Rot'"), +(@ENTRY,0,1,2,54,0,100,0,0,0,0,0,48,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"Stitches - On Just Summoned - Set Active On"), +(@ENTRY,0,2,0,61,0,100,0,0,0,0,0,53,1,412,0,0,0,2,0,0,0,0,0,0,0,0,"Stitches - On Just Summoned - Start Waypoint"), +(@ENTRY,0,3,0,40,0,100,0,47,412,0,0,1,0,0,0,0,0,0,19,468,200,0,0,0,0,0,"Stitches - On Waypoint 47 Reached - Say Line 0"), +(@ENTRY,0,5,6,40,0,100,0,50,412,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Stitches - On Waypoint 50 Reached - Say Line 0"), +(@ENTRY,0,6,0,61,0,100,0,50,412,0,0,1,1,0,0,0,0,0,19,468,200,0,0,0,0,0,"Stitches - On Waypoint 50 Reached - Say Line 1"), +(@ENTRY,0,7,8,40,0,100,0,91,412,0,0,101,0,0,0,0,0,0,1,0,0,0,0,0,0,0,"Stitches - On Waypoint 91 Reached - Set Home Position"), +(@ENTRY,0,8,0,61,0,100,0,91,412,0,0,89,20,0,0,0,0,0,1,0,0,0,0,0,0,0,"Stitches - On Waypoint 91 Reached - Start Random Movement"); + +DELETE FROM `creature_text` WHERE `entry` IN (468, 412); +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `comment`, `BroadcastTextId`) VALUES +(468, 0, 0, 'An abomination of the undead is approaching!', 14, 0, 100, 0, 0, 0, 'Guard', 89), +(468, 1, 0, 'The abomination has overrun the Night Watch camp! Quickly, we must intercept it before it reaches town!', 14, 0, 100, 0, 0, 0, 'Guard', 90), +(412, 0, 0, 'ROARRRRR!!', 14, 0, 100, 0, 0, 0, 'Stitches', 278), +(412, 0, 1, 'DARKSHIRE... I HUNGER!!', 14, 0, 100, 0, 0, 0, 'Stitches', 277); diff --git a/sql/updates/world/2016_02_09_04_world.sql b/sql/updates/world/2016_02_09_04_world.sql new file mode 100644 index 00000000000..015ab519557 --- /dev/null +++ b/sql/updates/world/2016_02_09_04_world.sql @@ -0,0 +1,5 @@ +-- +SET @SPELL_ATTR0_CU_ALLOW_INFLIGHT_TARGET := 262144; +DELETE FROM `spell_custom_attr` WHERE `entry`=43419; +INSERT INTO `spell_custom_attr` (`entry`, `attributes`) VALUES +(43419, @SPELL_ATTR0_CU_ALLOW_INFLIGHT_TARGET); diff --git a/sql/updates/world/2016_02_09_05_world.sql b/sql/updates/world/2016_02_09_05_world.sql new file mode 100644 index 00000000000..3612c270d02 --- /dev/null +++ b/sql/updates/world/2016_02_09_05_world.sql @@ -0,0 +1,62 @@ +-- +-- DB/Quest: Absholutely... Thish Will Work (11330) +SET @Prisoner :=24284; -- Dragonflayer Vrykul Prisoner +SET @PeppysMix :=43386; -- Spell Peppy's Special Mix +SET @WGDefender :=23842; -- Westguard Defender +SET @WGDguid1 :=99009; -- Westguard Defender Guid 1 +SET @WGDguid2 :=99010; -- Westguard Defender Guid 2 +SET @WGDguid3 :=99008; -- Westguard Defender Guid 3 +SET @WGDguid4 :=99013; -- Westguard Defender Guid 4 +SET @WGOfficer :=23844; -- Westguard Officer +SET @WGOguid :=99195; -- Westguard Officer Guid +SET @HumoVerde :=18951; -- Spirit Particles (green) / humo verde +SET @CuerpoVerde:=39168; -- Vertex Color Green / efecto verde +SET @MocoVerde :=28989; -- Plague Slime (Green) / Morph de Moco-Ooze +SET @Crazed :=48147; -- Crazed (enrage) - Only Defender +SET @Defensive :=7164; -- Defensive stance +SET @ImpBlocking:=3639; -- improved blocking +SET @ShieldBash :=11972; -- Shield Bash +SET @Shoot :=6660; -- Shoot +SET @DemorlShout:=16244; -- Demoralizing Shout - Only Officer + +UPDATE `creature_template` SET `ainame`='SmartAI' WHERE `entry` IN (@Prisoner,@WGDefender,@WGOfficer); +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (@Prisoner,@WGDefender,@WGOfficer) AND `source_type`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (@Prisoner*100) AND `source_type`=9; +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 +(@Prisoner,0,0,0,8,0,100,0,@PeppysMix,0,0,0,80,@Prisoner*100,0,0,0,0,0,1,0,0,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - On Spell Hit (Olakin''s Torch) - Run Script'), +(@Prisoner*100,9,0,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - Script - Say'), +(@Prisoner*100,9,1,0,0,0,100,0,3000,3000,0,0,11,@HumoVerde,0,0,0,0,0,1,0,0,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - Script - Cast Spirit Particles (green)'), +(@Prisoner*100,9,2,0,0,0,100,0,1000,1000,0,0,45,1,1,0,0,0,0,10,@WGDguid1,@WGDefender,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - Script - Set Data to Westguard Defender'), +(@Prisoner*100,9,3,0,0,0,100,0,3000,3000,0,0,45,1,1,0,0,0,0,10,@WGDguid3,@WGDefender,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - Script - Set Data to Westguard Defender'), +(@Prisoner*100,9,4,0,0,0,100,0,2000,2000,0,0,11,@CuerpoVerde,0,0,0,0,0,1,0,0,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - Script - Vertex Color Green'), +(@Prisoner*100,9,5,0,0,0,100,0,2000,2000,0,0,45,1,1,0,0,0,0,10,@WGDguid2,@WGDefender,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - Script - Set Data to Westguard Defender'), +(@Prisoner*100,9,6,0,0,0,100,0,3000,3000,0,0,45,1,1,0,0,0,0,10,@WGDguid4,@WGDefender,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - Script - Set Data to Westguard Defender'), +(@Prisoner*100,9,7,0,0,0,100,0,2000,2000,0,0,11,@MocoVerde,0,0,0,0,0,1,0,0,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - Script - Plague Slime (Green)'), +(@Prisoner*100,9,8,0,0,0,100,0,3000,3000,0,0,45,1,1,0,0,0,0,10,@WGOguid,@WGOfficer,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - Script - Set Data to Westguard Defender'), +(@Prisoner*100,9,9,0,0,0,100,0,2000,2000,0,0,33,@Prisoner,0,0,0,0,0,7,0,0,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - Script - Call Killedmonster'), +(@Prisoner*100,9,10,0,0,0,100,0,20000,20000,0,0,28,@HumoVerde,0,0,0,0,0,1,0,0,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - Script - Remove Spirit Particles'), +(@Prisoner*100,9,11,0,0,0,100,0,0,0,0,0,28,@CuerpoVerde,0,0,0,0,0,1,0,0,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - Script - Remove Vertex Color Green'), +(@Prisoner*100,9,12,0,0,0,100,0,0,0,0,0,28,@MocoVerde,0,0,0,0,0,1,0,0,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - Script - Remove Plage Slime'), +(@WGDefender,0,0,0,38,0,100,0,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Westguard Defender - On Data set - Say'), +(@WGDefender,0,1,0,0,0,100,0,5000,15000,20000,40000,11,@Crazed,0,0,0,0,0,1,0,0,0,0,0,0,0,'Westguard Defender - IC - Cast Crazed'), +(@WGDefender,0,2,0,0,0,100,1,500,500,0,0,11,@Defensive,0,0,0,0,0,1,0,0,0,0,0,0,0,'Westguard Defender - IC - Cast Defensive'), +(@WGDefender,0,3,0,0,0,100,0,1000,3000,10400,10400,11,@ImpBlocking,0,0,0,0,0,1,0,0,0,0,0,0,0,'Westguard Defender - IC - Cast Improved Blocking'), +(@WGDefender,0,4,0,0,0,100,0,2000,5000,10000,21000,11,@ShieldBash,0,0,0,0,0,2,0,0,0,0,0,0,0,'Westguard Defender - IC - Cast ShieldBash'), +(@WGDefender,0,5,0,0,0,100,0,0,5000,1000,6000,11,@Shoot,0,0,0,0,0,2,0,0,0,0,0,0,0,'Westguard Defender - IC - Cast Shoot'), +(@WGOfficer,0,0,0,38,0,100,0,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Westguard Officer - On Data set - Say'), +(@WGOfficer,0,1,0,0,0,100,0,10000,15000,20000,30000,11,@DemorlShout,0,0,0,0,0,1,0,0,0,0,0,0,0,'Westguard Officer - IC - Cast Demoralizing Shout'), +(@WGOfficer,0,2,0,0,0,100,1,500,500,0,0,11,@Defensive,0,0,0,0,0,1,0,0,0,0,0,0,0,'Westguard Officer - IC - Cast Defensive'), +(@WGOfficer,0,3,0,0,0,100,0,1000,3000,10400,10400,11,@ImpBlocking,0,0,0,0,0,1,0,0,0,0,0,0,0,'Westguard Officer - IC - Cast Improved Blocking'), +(@WGOfficer,0,4,0,0,0,100,0,2000,5000,8000,21000,11,@ShieldBash,0,0,0,0,0,2,0,0,0,0,0,0,0,'Westguard Officer - IC - Cast ShieldBash'), +(@WGOfficer,0,5,0,0,0,100,0,0,5000,1000,6000,11,@Shoot,0,0,0,0,0,2,0,0,0,0,0,0,0,'Westguard Officer - IC - Cast Shoot'); + +DELETE FROM `creature_text` WHERE `entry` IN (@Prisoner,@WGDefender,@WGOfficer); +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`, `BroadcastTextId`) VALUES +(@Prisoner,0,0,'The vrykul clutches at his throat as he begins to gag and thrash about.',16,0,100,1,0,0,'Dragonflayer Vrykul Prisoner', 23087), +(@WGOfficer,0,0,'Is he okay?',12,0,100,1,0,0,'Westguard Officer - Say', 23105), +(@WGDefender,0,0,'Yikes.',12,0,100,1,0,0,'Westguard Defender - Say', 23104), +(@WGDefender,0,1,'Captain''s not gonna like this.',12,0,100,1,0,0,'Westguard Defender - Say', 23106), +(@WGDefender,0,2,'What kind of sicko are you?',12,0,100,1,0,0,'Westguard Defender - Say', 23095), +(@WGDefender,0,3,'Heh, cool!',12,0,100,1,0,0,'Westguard Defender - Say', 23094), +(@WGDefender,0,4,'That''s the new Forsaken plague?',12,0,100,1,0,0,'Westguard Defender - Say', 23098), +(@WGDefender,0,5,'Oh, sick!',12,0,100,1,0,0,'Westguard Defender - Say', 23091); diff --git a/sql/updates/world/2016_02_09_06_world.sql b/sql/updates/world/2016_02_09_06_world.sql new file mode 100644 index 00000000000..03fe998cca5 --- /dev/null +++ b/sql/updates/world/2016_02_09_06_world.sql @@ -0,0 +1,14 @@ +-- Karazhan Optional Boss spawn +-- Hyakiss the Lurker SAI +SET @ENTRY := 16179; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY 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 +(@ENTRY,0,0,0,0,0,100,0,5000,5000,35000,35000,11,29901,0,0,0,0,0,2,0,0,0,0,0,0,0,"Hyakiss the Lurker - In Combat - Cast 'Acidic Fang'"); + +-- Rokad the Ravager SAI +SET @ENTRY := 16181; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY 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 +(@ENTRY,0,0,0,0,0,100,0,2000,3000,12000,15000,11,29906,0,0,0,0,0,2,0,0,0,0,0,0,0,"Rokad the Ravager - In Combat - Cast 'Ravage'"); diff --git a/sql/updates/world/2016_02_09_07_world.sql b/sql/updates/world/2016_02_09_07_world.sql new file mode 100644 index 00000000000..84d65e2eda5 --- /dev/null +++ b/sql/updates/world/2016_02_09_07_world.sql @@ -0,0 +1,77 @@ +UPDATE `creature_template` SET `ainame`='SmartAI' WHERE `entry` IN(23842,24284); +DELETE FROM `smart_scripts` WHERE `entryorguid` IN(23842,24284) AND `source_type`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid` IN(23844) AND `source_type`=0 AND `id`=0; + +DELETE FROM `smart_scripts` WHERE `entryorguid` IN(2428400,2428401,2384200) AND `source_type`=9; + +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 +(23842,0,0,0,38,0,30,0,1,1,0,0,80,2384200,2,0,0,0,0,1,0,0,0,0,0,0,0,'Westguard Defender - On Data Set - Run Script'), +(23842,0,1,0,0,0,100,0,5000,15000,20000,40000,11,48147,0,0,0,0,0,1,0,0,0,0,0,0,0,'Westguard Defender - IC - Cast Crazed'), +(23842,0,2,0,0,0,100,1,500,500,0,0,11,7164,0,0,0,0,0,1,0,0,0,0,0,0,0,'Westguard Defender - IC - Cast Defensive'), +(23842,0,3,0,0,0,100,0,1000,3000,10400,10400,11,3639,0,0,0,0,0,1,0,0,0,0,0,0,0,'Westguard Defender - IC - Cast Improved Blocking'), +(23842,0,4,0,0,0,100,0,2000,5000,10000,21000,11,11972,0,0,0,0,0,2,0,0,0,0,0,0,0,'Westguard Defender - IC - Cast ShieldBash'), +(23842,0,5,0,0,0,100,0,0,5000,1000,6000,11,6660,0,0,0,0,0,2,0,0,0,0,0,0,0,'Westguard Defender - IC - Cast Shoot'), +(24284,0,0,0,8,0,100,0,43386,0,0,0,80,2428400,2,0,0,0,0,1,0,0,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - On Spell Hit (Peppys Special Mix) - Run Script'), +(24284,0,1,2,40,0,100,0,1,24284,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - On Reached WP1 - Say Line 0'), +(24284,0,2,0,61,0,100,0,0,0,0,0,54,1000,0,0,0,0,0,1,0,0,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - On Reached WP1 - Pause WP'), +(24284,0,3,4,40,0,100,0,9,24284,0,0,11,43401,0,0,0,0,0,1,0,0,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - On Reached WP9 - Cast Cosmetic - Blood Explosion Green - Large'), +(24284,0,4,5,61,0,100,0,0,0,0,0,3,0,1145,0,0,0,0,1,0,0,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - On Reached WP9 - Change displayid to 1145'), +(24284,0,5,0,61,0,100,0,0,0,0,0,22,2,0,0,0,0,0,1,0,0,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - On Reached WP9 - Set Phase 2'), +(24284,0,6,0,1,2,100,1,4000,4000,0,0,80,2428401,2,0,0,0,0,1,0,0,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - OOC (Phase 2) - Run Script'), +(2384200,9,0,0,0,0,100,0,0,0,0,0,66,0,0,0,0,0,0,19,24288,0,0,0,0,0,0,'Westguard Defender - Script - Face Target'), -- 19:36:43.046 +(2384200,9,1,0,0,0,100,0,0,0,0,0,90,8,0,0,0,0,0,1,0,0,0,0,0,0,0,'Westguard Defender - Script - Set Bytes 1'), -- 19:36:43.046 +(2384200,9,2,0,0,0,100,0,1000,1000,0,0,11,43391,0,0,0,0,0,1,0,0,0,0,0,0,0,'Westguard Defender - Script - Cast Vomit'), -- 19:36:44.231 +(2384200,9,3,0,0,0,100,0,9000,9000,0,0,91,8,0,0,0,0,0,1,0,0,0,0,0,0,0,'Westguard Defender - Script - Set Bytes 1'), -- 19:36:53.872 +(2384200,9,4,0,0,0,100,0,0,0,0,0,24,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Westguard Defender - Script - Evade'), +(2428401,9,0,0,0,0,100,0,0,0,0,0,1,1,0,0,0,0,0,10,99027,23842,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - Script 2 - Say'), +(2428401,9,1,0,0,0,100,0,0,0,0,0,1,1,0,0,0,0,0,10,99023,23842,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - Script 2 - Say'), +(2428401,9,2,0,0,0,100,0,0,0,0,0,1,1,0,0,0,0,0,10,99012,23842,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - Script 2 - Say'), +(2428401,9,3,0,0,0,100,0,0,0,0,0,1,1,0,0,0,0,0,10,99010,23842,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - Script 2 - Say'), +(2428401,9,4,0,0,0,100,0,0,0,0,0,1,1,0,0,0,0,0,10,99024,23842,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - Script 2 - Say'), +(2428401,9,5,0,0,0,100,0,0,0,0,0,1,1,0,0,0,0,0,10,99026,23842,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - Script 2 - Say'), +(2428401,9,6,0,0,0,100,0,0,0,0,0,45,1,1,0,0,0,0,9,23842,0,80,0,0,0,0,'Dragonflayer Vrykul Prisoner - Script 2 - Set Data'), +(2428401,9,7,0,0,0,100,0,1000,1000,0,0,37,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - Script 2 - Cast Suicide, No Blood, No Logging'), +(2428400,9,0,0,0,0,100,0,0,0,0,0,5,7,0,0,0,0,0,1,0,0,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - Script - Play Emote (OneShotEat)'), -- 19:36:18.195 +(2428400,9,1,0,0,0,100,0,0,0,0,0,71,0,0,2200,0,0,0,1,0,0,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - Script - Equip item 2200 to Slot 1'), -- 19:36:18.195 +(2428400,9,2,0,0,0,100,0,2800,2800,0,0,11,21862,0,0,0,0,0,1,0,0,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - Script - Cast Radiation'), -- 19:36:20.925 +(2428400,9,3,0,0,0,100,0,0,0,0,0,33,24284,0,0,0,0,0,7,0,0,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - Script - Give Quest Credit'), +(2428400,9,4,0,0,0,100,0,0,0,0,0,71,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - Script - UnEquip item'), -- 19:36:20.925 +(2428400,9,5,0,0,0,100,0,0,0,0,0,91,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - Script - Remove Bytes 1'), -- 19:36:20.925 +(2428400,9,6,0,0,0,100,0,3200,3200,0,0,4,9110,0,0,0,0,0,1,0,0,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - Script - Play Sound 9110'), -- 19:36:23.421 +(2428400,9,7,0,0,0,100,0,0,0,0,0,5,53,0,0,0,0,0,1,0,0,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - Script - Play Emote OneShotBattleRoar'), -- 19:36:23.421 +(2428400,9,8,0,0,0,100,0,1200,1200,0,0,53,0,24284,0,0,0,0,1,0,0,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - Script - Start WP'), -- 19:36:24.622 +(2428400,9,9,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,10,99027,23842,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - Script - Say'), -- 19:36:24.622 +(2428400,9,10,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,10,99023,23842,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - Script - Say'), -- 19:36:24.622 +(2428400,9,11,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,10,99012,23842,0,0,0,0,0,'Dragonflayer Vrykul Prisoner - Script - Say'); -- 19:36:24.622 + + +DELETE FROM `waypoints` WHERE `entry`=24284; +INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES +(24284, 1, 1366.673, -3179.636, 153.576, 'Dragonflayer Vrykul Prisoner'), +(24284, 2, 1367.06, -3177.925, 153.576, 'Dragonflayer Vrykul Prisoner'), +(24284, 3, 1368.679, -3181.09, 153.576, 'Dragonflayer Vrykul Prisoner'), +(24284, 4, 1367.308, -3179.079, 153.576, 'Dragonflayer Vrykul Prisoner'), +(24284, 5, 1366.374, -3179.791, 153.576, 'Dragonflayer Vrykul Prisoner'), +(24284, 6, 1365.373, -3179.188, 153.576, 'Dragonflayer Vrykul Prisoner'), +(24284, 7, 1365.733, -3179.677, 153.576, 'Dragonflayer Vrykul Prisoner'), +(24284, 8, 1366.468, -3176.728, 153.576, 'Dragonflayer Vrykul Prisoner'), +(24284, 9, 1365.269, -3181.054, 153.576, 'Dragonflayer Vrykul Prisoner'); + +DELETE FROM `creature_text` WHERE `entry`IN(24284,23842); +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextID`, `comment`) VALUES +(24284, 0, 0, 'The vrykul clutches at his throat as he begins to gag and thrash about.', 16, 0, 100, 53, 0, 0, 23087, 'Dragonflayer Vrykul Prisoner to Player'), +(23842, 0, 0, 'Uh...?', 12, 7, 100, 1, 0, 0, 23103, 'Westguard Defender to Player'), +(23842, 0, 1, 'Interesting.', 12, 7, 100, 1, 0, 0, 23107, 'Westguard Defender to Player'), +(23842, 0, 2, 'Yikes.', 12, 7, 100, 0, 0, 0, 23104, 'Westguard Defender to Player'), +(23842, 0, 3, 'Is he okay?', 12, 7, 100, 0, 0, 0, 23105, 'Westguard Defender to Player'), +(23842, 0, 4, 'Captain''s not gonna like this.', 12, 7, 100, 0, 0, 0, 23106, 'Westguard Defender to Player'), +(23842, 0, 5, 'Whoa.', 12, 7, 100, 0, 0, 0, 23108, 'Westguard Defender to Player'), +(23842, 1, 0, 'I didn''t know they could do that.', 12, 7, 100, 1, 0, 0, 23096, 'Westguard Defender to Player'), +(23842, 1, 1, 'That''s... special.', 12, 7, 100, 1, 0, 0, 23097, 'Westguard Defender to Player'), +(23842, 1, 2, 'Heh, cool!', 12, 7, 100, 1, 0, 0, 23094, 'Westguard Defender to Player'), +(23842, 1, 3, 'That''s the new Forsaken plague?', 12, 7, 100, 1, 0, 0, 23098, 'Westguard Defender to Player'), +(23842, 1, 4, 'What kind of sicko are you?', 12, 7, 100, 1, 0, 0, 23095, 'Westguard Defender to Player'), +(23842, 1, 5, 'Oh, sick!', 12, 7, 100, 1, 0, 0, 23091, 'Westguard Defender to Player'), +(23842, 1, 6, 'I feel ill.', 12, 7, 100, 1, 0, 0, 23093, 'Westguard Defender to Player'), +(23842, 1, 7, 'That did NOT just happen!', 12, 7, 100, 1, 0, 0, 23092, 'Westguard Defender to Player'); + diff --git a/sql/updates/world/2016_02_09_08_world.sql b/sql/updates/world/2016_02_09_08_world.sql new file mode 100644 index 00000000000..307a9f9a0b3 --- /dev/null +++ b/sql/updates/world/2016_02_09_08_world.sql @@ -0,0 +1 @@ +UPDATE `gameobject` SET `state`=1 WHERE `guid`=61216; diff --git a/sql/updates/world/2016_02_10_00_world.sql b/sql/updates/world/2016_02_10_00_world.sql new file mode 100644 index 00000000000..872861b08dc --- /dev/null +++ b/sql/updates/world/2016_02_10_00_world.sql @@ -0,0 +1,18 @@ +-- Pathing for Kalecgos Entry: 24844 'TDB FORMAT' +SET @NPC := 24844; +SET @PATH := @NPC * 10; +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,163.9735,-398.0906,2.083333,0,0,0,0,100,0), -- 16:16:43 +(@PATH,2,164.3802,-397.1771,2.083333,0,0,0,0,100,0), -- 16:16:43 +(@PATH,3,162.7923,-386.1964,15.67094,0,0,0,0,100,0), -- 16:16:43 +(@PATH,4,151.5555,-345.349,5.92646,0,0,0,0,100,0), -- 16:16:43 +(@PATH,5,162.2416,-299.8032,-5.436685,0,0,0,0,100,0), -- 16:16:43 +(@PATH,6,199.7482,-272.3315,-7.186677,0,0,0,0,100,0), -- 16:16:43 +(@PATH,7,199.7482,-272.3315,-7.186677,0,0,0,0,100,0), -- 16:16:43 +(@PATH,8,199.7482,-272.3315,-7.186677,0.06981317,0,0,0,100,0); -- 16:16:54 +-- 0x1C2F2C4920184300001F1D000038BF6E .go 163.9735 -398.0906 2.083333 + +DELETE FROM `creature_text` WHERE `entry` = 24844 AND `groupid` = 0; +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(24844, 0, 0, 'Be still, mortals, and hearken to my words.', 14, 0, 100, 0, 0, 0, 23936, 3, 'Kalecgos - SAY_KALECGOS_SPAWN'); diff --git a/sql/updates/world/2016_02_10_01_world.sql b/sql/updates/world/2016_02_10_01_world.sql new file mode 100644 index 00000000000..9ffe2e81c1c --- /dev/null +++ b/sql/updates/world/2016_02_10_01_world.sql @@ -0,0 +1,21 @@ +-- Nethurbian Crater KC Bunny SAI +SET @ENTRY := 28352; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY 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 +(@ENTRY,0,0,1,8,0,100,0,51381,0,180000,180000,33,28352,0,0,0,0,0,7,0,0,0,0,0,0,0,"Nethurbian Crater KC Bunny - On Spellhit 'Toss Grenade' - Quest Credit ''"), +(@ENTRY,0,1,0,61,0,100,0,51381,0,180000,180000,45,1,1,0,0,0,0,20,190555,2,0,0,0,0,0,"Nethurbian Crater KC Bunny - On Spellhit 'Toss Grenade' - Set Data 1 1"); + +-- Nerubian Crater SAI +SET @ENTRY := 190555; +UPDATE `gameobject_template` SET `AIName`="SmartGameObjectAI" WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=1; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,1,0,0,38,0,100,0,1,1,0,0,80,@ENTRY*100+00,2,0,0,0,0,1,0,0,0,0,0,0,0,"Nerubian Crater - On Data Set 1 1 - Run Script"); + +-- Actionlist SAI +SET @ENTRY := 19055500; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,9,0,0,0,0,100,0,0,0,0,0,44,2,0,0,0,0,0,1,0,0,0,0,0,0,0,"On Script - Set Phase 2"), +(@ENTRY,9,1,0,0,0,100,0,180000,180000,0,0,44,1,0,0,0,0,0,1,0,0,0,0,0,0,0,"On Script - Set Phase 1"); diff --git a/sql/updates/world/2016_02_10_02_world.sql b/sql/updates/world/2016_02_10_02_world.sql new file mode 100644 index 00000000000..92ee165dd83 --- /dev/null +++ b/sql/updates/world/2016_02_10_02_world.sql @@ -0,0 +1,19 @@ +DELETE FROM `gossip_menu_option` WHERE `menu_id`=9546; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`, `option_text`, `OptionBroadcastTextID`, `option_id`, `npc_option_npcflag`, `action_menu_id`, `action_poi_id`, `box_coded`, `box_money`, `box_text`, `BoxBroadcastTextID`) VALUES +(9546, 0, 2, 'Where would you like to fly to?', 10753, 4, 8192, 0, 0, 0, 0, '', 0), +(9546, 1, 0, 'I need to get to Wintergarde Keep fast!', 26697, 1, 1, 0, 0, 0, 0, '', 0), +(9546, 2, 0, 'Greer, I need a gryphon to ride and some bombs to drop on New Agamand!', 23112, 1, 1, 0, 0, 0, 0, '', 0); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=9546; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(15, 9546, 1, 0, 0, 28, 0, 12298, 0, 0, 0, 0, 0, '', 'Greer Orehammer - Show gossip option only if player has taken quest 12298'), +(15, 9546, 2, 0, 0, 9, 0, 11332, 0, 0, 0, 0, 0, '', 'Greer Orehammer - Show gossip option only if player has taken quest 11332'); + +DELETE FROM `smart_scripts` WHERE `entryorguid`=23859 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 +(23859, 0, 0, 0, 4, 0, 100, 0, 0, 0, 0, 0, 80, 2385900, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Greer Orehammer - On Aggro - Run Script'), +(23859, 0, 1, 2, 62, 0, 100, 0, 9546, 2, 0, 0, 56, 33634, 10, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Greer Orehammer - On Gossip Option 1 Selected - Add Item \'Orehammer\'s Precision Bombs\' 10 Times'), +(23859, 0, 2, 3, 61, 0, 100, 0, 0, 0, 0, 0, 52, 745, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Greer Orehammer - On Gossip Option 1 Selected - Cast \'High Commander Halford Wyrmbane: Westguard Keep to Wintergarde Keep Taxi\''), +(23859, 0, 3, 0, 61, 0, 100, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Greer Orehammer - On Gossip Option 1 Selected - Close Gossip'), +(23859, 0, 4, 5, 62, 0, 100, 0, 9546, 1, 0, 0, 11, 48862, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Greer Orehammer - On gossip select - Invoker spellcast'), +(23859, 0, 5, 0, 61, 0, 100, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Greer Orehammer - On gossip select - Close gossip'); diff --git a/sql/updates/world/2016_02_10_03_world.sql b/sql/updates/world/2016_02_10_03_world.sql new file mode 100644 index 00000000000..f52872c3431 --- /dev/null +++ b/sql/updates/world/2016_02_10_03_world.sql @@ -0,0 +1,2 @@ +-- +UPDATE `gameobject` SET `spawnmask`=1 WHERE `map`=229; diff --git a/sql/updates/world/2016_02_10_04_world.sql b/sql/updates/world/2016_02_10_04_world.sql new file mode 100644 index 00000000000..1349b83f442 --- /dev/null +++ b/sql/updates/world/2016_02_10_04_world.sql @@ -0,0 +1,6 @@ +-- Honor among thieves +DELETE FROM `spell_script_names` WHERE `scriptname` = 'spell_rog_honor_among_thieves'; +DELETE FROM `spell_script_names` WHERE `scriptname` = 'spell_rog_honor_among_thieves_proc'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(-51698, 'spell_rog_honor_among_thieves'), +(52916, 'spell_rog_honor_among_thieves_proc'); diff --git a/sql/updates/world/2016_02_10_05_world.sql b/sql/updates/world/2016_02_10_05_world.sql new file mode 100644 index 00000000000..c19dd8feb06 --- /dev/null +++ b/sql/updates/world/2016_02_10_05_world.sql @@ -0,0 +1,7 @@ +-- +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=17 AND `SourceEntry`=47482; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(17, 0, 47482, 0, 0, 21, 0, 1024, 0, 0, 1, 103, 0, '', 'Ghoul Leap - not using Ghoul Leap while rooted'); +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=17 AND `SourceEntry`=49376; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(17, 0, 49376, 0, 0, 21, 0, 1024, 0, 0, 1, 103, 0, '', 'Cat charge - not using Cat charge while rooted'); diff --git a/sql/updates/world/2016_02_10_06_world.sql b/sql/updates/world/2016_02_10_06_world.sql new file mode 100644 index 00000000000..9e24ab31ce1 --- /dev/null +++ b/sql/updates/world/2016_02_10_06_world.sql @@ -0,0 +1,26 @@ +UPDATE `creature_template` SET `ainame`='SmartAI' WHERE `entry` IN(24283); +DELETE FROM `smart_scripts` WHERE `entryorguid` IN(24283) AND `source_type`=0; + +DELETE FROM `smart_scripts` WHERE `entryorguid` IN(2428300) AND `source_type`=9; + +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 +(24283,0,0,0,20,1,100,0,11328,0,0,0,80,2428300,2,0,0,0,0,1,0,0,0,0,0,0,0,'Peppy Wrongnozzle - On Quest Reward (Mission: Forsaken Intel) - Run Script'), +(24283,0,1,0,25,0,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Peppy Wrongnozzle - On Spawn - Set Phase 1'), +(24283,0,2,0,1,1,100,0,8000,10000,8000,10000,5,92,0,0,0,0,0,1,0,0,0,0,0,0,0,'Peppy Wrongnozzle - OOC (Phase 1) - Play emote OneShotEatNoSheathe'), +(2428300,9,0,0,0,0,100,0,0,0,0,0,22,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Peppy Wrongnozzle - Script - Set Phase 2'), +(2428300,9,1,0,0,0,100,0,0,0,0,0,66,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Peppy Wrongnozzle - Script - Face Player '), -- 19:35:27.323 +(2428300,9,2,0,0,0,100,0,0,0,0,0,71,0,0,2200,3698,0,0,1,0,0,0,0,0,0,0,'Peppy Wrongnozzle - Script - Equip item 2200 to Slot 1 & 3698 to slot 2'), -- 19:35:27.573 +(2428300,9,3,0,0,0,100,0,700,700,0,0,17,133,0,0,0,0,0,1,0,0,0,0,0,0,0,'Peppy Wrongnozzle - Script - Set Emote state 133'), -- 19:35:29.226 +(2428300,9,4,0,0,0,100,0,5000,5000,0,0,17,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Peppy Wrongnozzle - Script - Set Emote state 0'), -- 19:35:34.405 +(2428300,9,5,0,0,0,100,0,1300,1300,0,0,71,0,0,2705,0,0,0,1,0,0,0,0,0,0,0,'Peppy Wrongnozzle - Script - Equip item 2705 to Slot 1 & Unequip slot 2'), -- 19:35:35.638 +(2428300,9,6,0,0,0,100,0,0,0,0,0,1,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Peppy Wrongnozzle - Script - Say Line 0'), -- 19:35:35.638 +(2428300,9,7,0,0,0,100,0,0,0,0,0,22,1,0,0,0,0,0,1,0,0,0,0,0,0,0,'Peppy Wrongnozzle - Script - Set Phase 1'), +(2428300,9,8,0,0,0,100,0,0,0,0,0,24,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Peppy Wrongnozzle - Script - Evade'); + +DELETE FROM `creature_template_addon` WHERE `entry`=24283; +INSERT INTO `creature_template_addon` (`entry`, `mount`, `bytes1`, `bytes2`, `auras`) VALUES +(24283, 0, 0x0, 0x101, '35777'); -- 24283 - 35777 + +DELETE FROM `creature_text` WHERE `entry`IN(24283); +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextID`, `comment`) VALUES +(24283, 0, 0, 'Right, that should do it. I think ...hic.', 12, 7, 100, 396, 0, 0, 23086, 'Peppy Wrongnozzle to Player'); diff --git a/sql/updates/world/2016_02_10_07_world.sql b/sql/updates/world/2016_02_10_07_world.sql new file mode 100644 index 00000000000..5feb4f44163 --- /dev/null +++ b/sql/updates/world/2016_02_10_07_world.sql @@ -0,0 +1,6 @@ +-- +DELETE FROM `command` WHERE `name`="debug raidreset"; +INSERT INTO `command` (`name`,`permission`,`help`) VALUES ("debug raidreset",414,"Syntax: .debug raidreset mapid [difficulty] +Forces a global reset of the specified map on all difficulties (or only the specific difficulty if specified). Effectively the same as setting the specified map's reset timer to now."); + +UPDATE `trinity_string` SET `content_default`="Map: %d | ID: %d | perm: %s | extended: %s | diff: %d | canReset: %s | TTR: %s" WHERE `entry`=5045; diff --git a/sql/updates/world/2016_02_11_00_world.sql b/sql/updates/world/2016_02_11_00_world.sql new file mode 100644 index 00000000000..b130133a2ca --- /dev/null +++ b/sql/updates/world/2016_02_11_00_world.sql @@ -0,0 +1,6 @@ +-- Scarlet Insignia Ring - Questloot +DELETE FROM `creature_loot_template` WHERE `Entry` IN (1538,1539,1540) AND `Item`= 2875; +INSERT INTO `creature_loot_template` (`Entry`,`Item`,`Reference`,`Chance`,`QuestRequired`,`LootMode`,`GroupId`,`MinCount`,`MaxCount`,`Comment`) VALUES +(1538, 2875, 0, 40, 1, 1, 0, 1, 1, 'Scarlet Friar - Scarlet Insignia Ring'), +(1539, 2875, 0, 40, 1, 1, 0, 1, 1, 'Scarlet Neophyte - Scarlet Insignia Ring'), +(1540, 2875, 0, 40, 1, 1, 0, 1, 1, 'Scarlet Vanguard - Scarlet Insignia Ring'); diff --git a/sql/updates/world/2016_02_11_01_world.sql b/sql/updates/world/2016_02_11_01_world.sql new file mode 100644 index 00000000000..ec1c98659e1 --- /dev/null +++ b/sql/updates/world/2016_02_11_01_world.sql @@ -0,0 +1,5 @@ +-- Imperial Eagle SAI +SET @ENTRY := 26369; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0 AND `id`=1; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,1,0,8,0,100,0,49546,0,0,0,41,4000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Imperial Eagle - On Spellhit 'Eagle Eyes' - Despawn In 4000 ms"); diff --git a/sql/updates/world/2016_02_11_02_world.sql b/sql/updates/world/2016_02_11_02_world.sql new file mode 100644 index 00000000000..9228e2d99d7 --- /dev/null +++ b/sql/updates/world/2016_02_11_02_world.sql @@ -0,0 +1,18 @@ +-- DB/Item: Sealed Tome +DELETE FROM `gameobject_loot_template` WHERE `Entry`=18509; +INSERT INTO `gameobject_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(18509,1054,1054,100,0,1,1,1,1,NULL); + +DELETE FROM `reference_loot_template` WHERE `Entry`=1054; +INSERT INTO `reference_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(1054,23864,0,0,0,1,1,1,1,NULL), -- Torment of the Worgen +(1054,23857,0,0,0,1,1,1,1,NULL), -- Legacy of the Mountain King +(1054,23862,0,0,0,1,1,1,1,NULL), -- Redemption of the Fallen +(1054,23865,0,0,0,1,1,1,1, NULL); -- Wrath of the Titans + +DELETE FROM `conditions` WHERE `SourceEntry` IN (30562, 30557, 30550, 30567) AND `SourceTypeOrReferenceId`=17; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `Comment`) VALUES +(17,0,30562,0,0,23,0,3457,0,0,0,0,0,'Legacy of the Mountain King needs area 3457'), +(17,0,30557,0,0,23,0,3457,0,0,0,0,0,'Wrath of the Titans needs area 3457'), +(17,0,30550,0,0,23,0,3457,0,0,0,0,0,'Redemption of the Fallen needs area 3457'), +(17,0,30567,0,0,23,0,3457,0,0,0,0,0,'Torment of the Worgen needs area 3457'); diff --git a/sql/updates/world/2016_02_11_03_world.sql b/sql/updates/world/2016_02_11_03_world.sql new file mode 100644 index 00000000000..4dfefb12281 --- /dev/null +++ b/sql/updates/world/2016_02_11_03_world.sql @@ -0,0 +1,11 @@ +-- DB/Quest: Souls at Unrest +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=17 AND `SourceGroup`=0 AND `SourceEntry`=48974; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(17, 0, 48974, 0, 0, 31, 1, 3, 26891, 0, 0, 0, 0, '', 'Burn Corpse - only targets Undead Miner'), +(17, 0, 48974, 0, 0, 36, 1, 0, 0, 0, 1, 0, 0, '', 'Burn Corpse - only targets dead Undead Miner'); + +-- Undead Miner SAI +SET @ENTRY := 26891; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=0 AND `id`=2; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,0,2,0,8,0,100,0,48974,0,0,0,41,2000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Undead Miner - On Spellhit 'Burn Corpse' - Despawn In 2000 ms"); diff --git a/sql/updates/world/2016_02_11_04_world.sql b/sql/updates/world/2016_02_11_04_world.sql new file mode 100644 index 00000000000..41f648b5f6e --- /dev/null +++ b/sql/updates/world/2016_02_11_04_world.sql @@ -0,0 +1,4 @@ +-- DB/Quest: The Exorcism ( Mage Quest 1955) +DELETE FROM `smart_scripts` WHERE `entryorguid`=6546 AND `id`=5; +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 +(6546, 0, 5, 0, 19, 0, 100, 0, 1955, 0, 0, 0, 80, 654600, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Tabetha - On Quest \'The Exorcism\' Taken - Run Script (No Repeat)'); diff --git a/sql/updates/world/2016_02_11_05_world.sql b/sql/updates/world/2016_02_11_05_world.sql new file mode 100644 index 00000000000..76b59765d08 --- /dev/null +++ b/sql/updates/world/2016_02_11_05_world.sql @@ -0,0 +1,2 @@ +-- Iron Rune Avenger +UPDATE `creature_template` SET `flags_extra`=(`flags_extra`|2097152) WHERE `entry` IN (26786); diff --git a/sql/updates/world/2016_02_11_06_world.sql b/sql/updates/world/2016_02_11_06_world.sql new file mode 100644 index 00000000000..bbf9880dca9 --- /dev/null +++ b/sql/updates/world/2016_02_11_06_world.sql @@ -0,0 +1,206 @@ +SET @OGUID:=79584; +SET @CGUID:=61988; +SET @Event:=7; + +-- Add missing lunar objects +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+182; +INSERT INTO `gameobject` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`) VALUES +(@OGUID+0 , 180766, 571, 1, 1, 5827.364, 638.9564, 647.2116, 1.082103, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 4613) +(@OGUID+1 , 180766, 571, 1, 1, 5827.502, 645.6351, 647.1417, 1.937312, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 4613) +(@OGUID+2 , 180766, 571, 1, 1, 5821.811, 633.4114, 647.1953, 0, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 4613) +(@OGUID+3 , 180766, 571, 1, 1, 5822.486, 652.9247, 647.212, 3.071766, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 4613) +(@OGUID+4 , 180766, 571, 1, 1, 5815.521, 643.1665, 647.1968, 4.642576, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 4613) +(@OGUID+5 , 180766, 571, 1, 1, 5818.29, 648.6586, 647.173, 4.118979, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 4613) +(@OGUID+6 , 180766, 571, 1, 1, 5818.406, 635.2549, 647.1855, 5.515242, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 4613) +(@OGUID+7 , 180766, 571, 1, 1, 5816.469, 638.8152, 647.1979, 5.113817, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 4613) +(@OGUID+8 , 180765, 571, 1, 1, 5862.578, 608.9785, 622.725, 3.525572, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 4613) +(@OGUID+9 , 180765, 571, 1, 1, 5818.557, 689.6754, 617.5377, 5.811947, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 4613) +(@OGUID+10 , 180765, 571, 1, 1, 5759.772, 714.2535, 653.2266, 1.867502, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 4620) +(@OGUID+11 , 180765, 571, 1, 1, 5760.561, 701.3275, 623.345, 4.520406, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 0) +(@OGUID+12 , 180765, 571, 1, 1, 5731.914, 677.9752, 653.3376, 3.071766, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 0) +(@OGUID+13 , 180765, 571, 1, 1, 5670.342, 779.5948, 669.5635, 5.550147, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 4569) +(@OGUID+14 , 180765, 571, 1, 1, 5753.294, 594.6252, 618.5057, 5.358162, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 4560) +(@OGUID+15 , 180765, 571, 1, 1, 5819.917, 557.6574, 655.4913, 5.742135, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 4570) +(@OGUID+16 , 180878, 571, 1, 1, 5831.143, 655.095, 647.124, 5.567601, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 4613) +(@OGUID+17 , 180878, 571, 1, 1, 5830.427, 655.5619, 647.1938, 2.687807, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 4613) +(@OGUID+18 , 180878, 571, 1, 1, 5829.478, 652.8141, 647.3889, 5.585054, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 4613) +(@OGUID+19 , 180878, 571, 1, 1, 5829.293, 656.304, 647.3473, 2.129301, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 4613) +(@OGUID+20 , 180878, 571, 1, 1, 5830.003, 656.1676, 647.2794, 3.543024, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 4613) +(@OGUID+21 , 180878, 571, 1, 1, 5829.671, 655.4982, 647.2844, 4.502952, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 4613) +(@OGUID+22 , 180878, 571, 1, 1, 5828.868, 653.2474, 647.4297, 4.869471, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 4613) +(@OGUID+23 , 180770, 571, 1, 1, 5948.266, 620.9393, 660.9077, 2.792518, 0, 0, 0, 1, 120, 255, 1), -- 180770 (Area: 4613) +(@OGUID+24 , 180770, 571, 1, 1, 5885.173, 625.6719, 667.6763, 5.637414, 0, 0, 0, 1, 120, 255, 1), -- 180770 (Area: 4613) +(@OGUID+25 , 180770, 571, 1, 1, 5834.693, 718.492, 659.2477, 4.06662, 0, 0, 0, 1, 120, 255, 1), -- 180770 (Area: 4613) +(@OGUID+26 , 180770, 571, 1, 1, 5728.38, 609.739, 668.472, 0.8901166, 0, 0, 0, 1, 120, 255, 1), -- 180770 (Area: 4560) +(@OGUID+27 , 180770, 571, 1, 1, 5671.689, 646.728, 664.1037, 0.2967052, 0, 0, 0, 1, 120, 255, 1), -- 180770 (Area: 4560) +(@OGUID+28 , 180770, 571, 1, 1, 5783.651, 561.3226, 663.734, 0.8901166, 0, 0, 0, 1, 120, 255, 1), -- 180770 (Area: 4560) +(@OGUID+29 , 180770, 571, 1, 1, 5659.569, 679.338, 662.2587, 5.864307, 0, 0, 0, 1, 120, 255, 1), -- 180770 (Area: 4560) +(@OGUID+30 , 180769, 571, 1, 1, 5909.365, 661.7691, 649.1791, 3.979355, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 4613) +(@OGUID+31 , 180769, 571, 1, 1, 5886.387, 624.8147, 653.553, 2.460913, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 4613) +(@OGUID+32 , 180769, 571, 1, 1, 5931.343, 575.7878, 615.0651, 3.857183, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 4613) +(@OGUID+33 , 180769, 571, 1, 1, 5881.342, 611.066, 654.6136, 2.495818, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 4613) +(@OGUID+34 , 180769, 571, 1, 1, 5901.177, 684.3577, 647.6432, 2.391098, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 4613) +(@OGUID+35 , 180769, 571, 1, 1, 5929.563, 561.2188, 615.4888, 2.44346, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 4613) +(@OGUID+36 , 180769, 571, 1, 1, 5913.596, 558.0538, 615.162, 1.274088, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 4613) +(@OGUID+37 , 180769, 571, 1, 1, 5859.038, 634.4976, 653.8649, 5.585054, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 4613) +(@OGUID+38 , 180769, 571, 1, 1, 5915.081, 710.2066, 646.7171, 3.071766, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 4613) +(@OGUID+39 , 180769, 571, 1, 1, 5855.796, 664.7435, 653.7689, 0.9075702, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 4613) +(@OGUID+40 , 180769, 571, 1, 1, 5858.535, 699.8768, 647.4109, 4.01426, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 4613) +(@OGUID+41 , 180769, 571, 1, 1, 5852.463, 690.137, 614.8257, 4.031712, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 4613) +(@OGUID+42 , 180769, 571, 1, 1, 5873.14, 725.0781, 647.2786, 1.780234, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 4613) +(@OGUID+43 , 180769, 571, 1, 1, 5883.378, 741.8604, 644.6421, 4.921829, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 4613) +(@OGUID+44 , 180769, 571, 1, 1, 5817.372, 694.9447, 653.3386, 0.8901166, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 4613) +(@OGUID+45 , 180769, 571, 1, 1, 5901.752, 746.1671, 645.9257, 4.502952, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 4613) +(@OGUID+46 , 180769, 571, 1, 1, 5864.876, 738.8313, 644.7396, 5.113817, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 4613) +(@OGUID+47 , 180769, 571, 1, 1, 5835.081, 719.8969, 646.1445, 4.01426, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 4613) +(@OGUID+48 , 180769, 571, 1, 1, 5786.942, 691.6105, 653.3179, 2.426008, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 4620) +(@OGUID+49 , 180769, 571, 1, 1, 5768.04, 709.3449, 623.6602, 5.585054, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 4620) +(@OGUID+50 , 180769, 571, 1, 1, 5768.866, 732.3944, 645.68, 5.777041, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 4620) +(@OGUID+51 , 180769, 571, 1, 1, 5769.894, 668.6614, 650.4285, 2.460913, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 0) +(@OGUID+52 , 180769, 571, 1, 1, 5788.438, 653.5104, 654.6097, 5.602507, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 0) +(@OGUID+53 , 180769, 571, 1, 1, 5750.353, 646.9713, 656.329, 2.478367, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 4560) +(@OGUID+54 , 180769, 571, 1, 1, 5753.372, 616.3696, 656.3885, 4.049168, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 4560) +(@OGUID+55 , 180769, 571, 1, 1, 5730.582, 607.2877, 652.4621, 0.8901166, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 4560) +(@OGUID+56 , 180769, 571, 1, 1, 5687.786, 619.9709, 652.2067, 0.5759573, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 4560) +(@OGUID+57 , 180769, 571, 1, 1, 5675.173, 631.3223, 652.21, 0.5235979, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 4560) +(@OGUID+58 , 180769, 571, 1, 1, 5671.983, 646.4656, 652.1304, 0.2967052, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 4560) +(@OGUID+59 , 180769, 571, 1, 1, 5783.131, 561.6129, 655.8354, 0.8552105, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 4560) +(@OGUID+60 , 180769, 571, 1, 1, 5809.257, 575.9974, 656.7222, 4.834563, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 4560) +(@OGUID+61 , 180769, 571, 1, 1, 5844.062, 569.6259, 656.8289, 2.478367, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 4570) +(@OGUID+62 , 180763, 571, 1, 1, 5944.821, 630.5286, 652.4573, 2.967041, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4613) +(@OGUID+63 , 180763, 571, 1, 1, 5890.119, 630.0712, 650.7103, 2.391098, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4613) +(@OGUID+64 , 180763, 571, 1, 1, 5883.333, 613.3351, 651.5501, 2.33874, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4613) +(@OGUID+65 , 180763, 571, 1, 1, 5983.581, 603.4676, 653.0666, 2.862335, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4613) +(@OGUID+66 , 180763, 571, 1, 1, 5986.168, 610.6107, 653.0659, 2.967041, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 0) +(@OGUID+67 , 180763, 571, 1, 1, 5913.733, 726.7258, 645.9022, 3.298687, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4613) +(@OGUID+68 , 180763, 571, 1, 1, 5820.595, 692.2194, 647.6371, 0.9948372, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4613) +(@OGUID+69 , 180763, 571, 1, 1, 5867.973, 739.8099, 641.4172, 5.410522, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4613) +(@OGUID+70 , 180763, 571, 1, 1, 5903.759, 687.3698, 644.8055, 5.235988, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4620) +(@OGUID+71 , 180763, 571, 1, 1, 5871.152, 724.772, 643.811, 1.954769, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4620) +(@OGUID+72 , 180763, 571, 1, 1, 5752.106, 717.1315, 641.7864, 3.944446, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 0) +(@OGUID+73 , 180763, 571, 1, 1, 5746.831, 728.174, 641.7136, 4.031712, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 0) +(@OGUID+74 , 180763, 571, 1, 1, 5733.553, 726.9333, 642.7537, 2.548179, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 0) +(@OGUID+75 , 180763, 571, 1, 1, 5735.731, 678.2547, 647.2717, 5.532695, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 0) +(@OGUID+76 , 180763, 571, 1, 1, 5732.593, 674.2257, 647.2732, 2.932139, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4560) +(@OGUID+77 , 180763, 571, 1, 1, 5716.352, 722.8108, 643.5378, 0.9599299, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4560) +(@OGUID+78 , 180763, 571, 1, 1, 5709.845, 727.9358, 643.5585, 0.8726639, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4560) +(@OGUID+79 , 180763, 571, 1, 1, 5703.215, 733.3229, 643.576, 0.8203033, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4560) +(@OGUID+80 , 180763, 571, 1, 1, 5833.685, 645.7676, 610.1852, 4.118979, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4560) +(@OGUID+81 , 180763, 571, 1, 1, 5669.793, 808.6216, 655.2228, 4.171338, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4569) +(@OGUID+82 , 180763, 571, 1, 1, 5746.831, 728.174, 641.7136, 4.031712, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4569) +(@OGUID+83 , 180763, 571, 1, 1, 5657.733, 814.1997, 654.9894, 4.869471, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4569) +(@OGUID+84 , 180763, 571, 1, 1, 5640.182, 793.6152, 654.9894, 0.1919852, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4569) +(@OGUID+85 , 180763, 571, 1, 1, 5648.342, 782.4639, 654.989, 0.8203033, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4569) +(@OGUID+86 , 180763, 571, 1, 1, 5646.54, 805.8158, 654.9894, 5.707228, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4569) +(@OGUID+87 , 180763, 571, 1, 1, 5752.106, 717.1315, 641.7864, 3.944446, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4569) +(@OGUID+88 , 180763, 571, 1, 1, 5733.553, 726.9333, 642.7537, 2.548179, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4560) +(@OGUID+89 , 180763, 571, 1, 1, 5820.595, 692.2194, 647.6371, 0.9948372, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4560) +(@OGUID+90 , 180763, 571, 1, 1, 5703.215, 733.3229, 643.576, 0.8203033, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4560) +(@OGUID+91 , 180763, 571, 1, 1, 5689.638, 617.3722, 649.33, 0.802851, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4560) +(@OGUID+92 , 180763, 571, 1, 1, 5668.561, 683.9375, 653.5638, 5.951575, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4560) +(@OGUID+93 , 180763, 571, 1, 1, 5821.209, 557.6127, 652.8544, 1.815142, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4570) +(@OGUID+94 , 180763, 571, 1, 1, 5845.696, 572.116, 653.2255, 2.44346, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4570) +(@OGUID+95 , 180763, 571, 1, 1, 5828.66, 517.7811, 659.3014, 5.131269, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4570) +(@OGUID+96 , 180763, 571, 1, 1, 5735.731, 678.2547, 647.2717, 5.532695, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4570) +(@OGUID+97 , 180763, 571, 1, 1, 5732.593, 674.2257, 647.2732, 2.932139, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4570) +(@OGUID+98 , 180763, 571, 1, 1, 5883.333, 613.3351, 651.5501, 2.33874, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4570) +(@OGUID+99 , 180763, 571, 1, 1, 5890.119, 630.0712, 650.7103, 2.391098, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4570) +(@OGUID+100, 180763, 571, 1, 1, 5903.759, 687.3698, 644.8055, 5.235988, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 0) +(@OGUID+101, 180763, 571, 1, 1, 5944.821, 630.5286, 652.4573, 2.967041, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 0) +(@OGUID+102, 180763, 571, 1, 1, 5939.341, 616.0452, 652.3865, 2.740162, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 0) +(@OGUID+103, 180763, 571, 1, 1, 5871.152, 724.772, 643.811, 1.954769, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 0) +(@OGUID+104, 180763, 571, 1, 1, 5983.581, 603.4676, 653.0666, 2.862335, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4560) +(@OGUID+105, 180763, 571, 1, 1, 5828.66, 517.7811, 659.3014, 5.131269, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4560) +(@OGUID+106, 180763, 571, 1, 1, 5872.536, 687.5123, 647.7181, 4.136433, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4613) +(@OGUID+107, 180763, 571, 1, 1, 5812.34, 554.8807, 652.9316, 2.007128, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4616) +(@OGUID+108, 180763, 571, 1, 1, 5820.595, 692.2194, 647.6371, 0.9948372, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4739) +(@OGUID+109, 180763, 571, 1, 1, 5735.731, 678.2547, 647.2717, 5.532695, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4739) +(@OGUID+110, 180763, 571, 1, 1, 5733.001, 605.4604, 649.6217, 0.9948372, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 4739) +(@OGUID+111, 180764, 571, 1, 1, 5939.341, 616.0452, 652.3865, 2.740162, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4613) +(@OGUID+112, 180764, 571, 1, 1, 5930.153, 592.1089, 640.6768, 2.670348, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4613) +(@OGUID+113, 180764, 571, 1, 1, 5920.96, 592.6715, 640.6837, 1.937312, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4613) +(@OGUID+114, 180764, 571, 1, 1, 5938.111, 587.7853, 640.6421, 3.036838, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4613) +(@OGUID+115, 180764, 571, 1, 1, 5912.436, 589.316, 640.6563, 0.7330382, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4613) +(@OGUID+116, 180764, 571, 1, 1, 5943.503, 581.1985, 640.6602, 5.619962, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4613) +(@OGUID+117, 180764, 571, 1, 1, 5946.514, 572.8181, 640.6762, 3.42085, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4613) +(@OGUID+118, 180764, 571, 1, 1, 5986.168, 610.6107, 653.0659, 2.967041, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4613) +(@OGUID+119, 180764, 571, 1, 1, 5945.639, 564.164, 640.7072, 5.951575, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4613) +(@OGUID+120, 180764, 571, 1, 1, 5941.456, 556.3479, 640.7192, 1.658062, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4613) +(@OGUID+121, 180764, 571, 1, 1, 5934.847, 550.7705, 640.6883, 5.846854, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4613) +(@OGUID+122, 180764, 571, 1, 1, 5864.014, 600.7278, 652.6012, 2.373644, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4613) +(@OGUID+123, 180764, 571, 1, 1, 5903.759, 687.3698, 644.8055, 5.235988, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4613) +(@OGUID+124, 180764, 571, 1, 1, 5853.561, 587.517, 652.7214, 2.530723, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4613) +(@OGUID+125, 180764, 571, 1, 1, 5872.536, 687.5123, 647.7181, 4.136433, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4613) +(@OGUID+126, 180764, 571, 1, 1, 5914.998, 716.574, 643.6473, 3.194002, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4613) +(@OGUID+127, 180764, 571, 1, 1, 5893.063, 706.0598, 648.3202, 1.012289, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4613) +(@OGUID+128, 180764, 571, 1, 1, 5890.119, 630.0712, 650.7103, 2.391098, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 0) +(@OGUID+129, 180764, 571, 1, 1, 5938.111, 587.7853, 640.6421, 3.036838, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 0) +(@OGUID+130, 180764, 571, 1, 1, 5983.581, 603.4676, 653.0666, 2.862335, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 0) +(@OGUID+131, 180764, 571, 1, 1, 5912.436, 589.316, 640.6563, 0.7330382, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 0) +(@OGUID+132, 180764, 571, 1, 1, 5934.847, 550.7705, 640.6883, 5.846854, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 0) +(@OGUID+133, 180764, 571, 1, 1, 5872.536, 687.5123, 647.7181, 4.136433, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4613) +(@OGUID+134, 180764, 571, 1, 1, 5945.639, 564.164, 640.7072, 5.951575, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4613) +(@OGUID+135, 180764, 571, 1, 1, 5833.685, 645.7676, 610.1852, 4.118979, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4613) +(@OGUID+136, 180764, 571, 1, 1, 5827.226, 645.5917, 648.326, 3.316144, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4613) +(@OGUID+137, 180764, 571, 1, 1, 5845.696, 572.116, 653.2255, 2.44346, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4613) +(@OGUID+138, 180764, 571, 1, 1, 5871.152, 724.772, 643.811, 1.954769, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4613) +(@OGUID+139, 180764, 571, 1, 1, 5816.614, 639.0052, 648.413, 2.164206, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4613) +(@OGUID+140, 180764, 571, 1, 1, 5883.333, 613.3351, 651.5501, 2.33874, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4613) +(@OGUID+141, 180764, 571, 1, 1, 5898.784, 746.4573, 642.1553, 4.66003, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4613) +(@OGUID+142, 180764, 571, 1, 1, 5893.063, 706.0598, 648.3202, 1.012289, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4620) +(@OGUID+143, 180764, 571, 1, 1, 5763.81, 725.4814, 620.0308, 0.9424766, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4620) +(@OGUID+144, 180764, 571, 1, 1, 5763.81, 725.4814, 620.0308, 0.9424766, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4560) +(@OGUID+145, 180764, 571, 1, 1, 5867.973, 739.8099, 641.4172, 5.410522, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4560) +(@OGUID+146, 180764, 571, 1, 1, 5872.536, 687.5123, 647.7181, 4.136433, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4560) +(@OGUID+147, 180764, 571, 1, 1, 5733.001, 605.4604, 649.6217, 0.9948372, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4560) +(@OGUID+148, 180764, 571, 1, 1, 5674.231, 639.6476, 649.1661, 0.2792516, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4560) +(@OGUID+149, 180764, 571, 1, 1, 5785.611, 560.2617, 652.6686, 3.874631, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4560) +(@OGUID+150, 180764, 571, 1, 1, 5812.34, 554.8807, 652.9316, 2.007128, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4560) +(@OGUID+151, 180764, 571, 1, 1, 5662.389, 669.6667, 653.5421, 6.265733, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4560) +(@OGUID+152, 180764, 571, 1, 1, 5853.561, 587.517, 652.7214, 2.530723, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4570) +(@OGUID+153, 180764, 571, 1, 1, 5864.014, 600.7278, 652.6012, 2.373644, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4570) +(@OGUID+154, 180764, 571, 1, 1, 5920.96, 592.6715, 640.6837, 1.937312, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 0) +(@OGUID+155, 180764, 571, 1, 1, 5912.436, 589.316, 640.6563, 0.7330382, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 0) +(@OGUID+156, 180764, 571, 1, 1, 5930.153, 592.1089, 640.6768, 2.670348, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 0) +(@OGUID+157, 180764, 571, 1, 1, 5938.111, 587.7853, 640.6421, 3.036838, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 0) +(@OGUID+158, 180764, 571, 1, 1, 5943.503, 581.1985, 640.6602, 5.619962, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4560) +(@OGUID+159, 180764, 571, 1, 1, 5945.639, 564.164, 640.7072, 5.951575, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 4560) +(@OGUID+160, 180879, 571, 1, 1, 5829.639, 654.4427, 647.3204, 5.689774, 0, 0, 0, 1, 120, 255, 1), -- 180879 (Area: 4613) +(@OGUID+161, 180767, 571, 1, 1, 5867.941, 616.2357, 622.7247, 2.460913, 0, 0, 0, 1, 120, 255, 1), -- 180767 (Area: 4613) +(@OGUID+162, 180767, 571, 1, 1, 5897.854, 555.5522, 648.3434, 0.5061446, 0, 0, 0, 1, 120, 255, 1), -- 180767 (Area: 4613) +(@OGUID+163, 180767, 571, 1, 1, 5892.568, 549.7327, 648.2482, 2.740162, 0, 0, 0, 1, 120, 255, 1), -- 180767 (Area: 4613) +(@OGUID+164, 180767, 571, 1, 1, 5814.174, 684.2547, 617.5809, 4.450591, 0, 0, 0, 1, 120, 255, 1), -- 180767 (Area: 4613) +(@OGUID+165, 180767, 571, 1, 1, 5774.229, 717.9037, 623.3556, 2.199115, 0, 0, 0, 1, 120, 255, 1), -- 180767 (Area: 4620) +(@OGUID+166, 180767, 571, 1, 1, 5770.015, 581.1361, 618.5083, 2.495818, 0, 0, 0, 1, 120, 255, 1), -- 180767 (Area: 4560) +(@OGUID+167, 180767, 571, 1, 1, 5813.308, 555.64, 655.5086, 0.087266, 0, 0, 0, 1, 120, 255, 1), -- 180767 (Area: 4560) +(@OGUID+168, 188215, 571, 1, 1, 5927.629, 731.5903, 643.1697, 4.76475, 0, 0, 0, 1, 120, 255, 1), -- 188215 (Area: 4613) +(@OGUID+169, 180880, 571, 1, 1, 5828.156, 651.3569, 647.5219, 3.42085, 0, 0, 0, 1, 120, 255, 1), -- 180880 (Area: 4613) +(@OGUID+170, 180881, 571, 1, 1, 5829.097, 651.775, 647.4488, 4.799657, 0, 0, 0, 1, 120, 255, 1), -- 180881 (Area: 4613) +(@OGUID+171, 180882, 571, 1, 1, 5829.017, 651.1241, 647.4738, 3.769912, 0, 0, 0, 1, 120, 255, 1), -- 180882 (Area: 4613) +(@OGUID+172, 180883, 571, 1, 1, 5828.462, 652.3148, 647.4636, 5.445428, 0, 0, 0, 1, 120, 255, 1), -- 180883 (Area: 4613) +(@OGUID+173, 180883, 571, 1, 1, 5828.013, 651.9222, 647.5066, 5.811947, 0, 0, 0, 1, 120, 255, 1), -- 180883 (Area: 4613) +(@OGUID+174, 180868, 571, 1, 1, 5820.396, 633.1682, 647.392, 4.171338, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 4613) +(@OGUID+175, 180868, 571, 1, 1, 5818.986, 634.1285, 647.392, 4.118979, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 4613) +(@OGUID+176, 180868, 571, 1, 1, 5815.437, 644.6893, 647.392, 2.652894, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 4613) +(@OGUID+177, 180868, 571, 1, 1, 5818.691, 650.1199, 647.3958, 2.460913, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 4613) +(@OGUID+178, 180868, 571, 1, 1, 5817.034, 647.832, 647.392, 2.635444, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 4613) +(@OGUID+179, 180868, 571, 1, 1, 5819.984, 651.618, 647.4, 2.408554, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 4613) +(@OGUID+180, 180868, 571, 1, 1, 5816.064, 637.7977, 647.3924, 3.665196, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 4613) +(@OGUID+181, 180869, 571, 1, 1, 5816.274, 646.3437, 647.392, 2.652894, 0, 0, 0, 1, 120, 255, 1), -- 180869 (Area: 4613) +(@OGUID+182, 180869, 571, 1, 1, 5817.032, 636.2288, 647.392, 3.735006, 0, 0, 0, 1, 120, 255, 1); -- 180869 (Area: 4613) + +DELETE FROM `game_event_gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+182 AND `eventEntry`=@Event; +INSERT INTO `game_event_gameobject` SELECT @Event, gameobject.guid FROM `gameobject` WHERE gameobject.guid BETWEEN @OGUID+0 AND @OGUID+182; + +-- Add missing lunar spawns +DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+5; +INSERT INTO `creature` (`guid`, `id`, `map`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `curhealth`) VALUES +(@CGUID+0, 15892, 571, 5825.602, 642.9196, 647.8765, 3.106686, 120, 0), -- 15892 (Area: 4613) +(@CGUID+1, 15892, 571, 5820.262, 646.1699, 647.8525, 5.235988, 120, 0), -- 15892 (Area: 4613) +(@CGUID+2, 15892, 571, 5819.783, 639.3316, 647.9127, 1.029744, 120, 0), -- 15892 (Area: 4613) +(@CGUID+3, 15898, 571, 5827.147, 654.6258, 647.5777, 3.159046, 120, 0), -- 15898 (Area: 4613) (Auras: ) +(@CGUID+4, 15895, 571, 5824.651, 657.0713, 647.6139, 3.246312, 120, 0), -- 15895 (Area: 4613) (Auras: ) +(@CGUID+5, 15897, 571, 5821.922, 642.784, 648.11, 5.166174, 120, 0); -- 15897 (Area: 4613) (Auras: 25824 - 25824) + +DELETE FROM `game_event_creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+5 AND `eventEntry`=@Event; +INSERT INTO `game_event_creature` SELECT @Event, creature.guid FROM `creature` WHERE creature.guid BETWEEN @CGUID+0 AND @CGUID+5; diff --git a/sql/updates/world/2016_02_11_07_world.sql b/sql/updates/world/2016_02_11_07_world.sql new file mode 100644 index 00000000000..e34106cb44c --- /dev/null +++ b/sql/updates/world/2016_02_11_07_world.sql @@ -0,0 +1,145 @@ +SET @OGUID:=79767; +SET @CGUID:=97677; +SET @Event:=7; + +-- Add missing lunar objects +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+109; +INSERT INTO `gameobject` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`) VALUES +(@OGUID+0 , 180768, 530, 1, 1, -1813.065, 5493.691, -12.42814, 4.433136, 0, 0, 0, 1, 120, 255, 1), -- 180768 (Area: 3703) +(@OGUID+1 , 180768, 530, 1, 1, -1810.529, 5502.124, -12.42814, 3.560473, 0, 0, 0, 1, 120, 255, 1), -- 180768 (Area: 3703) +(@OGUID+2 , 180768, 530, 1, 1, -1797.383, 5484.879, -12.42814, 0.8726639, 0, 0, 0, 1, 120, 255, 1), -- 180768 (Area: 3703) +(@OGUID+3 , 180768, 530, 1, 1, -1802.372, 5503.944, -12.42814, 2.879789, 0, 0, 0, 1, 120, 255, 1), -- 180768 (Area: 3703) +(@OGUID+4 , 180768, 530, 1, 1, -1804.87, 5483.975, -12.42814, 0.122173, 0, 0, 0, 1, 120, 255, 1), -- 180768 (Area: 3703) +(@OGUID+5 , 180768, 530, 1, 1, -1796.439, 5505.653, -12.42814, 3.822273, 0, 0, 0, 1, 120, 255, 1), -- 180768 (Area: 3703) +(@OGUID+6 , 180768, 530, 1, 1, -1791.092, 5498.224, -12.42814, 0.6283169, 0, 0, 0, 1, 120, 255, 1), -- 180768 (Area: 3703) +(@OGUID+7 , 180768, 530, 1, 1, -1793.718, 5492.52, -12.42814, 1.274088, 0, 0, 0, 1, 120, 255, 1), -- 180768 (Area: 3703) +(@OGUID+8 , 180768, 530, 1, 1, 9487.017, -7295.95, 14.34292, 1.274088, 0, 0, 0, 1, 120, 255, 1), -- 180768 (Area: 3487) +(@OGUID+9 , 180768, 530, 1, 1, 9484.238, -7301.355, 14.38242, 0.8726639, 0, 0, 0, 1, 120, 255, 1), -- 180768 (Area: 3487) +(@OGUID+10 , 180768, 530, 1, 1, 9489.608, -7291.334, 14.31547, 0.6283169, 0, 0, 0, 1, 120, 255, 1), -- 180768 (Area: 3487) +(@OGUID+11 , 180768, 530, 1, 1, 9477.151, -7304.068, 14.36639, 0.122173, 0, 0, 0, 1, 120, 255, 1), -- 180768 (Area: 3487) +(@OGUID+12 , 180768, 530, 1, 1, 9486.314, -7286.41, 14.28697, 3.822273, 0, 0, 0, 1, 120, 255, 1), -- 180768 (Area: 3487) +(@OGUID+13 , 180768, 530, 1, 1, 9475.41, -7288.148, 14.25113, 3.560473, 0, 0, 0, 1, 120, 255, 1), -- 180768 (Area: 3487) +(@OGUID+14 , 180768, 530, 1, 1, 9481.289, -7287.188, 14.267, 2.879789, 0, 0, 0, 1, 120, 255, 1), -- 180768 (Area: 3487) +(@OGUID+15 , 180768, 530, 1, 1, 9470.736, -7293.924, 14.30253, 4.433136, 0, 0, 0, 1, 120, 255, 1), -- 180768 (Area: 3487) +(@OGUID+16 , 180766, 530, 1, 1, -1784.918, 5443.967, -12.42814, 4.084071, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 3703) +(@OGUID+17 , 180766, 530, 1, 1, -1782.34, 5432.168, -12.42814, 5.864307, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 3703) +(@OGUID+18 , 180766, 530, 1, 1, -1779.882, 5450.221, -12.42814, 3.438303, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 3703) +(@OGUID+19 , 180766, 530, 1, 1, -1771.785, 5447.635, -12.42814, 2.740162, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 3703) +(@OGUID+20 , 180766, 530, 1, 1, -1768.499, 5435.3, -12.42814, 0.7853968, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 3703) +(@OGUID+21 , 180766, 530, 1, 1, -1774.774, 5428.898, -12.42814, 0.2268925, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 3703) +(@OGUID+22 , 180766, 530, 1, 1, -1764.911, 5447.474, -12.42814, 3.42085, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 3703) +(@OGUID+23 , 180766, 530, 1, 1, -1762.984, 5438.721, -12.42814, 0.157079, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 3703) +(@OGUID+24 , 180778, 530, 1, 1, -1807.913, 5485.737, -12.42814, 0.7504908, 0, 0, 0, 1, 120, 255, 1), -- 180778 (Area: 3703) +(@OGUID+25 , 180778, 530, 1, 1, -1812.186, 5490.322, -12.42814, 3.874631, 0, 0, 0, 1, 120, 255, 1), -- 180778 (Area: 3703) +(@OGUID+26 , 180778, 530, 1, 1, 9471.936, -7298.056, 14.34922, 3.874631, 0, 0, 0, 1, 120, 255, 1), -- 180778 (Area: 3487) +(@OGUID+27 , 180778, 530, 1, 1, 9474.56, -7301.353, 14.37097, 0.7504908, 0, 0, 0, 1, 120, 255, 1), -- 180778 (Area: 3487) +(@OGUID+28 , 180878, 530, 1, 1, -1790.338, 5498.744, -12.42814, 3.857183, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 3703) +(@OGUID+29 , 180878, 530, 1, 1, -1790.234, 5496.288, -12.42814, 4.01426, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 3703) +(@OGUID+30 , 180878, 530, 1, 1, -1790.902, 5497.011, -12.42814, 5.777041, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 3703) +(@OGUID+31 , 180878, 530, 1, 1, -1789.234, 5496.14, -12.42814, 6.003934, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 3703) +(@OGUID+32 , 180878, 530, 1, 1, -1789.172, 5498.917, -12.42814, 0.1047193, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 3703) +(@OGUID+33 , 180878, 530, 1, 1, -1788.415, 5496.598, -12.42814, 3.089183, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 3703) +(@OGUID+34 , 180878, 530, 1, 1, -1788.392, 5498.381, -12.42814, 4.24115, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 3703) +(@OGUID+35 , 180878, 530, 1, 1, -1788.111, 5497.561, -12.42814, 1.413715, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 3703) +(@OGUID+36 , 180878, 530, 1, 1, -1765.722, 5449.934, -12.42814, 3.543024, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 3703) +(@OGUID+37 , 180878, 530, 1, 1, -1764.807, 5450.181, -12.42814, 2.129301, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 3703) +(@OGUID+38 , 180878, 530, 1, 1, -1766.226, 5448.125, -12.42814, 2.687807, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 3703) +(@OGUID+39 , 180878, 530, 1, 1, -1766.088, 5449.026, -12.42814, 4.502952, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 3703) +(@OGUID+40 , 180878, 530, 1, 1, -1765.541, 5447.308, -12.42814, 5.567601, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 3703) +(@OGUID+41 , 180878, 530, 1, 1, -1763.994, 5449.78, -12.42814, 5.585054, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 3703) +(@OGUID+42 , 180878, 530, 1, 1, -1763.402, 5449.152, -12.42814, 4.869471, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 3703) +(@OGUID+43 , 180878, 530, 1, 1, 9491.685, -7292.46, 14.32974, 0.1047193, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 3487) +(@OGUID+44 , 180878, 530, 1, 1, 9490.622, -7293.794, 14.33648, 1.413715, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 3487) +(@OGUID+45 , 180878, 530, 1, 1, 9491.373, -7293.285, 14.3349, 4.24115, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 3487) +(@OGUID+46 , 180878, 530, 1, 1, 9489.716, -7293.833, 14.33415, 3.089183, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 3487) +(@OGUID+47 , 180878, 530, 1, 1, 9488.958, -7293.352, 14.32843, 6.003934, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 3487) +(@OGUID+48 , 180878, 530, 1, 1, 9491.266, -7291.555, 14.32187, 3.857183, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 3487) +(@OGUID+49 , 180878, 530, 1, 1, 9488.673, -7292.52, 14.32149, 4.01426, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 3487) +(@OGUID+50 , 180878, 530, 1, 1, 9488.967, -7291.694, 14.31627, 5.777041, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 3487) +(@OGUID+51 , 180763, 530, 1, 1, -1804.848, 5484.874, -11.5462, 0.6981314, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 3703) +(@OGUID+52 , 180763, 530, 1, 1, -1795.721, 5504.963, -11.49064, 0.4537851, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 3703) +(@OGUID+53 , 180763, 530, 1, 1, -1779.698, 5450.049, -11.14342, 0.2967052, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 3703) +(@OGUID+54 , 180763, 530, 1, 1, -1784.666, 5443.933, -11.10175, 3.351047, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 3703) +(@OGUID+55 , 180763, 530, 1, 1, -1774.672, 5429.127, -11.12259, 3.281239, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 3703) +(@OGUID+56 , 180763, 530, 1, 1, -1762.88, 5438.89, -11.18509, 0.2792516, 0, 0, 0, 1, 120, 255, 1), -- 180763 (Area: 3703) +(@OGUID+57 , 180764, 530, 1, 1, 9489.186, -7290.492, 15.29506, 3.961899, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 3487) +(@OGUID+58 , 180764, 530, 1, 1, 9471.669, -7294.084, 15.2562, 0.6981314, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 3487) +(@OGUID+59 , 180879, 530, 1, 1, -1764.911, 5448.846, -12.42814, 1.204277, 0, 0, 0, 1, 120, 255, 1), -- 180879 (Area: 3703) +(@OGUID+60 , 180777, 530, 1, 1, -1784.936, 5439.937, -12.42814, 3.351047, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 3703) +(@OGUID+61 , 180777, 530, 1, 1, -1784.008, 5435.997, -12.42814, 0.2094394, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 3703) +(@OGUID+62 , 180880, 530, 1, 1, -1789.301, 5498.034, -11.72675, 2.740162, 0, 0, 0, 1, 120, 255, 1), -- 180880 (Area: 3703) +(@OGUID+63 , 180880, 530, 1, 1, -1789.678, 5498.17, -11.71286, 1.989672, 0, 0, 0, 1, 120, 255, 1), -- 180880 (Area: 3703) +(@OGUID+64 , 180880, 530, 1, 1, -1764.493, 5448.475, -10.58786, 3.42085, 0, 0, 0, 1, 120, 255, 1), -- 180880 (Area: 3703) +(@OGUID+65 , 180880, 530, 1, 1, 9490.517, -7292.749, 15.03819, 2.740162, 0, 0, 0, 1, 120, 255, 1), -- 180880 (Area: 3487) +(@OGUID+66 , 180880, 530, 1, 1, 9490.091, -7292.49, 15.04175, 1.989672, 0, 0, 0, 1, 120, 255, 1), -- 180880 (Area: 3487) +(@OGUID+67 , 180881, 530, 1, 1, -1789.489, 5497.099, -11.74759, 6.143561, 0, 0, 0, 1, 120, 255, 1), -- 180881 (Area: 3703) +(@OGUID+68 , 180881, 530, 1, 1, -1790.061, 5497.251, -11.74064, 4.572764, 0, 0, 0, 1, 120, 255, 1), -- 180881 (Area: 3703) +(@OGUID+69 , 180881, 530, 1, 1, -1764.79, 5449.202, -10.61564, 4.799657, 0, 0, 0, 1, 120, 255, 1), -- 180881 (Area: 3703) +(@OGUID+70 , 180881, 530, 1, 1, 9489.579, -7292.59, 15.02525, 4.572764, 0, 0, 0, 1, 120, 255, 1), -- 180881 (Area: 3487) +(@OGUID+71 , 180881, 530, 1, 1, 9489.869, -7292.061, 15.01508, 6.143561, 0, 0, 0, 1, 120, 255, 1), -- 180881 (Area: 3487) +(@OGUID+72 , 180882, 530, 1, 1, -1789.633, 5497.666, -11.7337, 3.647741, 0, 0, 0, 1, 120, 255, 1), -- 180882 (Area: 3703) +(@OGUID+73 , 180882, 530, 1, 1, -1790.078, 5497.862, -11.7337, 4.956738, 0, 0, 0, 1, 120, 255, 1), -- 180882 (Area: 3703) +(@OGUID+74 , 180882, 530, 1, 1, -1764.311, 5449.006, -10.6087, 3.769912, 0, 0, 0, 1, 120, 255, 1), -- 180882 (Area: 3703) +(@OGUID+75 , 180882, 530, 1, 1, 9490.705, -7292.344, 15.01931, 4.956738, 0, 0, 0, 1, 120, 255, 1), -- 180882 (Area: 3487) +(@OGUID+76 , 180882, 530, 1, 1, 9490.47, -7292.036, 15.02789, 3.647741, 0, 0, 0, 1, 120, 255, 1), -- 180882 (Area: 3487) +(@OGUID+77 , 180883, 530, 1, 1, -1789.06, 5497.521, -11.7337, 5.654869, 0, 0, 0, 1, 120, 255, 1), -- 180883 (Area: 3703) +(@OGUID+78 , 180883, 530, 1, 1, -1764.884, 5448.252, -10.58786, 5.445428, 0, 0, 0, 1, 120, 255, 1), -- 180883 (Area: 3703) +(@OGUID+79 , 180883, 530, 1, 1, -1765.275, 5448.697, -10.6087, 5.811947, 0, 0, 0, 1, 120, 255, 1), -- 180883 (Area: 3703) +(@OGUID+80 , 180883, 530, 1, 1, 9490.114, -7293.036, 15.03141, 5.654869, 0, 0, 0, 1, 120, 255, 1), -- 180883 (Area: 3487) +(@OGUID+81 , 180888, 530, 1, 1, -1789.768, 5497.439, -12.42814, 1.937312, 0, 0, 0, 1, 120, 255, 1), -- 180888 (Area: 3703) +(@OGUID+82 , 180888, 530, 1, 1, 9489.949, -7292.669, 14.32627, 1.937312, 0, 0, 0, 1, 120, 255, 1), -- 180888 (Area: 3487) +(@OGUID+83 , 180868, 530, 1, 1, -1809.283, 5488.518, -12.42814, 0.7330382, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 3703) +(@OGUID+84 , 180868, 530, 1, 1, -1798.701, 5502.052, -12.42814, 0.7155849, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 3703) +(@OGUID+85 , 180868, 530, 1, 1, -1801.822, 5499.706, -12.42814, 0.7155849, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 3703) +(@OGUID+86 , 180868, 530, 1, 1, -1804.326, 5487.32, -12.42814, 0.7504908, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 3703) +(@OGUID+87 , 180868, 530, 1, 1, -1796.721, 5493.617, -12.42814, 0.7504908, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 3703) +(@OGUID+88 , 180868, 530, 1, 1, -1809.226, 5493.723, -12.42814, 0.7155849, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 3703) +(@OGUID+89 , 180868, 530, 1, 1, -1794.08, 5495.903, -12.42814, 0.7504908, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 3703) +(@OGUID+90 , 180868, 530, 1, 1, -1780.21, 5435.097, -12.42814, 0.2617982, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 3703) +(@OGUID+91 , 180868, 530, 1, 1, -1781.543, 5442.225, -12.42814, 0.1919852, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 3703) +(@OGUID+92 , 180868, 530, 1, 1, -1784.189, 5438.144, -12.42814, 0.2268925, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 3703) +(@OGUID+93 , 180868, 530, 1, 1, -1770.829, 5437.18, -12.42814, 0.2617982, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 3703) +(@OGUID+94 , 180868, 530, 1, 1, -1768.798, 5445.465, -12.42814, 0.1919852, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 3703) +(@OGUID+95 , 180868, 530, 1, 1, -1772.664, 5444.496, -12.42814, 0.1919852, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 3703) +(@OGUID+96 , 180868, 530, 1, 1, -1766.992, 5438.217, -12.42814, 0.2617982, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 3703) +(@OGUID+97 , 180868, 530, 1, 1, 9487.395, -7292.862, 14.32032, 0.7504908, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 3487) +(@OGUID+98 , 180868, 530, 1, 1, 9485.133, -7294.792, 14.32811, 0.7504908, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 3487) +(@OGUID+99 , 180868, 530, 1, 1, 9483.845, -7288.145, 14.27744, 0.7155849, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 3487) +(@OGUID+100, 180868, 530, 1, 1, 9478.389, -7299.729, 14.37478, 0.7504908, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 3487) +(@OGUID+101, 180868, 530, 1, 1, 9474.005, -7299.41, 14.36638, 0.7330382, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 3487) +(@OGUID+102, 180868, 530, 1, 1, 9481.45, -7289.982, 14.28201, 0.7155849, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 3487) +(@OGUID+103, 180868, 530, 1, 1, 9474.831, -7294.813, 14.31686, 0.7155849, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 3487) +(@OGUID+104, 180869, 530, 1, 1, -1808.304, 5498.599, -12.42814, 5.148723, 0, 0, 0, 1, 120, 255, 1), -- 180869 (Area: 3703) +(@OGUID+105, 180869, 530, 1, 1, -1799.88, 5487.621, -12.42814, 2.44346, 0, 0, 0, 1, 120, 255, 1), -- 180869 (Area: 3703) +(@OGUID+106, 180869, 530, 1, 1, -1778.706, 5445.924, -12.42814, 4.677484, 0, 0, 0, 1, 120, 255, 1), -- 180869 (Area: 3703) +(@OGUID+107, 180869, 530, 1, 1, -1775.92, 5433.098, -12.42814, 0.2792516, 0, 0, 0, 1, 120, 255, 1), -- 180869 (Area: 3703) +(@OGUID+108, 180869, 530, 1, 1, 9482.434, -7299.702, 14.37898, 2.44346, 0, 0, 0, 1, 120, 255, 1), -- 180869 (Area: 3487) +(@OGUID+109, 180869, 530, 1, 1, 9476.028, -7289.976, 14.26634, 5.148723, 0, 0, 0, 1, 120, 255, 1); -- 180869 (Area: 3487) + +DELETE FROM `game_event_gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+109 AND `eventEntry`=@Event; +INSERT INTO `game_event_gameobject` SELECT @Event, gameobject.guid FROM `gameobject` WHERE gameobject.guid BETWEEN @OGUID+0 AND @OGUID+109; + +-- Add missing lunar spawns +DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+17; +INSERT INTO `creature` (`guid`, `id`, `map`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `curhealth`) VALUES +(@CGUID+0 , 15892, 530, -1781.75, 5438.715, -12.34481, 0.2617994, 120, 0), -- 15892 (Area: 3703) +(@CGUID+1 , 15892, 530, -1775.563, 5444.455, -12.34481, 4.223697, 120, 0), -- 15892 (Area: 3703) +(@CGUID+2 , 15892, 530, -1773.548, 5436.28, -12.3448, 2.495821, 120, 0), -- 15892 (Area: 3703) +(@CGUID+3 , 15898, 530, -1790.075, 5499.826, -12.34481, 0.6981317, 120, 0), -- 15898 (Area: 3703) +(@CGUID+4 , 15898, 530, -1763.572, 5447.717, -12.34481, 0.2268928, 120, 0), -- 15898 (Area: 3703) (Auras: ) +(@CGUID+5 , 15898, 530, 9490.617, -7290.235, 14.39641, 0.6981317, 120, 0), -- 15898 (Area: 3487) +(@CGUID+6 , 15895, 530, -1794.924, 5506.388, -12.34481, 0.6806784, 120, 0), -- 15895 (Area: 3703) +(@CGUID+7 , 15895, 530, -1762.115, 5439.025, -12.34481, 0.3316126, 120, 0), -- 15895 (Area: 3703) (Auras: ) +(@CGUID+8 , 15895, 530, 9487.328, -7285.737, 14.37371, 0.6806784, 120, 0), -- 15895 (Area: 3487) +(@CGUID+9 , 15891, 530, -1799.079, 5491.603, -12.34481, 2.879793, 120, 0), -- 15891 (Area: 3703) +(@CGUID+10, 15891, 530, -1804.241, 5498.248, -12.34481, 4.694936, 120, 0), -- 15891 (Area: 3703) +(@CGUID+11, 15891, 530, -1807.636, 5489.974, -12.34481, 0.7504916, 120, 0), -- 15891 (Area: 3703) +(@CGUID+12, 15891, 530, 9483.579, -7296.714, 14.43082, 2.879793, 120, 0), -- 15891 (Area: 3487) +(@CGUID+13, 15891, 530, 9479.115, -7290.209, 14.36029, 4.694936, 120, 0), -- 15891 (Area: 3487) +(@CGUID+14, 15891, 530, 9475.681, -7297.988, 14.43598, 0.7504916, 120, 0), -- 15891 (Area: 3487) +(@CGUID+15, 15897, 530, -1804.344, 5492.794, -12.34481, 5.375614, 120, 0), -- 15897 (Area: 3703) (Auras: 25824 - 25824) +(@CGUID+16, 15897, 530, -1778.063, 5439.687, -12.34481, 4.415683, 120, 0), -- 15897 (Area: 3703) (Auras: 25824 - 25824) +(@CGUID+17, 15897, 530, 9479.258, -7295.212, 14.4095, 4.39823, 120, 0); -- 15897 (Area: 3487) (Auras: 25824 - 25824) + +DELETE FROM `game_event_creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+17 AND `eventEntry`=@Event; +INSERT INTO `game_event_creature` SELECT @Event, creature.guid FROM `creature` WHERE creature.guid BETWEEN @CGUID+0 AND @CGUID+17; diff --git a/sql/updates/world/2016_02_12_00_world.sql b/sql/updates/world/2016_02_12_00_world.sql new file mode 100644 index 00000000000..af599148e04 --- /dev/null +++ b/sql/updates/world/2016_02_12_00_world.sql @@ -0,0 +1,7 @@ +-- +-- Spawn creature ID 16399 Bloodsail Traitor: +SET @CGUID := 1528; -- selected by TC team + +DELETE FROM `creature` WHERE `id` = 16399; +INSERT INTO `creature` (`guid`,`id`,`map`,`zoneId`,`areaId`,`spawnMask`,`phaseMask`,`modelid`,`equipment_id`,`position_x`,`position_y`,`position_z`,`orientation`,`spawntimesecs`,`spawndist`,`currentwaypoint`,`curhealth`,`curmana`,`MovementType`,`npcflag`,`unit_flags`,`dynamicflags`,`VerifiedBuild`) VALUES +(@CGUID, 16399, 0, 0, 0, 1, 1, 2557, 1, -14184.4, 192.764, 20.6905, 3.735, 300, 0, 0, 2059, 0, 0, 0, 0, 0, 0); diff --git a/sql/updates/world/2016_02_13_00_world.sql b/sql/updates/world/2016_02_13_00_world.sql new file mode 100644 index 00000000000..2341e33a8b5 --- /dev/null +++ b/sql/updates/world/2016_02_13_00_world.sql @@ -0,0 +1,4 @@ +SET @ENTRY:=23258; +SET @AURA:=40670; +DELETE FROM `creature_template_addon` WHERE `entry` = @ENTRY; +INSERT INTO `creature_template_addon` (`entry`, `auras`) VALUES (@ENTRY, @AURA); diff --git a/sql/updates/world/2016_02_13_01_world.sql b/sql/updates/world/2016_02_13_01_world.sql new file mode 100644 index 00000000000..29f94a9f41d --- /dev/null +++ b/sql/updates/world/2016_02_13_01_world.sql @@ -0,0 +1,206 @@ +SET @OGUID:=79877; +SET @Event:=7; + +-- Add missing lunar objects +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+152; +INSERT INTO `gameobject` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`) VALUES +(@OGUID+0 , 180879, 1, 1, 1, 7593.807, -2222.592, 469.1576, 3.804818, 0, 0, 0, 1, 120, 255, 1), -- 180879 (Area: 493) +(@OGUID+1 , 180879, 1, 1, 1, 7595.46, -2226.798, 468.3849, 4.76475, 0, 0, 0, 1, 120, 255, 1), -- 180879 (Area: 493) +(@OGUID+2 , 180879, 1, 1, 1, 7592.46, -2218.003, 469.6433, 2.199115, 0, 0, 0, 1, 120, 255, 1), -- 180879 (Area: 493) +(@OGUID+3 , 180880, 1, 1, 1, 7593.197, -2221.986, 470.9921, 2.321287, 0, 0, 0, 1, 120, 255, 1), -- 180880 (Area: 493) +(@OGUID+4 , 180880, 1, 1, 1, 7596.01, -2226.955, 470.215, 4.782203, 0, 0, 0, 1, 120, 255, 1), -- 180880 (Area: 493) +(@OGUID+5 , 180880, 1, 1, 1, 7591.976, -2217.98, 471.4845, 1.466076, 0, 0, 0, 1, 120, 255, 1), -- 180880 (Area: 493) +(@OGUID+6 , 180880, 1, 1, 1, 7593.209, -2218.238, 471.4679, 4.450591, 0, 0, 0, 1, 120, 255, 1), -- 180880 (Area: 493) +(@OGUID+7 , 180881, 1, 1, 1, 7595.163, -2227.192, 470.1959, 4.136433, 0, 0, 0, 1, 120, 255, 1), -- 180881 (Area: 493) +(@OGUID+8 , 180881, 1, 1, 1, 7594.063, -2222.041, 470.9863, 3.595379, 0, 0, 0, 1, 120, 255, 1), -- 180881 (Area: 493) +(@OGUID+9 , 180881, 1, 1, 1, 7595.476, -2226.666, 470.2082, 2.024579, 0, 0, 0, 1, 120, 255, 1), -- 180881 (Area: 493) +(@OGUID+10 , 180881, 1, 1, 1, 7592.764, -2218.324, 471.472, 5.393069, 0, 0, 0, 1, 120, 255, 1), -- 180881 (Area: 493) +(@OGUID+11 , 180881, 1, 1, 1, 7592.445, -2217.559, 471.4581, 0.7330382, 0, 0, 0, 1, 120, 255, 1), -- 180881 (Area: 493) +(@OGUID+12 , 180882, 1, 1, 1, 7593.618, -2221.826, 470.969, 6.108654, 0, 0, 0, 1, 120, 255, 1), -- 180882 (Area: 493) +(@OGUID+13 , 180882, 1, 1, 1, 7595.62, -2227.267, 470.2169, 3.961899, 0, 0, 0, 1, 120, 255, 1), -- 180882 (Area: 493) +(@OGUID+14 , 180882, 1, 1, 1, 7595.934, -2226.421, 470.1891, 1.710422, 0, 0, 0, 1, 120, 255, 1), -- 180882 (Area: 493) +(@OGUID+15 , 180882, 1, 1, 1, 7592.151, -2218.304, 471.4556, 2.18166, 0, 0, 0, 1, 120, 255, 1), -- 180882 (Area: 493) +(@OGUID+16 , 180882, 1, 1, 1, 7592.401, -2218.573, 471.4416, 2.91469, 0, 0, 0, 1, 120, 255, 1), -- 180882 (Area: 493) +(@OGUID+17 , 180883, 1, 1, 1, 7595.268, -2226.156, 470.2048, 3.246347, 0, 0, 0, 1, 120, 255, 1), -- 180883 (Area: 493) +(@OGUID+18 , 180883, 1, 1, 1, 7594.821, -2226.714, 470.1994, 0.2792516, 0, 0, 0, 1, 120, 255, 1), -- 180883 (Area: 493) +(@OGUID+19 , 180883, 1, 1, 1, 7593.012, -2217.75, 471.4669, 3.124123, 0, 0, 0, 1, 120, 255, 1), -- 180883 (Area: 493) +(@OGUID+20 , 180851, 1, 1, 1, 7564.366, -2224.284, 475.4654, 5.148725, 0, 0, 0, 1, 120, 255, 1), -- 180851 (Area: 493) +(@OGUID+21 , 180851, 1, 1, 1, 7600.833, -2219.168, 473.4156, 1.274088, 0, 0, 0, 1, 120, 255, 1), -- 180851 (Area: 493) +(@OGUID+22 , 180851, 1, 1, 1, 7588.353, -2200.221, 479.1006, 4.20625, 0, 0, 0, 1, 120, 255, 1), -- 180851 (Area: 493) +(@OGUID+23 , 180851, 1, 1, 1, 7592.721, -2256.181, 467.8657, 1.326448, 0, 0, 0, 1, 120, 255, 1), -- 180851 (Area: 493) +(@OGUID+24 , 180851, 1, 1, 1, 7600.807, -2205.065, 476.8404, 5.061459, 0, 0, 0, 1, 120, 255, 1), -- 180851 (Area: 493) +(@OGUID+25 , 180851, 1, 1, 1, 7588.353, -2200.221, 479.1006, 4.20625, 0, 0, 0, 1, 120, 255, 1), -- 180851 (Area: 493) +(@OGUID+26 , 180851, 1, 1, 1, 7612.306, -2222.548, 473.3903, 4.468043, 0, 0, 0, 1, 120, 255, 1), -- 180851 (Area: 493) +(@OGUID+27 , 180851, 1, 1, 1, 7577.153, -2226.377, 475.8007, 1.937312, 0, 0, 0, 1, 120, 255, 1), -- 180851 (Area: 493) +(@OGUID+28 , 180851, 1, 1, 1, 7573.452, -2244.367, 470.6506, 1.291542, 0, 0, 0, 1, 120, 255, 1), -- 180851 (Area: 493) +(@OGUID+29 , 180851, 1, 1, 1, 7588.164, -2211.207, 476.1555, 2.024579, 0, 0, 0, 1, 120, 255, 1), -- 180851 (Area: 493) +(@OGUID+30 , 180851, 1, 1, 1, 7581.566, -2236.441, 474.0557, 3.455756, 0, 0, 0, 1, 120, 255, 1), -- 180851 (Area: 493) +(@OGUID+31 , 180851, 1, 1, 1, 7607.799, -2215.778, 473.6258, 2.373644, 0, 0, 0, 1, 120, 255, 1), -- 180851 (Area: 493) +(@OGUID+32 , 180851, 1, 1, 1, 7592.721, -2256.181, 467.8657, 1.326448, 0, 0, 0, 1, 120, 255, 1), -- 180851 (Area: 493) +(@OGUID+33 , 180851, 1, 1, 1, 7579.257, -2243.993, 471.6541, 2.18166, 0, 0, 0, 1, 120, 255, 1), -- 180851 (Area: 493) +(@OGUID+34 , 180851, 1, 1, 1, 7612.306, -2222.548, 473.3903, 4.468043, 0, 0, 0, 1, 120, 255, 1), -- 180851 (Area: 493) +(@OGUID+35 , 180851, 1, 1, 1, 7600.601, -2238.859, 470.7188, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180851 (Area: 493) +(@OGUID+36 , 180851, 1, 1, 1, 7588.164, -2211.207, 476.1555, 2.024579, 0, 0, 0, 1, 120, 255, 1), -- 180851 (Area: 493) +(@OGUID+37 , 180851, 1, 1, 1, 7617.579, -2233.563, 470.0322, 2.548179, 0, 0, 0, 1, 120, 255, 1), -- 180851 (Area: 493) +(@OGUID+38 , 180861, 1, 1, 1, 7575.579, -2210.406, 481.6616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180861 (Area: 493) +(@OGUID+39 , 180861, 1, 1, 1, 7575.579, -2213.406, 486.1616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180861 (Area: 493) +(@OGUID+40 , 180861, 1, 1, 1, 7575.579, -2213.406, 477.1616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180861 (Area: 493) +(@OGUID+41 , 180861, 1, 1, 1, 7575.579, -2210.406, 481.6616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180861 (Area: 493) +(@OGUID+42 , 180861, 1, 1, 1, 7575.579, -2213.406, 486.1616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180861 (Area: 493) +(@OGUID+43 , 180861, 1, 1, 1, 7575.579, -2213.406, 477.1616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180861 (Area: 493) +(@OGUID+44 , 180861, 1, 1, 1, 7575.579, -2213.406, 477.1616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180861 (Area: 493) +(@OGUID+45 , 180861, 1, 1, 1, 7575.579, -2213.406, 486.1616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180861 (Area: 493) +(@OGUID+46 , 180861, 1, 1, 1, 7575.579, -2210.406, 481.6616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180861 (Area: 493) +(@OGUID+47 , 180861, 1, 1, 1, 7575.579, -2210.406, 481.6616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180861 (Area: 493) +(@OGUID+48 , 180861, 1, 1, 1, 7575.579, -2213.406, 486.1616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180861 (Area: 493) +(@OGUID+49 , 180861, 1, 1, 1, 7575.579, -2213.406, 477.1616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180861 (Area: 493) +(@OGUID+50 , 180861, 1, 1, 1, 7575.579, -2213.406, 486.1616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180861 (Area: 493) +(@OGUID+51 , 180861, 1, 1, 1, 7575.579, -2213.406, 477.1616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180861 (Area: 493) +(@OGUID+52 , 180861, 1, 1, 1, 7575.579, -2210.406, 481.6616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180861 (Area: 493) +(@OGUID+53 , 180861, 1, 1, 1, 7575.579, -2213.406, 477.1616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180861 (Area: 493) +(@OGUID+54 , 180861, 1, 1, 1, 7575.579, -2213.406, 486.1616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180861 (Area: 493) +(@OGUID+55 , 180861, 1, 1, 1, 7575.579, -2210.406, 481.6616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180861 (Area: 493) +(@OGUID+56 , 180861, 1, 1, 1, 7575.579, -2210.406, 481.6616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180861 (Area: 493) +(@OGUID+57 , 180861, 1, 1, 1, 7575.579, -2213.406, 486.1616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180861 (Area: 493) +(@OGUID+58 , 180861, 1, 1, 1, 7575.579, -2213.406, 477.1616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180861 (Area: 493) +(@OGUID+59 , 180861, 1, 1, 1, 7575.579, -2210.406, 481.6616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180861 (Area: 493) +(@OGUID+60 , 180861, 1, 1, 1, 7575.579, -2213.406, 486.1616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180861 (Area: 493) +(@OGUID+61 , 180861, 1, 1, 1, 7575.579, -2213.406, 477.1616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180861 (Area: 493) +(@OGUID+62 , 180861, 1, 1, 1, 7575.579, -2213.406, 477.1616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180861 (Area: 493) +(@OGUID+63 , 180861, 1, 1, 1, 7575.579, -2213.406, 486.1616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180861 (Area: 493) +(@OGUID+64 , 180861, 1, 1, 1, 7575.579, -2210.406, 481.6616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180861 (Area: 493) +(@OGUID+65 , 180864, 1, 1, 1, 7580.829, -2214.906, 481.6616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180864 (Area: 493) +(@OGUID+66 , 180864, 1, 1, 1, 7570.329, -2214.906, 481.6616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180864 (Area: 493) +(@OGUID+67 , 180864, 1, 1, 1, 7580.829, -2214.906, 481.6616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180864 (Area: 493) +(@OGUID+68 , 180864, 1, 1, 1, 7570.329, -2214.906, 481.6616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180864 (Area: 493) +(@OGUID+69 , 180864, 1, 1, 1, 7570.329, -2214.906, 481.6616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180864 (Area: 493) +(@OGUID+70 , 180864, 1, 1, 1, 7580.829, -2214.906, 481.6616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180864 (Area: 493) +(@OGUID+71 , 180864, 1, 1, 1, 7570.329, -2214.906, 481.6616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180864 (Area: 493) +(@OGUID+72 , 180864, 1, 1, 1, 7580.829, -2214.906, 481.6616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180864 (Area: 493) +(@OGUID+73 , 180864, 1, 1, 1, 7580.829, -2214.906, 481.6616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180864 (Area: 493) +(@OGUID+74 , 180864, 1, 1, 1, 7570.329, -2214.906, 481.6616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180864 (Area: 493) +(@OGUID+75 , 180864, 1, 1, 1, 7570.329, -2214.906, 481.6616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180864 (Area: 493) +(@OGUID+76 , 180864, 1, 1, 1, 7580.829, -2214.906, 481.6616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180864 (Area: 493) +(@OGUID+77 , 180864, 1, 1, 1, 7580.829, -2214.906, 481.6616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180864 (Area: 493) +(@OGUID+78 , 180864, 1, 1, 1, 7570.329, -2214.906, 481.6616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180864 (Area: 493) +(@OGUID+79 , 180864, 1, 1, 1, 7580.829, -2214.906, 481.6616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180864 (Area: 493) +(@OGUID+80 , 180864, 1, 1, 1, 7570.329, -2214.906, 481.6616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180864 (Area: 493) +(@OGUID+81 , 180864, 1, 1, 1, 7580.829, -2214.906, 481.6616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180864 (Area: 493) +(@OGUID+82 , 180864, 1, 1, 1, 7570.329, -2214.906, 481.6616, 4.084075, 0, 0, 0, 1, 120, 255, 1), -- 180864 (Area: 493) +(@OGUID+83 , 180769, 1, 1, 1, 7879.087, -2219.161, 479.2853, 5.689774, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 2362) +(@OGUID+84 , 180769, 1, 1, 1, 7837.341, -2197, 478.0439, 2.548179, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 2362) +(@OGUID+85 , 180769, 1, 1, 1, 7868.952, -2191.253, 486.3665, 0.9075702, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 2362) +(@OGUID+86 , 180879, 1, 1, 1, 7946.622, -2621.156, 492.3542, 1.850049, 0, 0, 0, 1, 120, 255, 1), -- 180879 (Area: 2361) +(@OGUID+87 , 180909, 1, 1, 1, 7946.665, -2621.123, 494.2065, 2.775069, 0, 0, 0, 1, 120, 255, 1), -- 180909 (Area: 2361) +(@OGUID+88 , 180909, 1, 1, 1, 7946.252, -2621.753, 494.1519, 6.161013, 0, 0, 0, 1, 120, 255, 1), -- 180909 (Area: 2361) +(@OGUID+89 , 180909, 1, 1, 1, 7946.777, -2621.559, 494.1994, 3.263772, 0, 0, 0, 1, 120, 255, 1), -- 180909 (Area: 2361) +(@OGUID+90 , 180909, 1, 1, 1, 7947.238, -2621.351, 494.1782, 3.822273, 0, 0, 0, 1, 120, 255, 1), -- 180909 (Area: 2361) +(@OGUID+91 , 180777, 1, 1, 1, 7951.528, -2615.867, 492.9226, 1.710422, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 2361) +(@OGUID+92 , 180777, 1, 1, 1, 7948.855, -2629.297, 493.1261, 1.361356, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 2361) +(@OGUID+93 , 180910, 1, 1, 1, 7946.681, -2621.326, 494.1927, 5.131269, 0, 0, 0, 1, 120, 255, 1), -- 180910 (Area: 2361) +(@OGUID+94 , 188215, 1, 1, 1, 7947.822, -2622.942, 492.8509, 2.809975, 0, 0, 0, 1, 120, 255, 1), -- 188215 (Area: 2361) - !!! might be temporary spawn !!! +(@OGUID+95 , 188215, 1, 1, 1, 7948.878, -2619.704, 492.7197, 2.303831, 0, 0, 0, 1, 120, 255, 1), -- 188215 (Area: 2361) - !!! might be temporary spawn !!! +(@OGUID+96 , 180764, 1, 1, 1, 7781.23, -2437.568, 494.049, 6.003934, 0, 0, 0, 1, 120, 255, 1), -- 180764 (Area: 2361) +(@OGUID+97 , 180769, 1, 1, 1, 7797.483, -2417.394, 497.058, 1.937312, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 2361) +(@OGUID+98 , 180769, 1, 1, 1, 7439.099, -2809.767, 473.9281, 3.508117, 0, 0, 0, 1, 120, 255, 1), -- 180769 (Area: 656) +(@OGUID+99 , 180777, 1, 1, 1, 7619.005, -2221.212, 469.807, 0.8377575, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 0) +(@OGUID+100, 180777, 1, 1, 1, 7586.018, -2220.791, 471.5764, 2.408554, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 0) +(@OGUID+101, 180777, 1, 1, 1, 7591.077, -2214.273, 471.4059, 5.689774, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 0) +(@OGUID+102, 180777, 1, 1, 1, 7585.201, -2209.946, 473.8624, 5.532695, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 0) +(@OGUID+103, 180777, 1, 1, 1, 7580.083, -2215.166, 473.3982, 2.391098, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 0) +(@OGUID+104, 180777, 1, 1, 1, 7587.347, -2196.992, 476.204, 1.343901, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 0) +(@OGUID+105, 180777, 1, 1, 1, 7562.486, -2227.179, 471.6295, 3.595379, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 0) +(@OGUID+106, 180777, 1, 1, 1, 7571.573, -2207.698, 474.8347, 2.321287, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 0) +(@OGUID+107, 180777, 1, 1, 1, 7577.507, -2201.813, 475.4521, 5.532695, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 0) +(@OGUID+108, 180777, 1, 1, 1, 7497.841, -2203.225, 480.2202, 6.248279, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 0) +(@OGUID+109, 180777, 1, 1, 1, 7499.098, -2191.63, 480.452, 3.054327, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 0) +(@OGUID+110, 180777, 1, 1, 1, 7937.66, -2362.064, 488.5504, 4.642576, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 2362) +(@OGUID+111, 180777, 1, 1, 1, 7971.51, -2352.85, 488.2709, 1.727875, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 2362) +(@OGUID+112, 180777, 1, 1, 1, 7993.134, -2468.059, 489.5084, 3.124123, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 2361) +(@OGUID+113, 180777, 1, 1, 1, 7960.454, -2515.816, 485.9554, 5.340709, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 2361) +(@OGUID+114, 180777, 1, 1, 1, 7925.333, -2550.147, 486.0686, 4.101525, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 2361) +(@OGUID+115, 180777, 1, 1, 1, 7951.528, -2615.867, 492.9226, 1.710422, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 2361) +(@OGUID+116, 180777, 1, 1, 1, 7948.855, -2629.297, 493.1261, 1.361356, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 2361) +(@OGUID+117, 180777, 1, 1, 1, 7530.31, -2850.198, 458.604, 2.513274, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 656) +(@OGUID+118, 180777, 1, 1, 1, 7532.818, -2852.513, 458.175, 2.321287, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 656) +(@OGUID+119, 180777, 1, 1, 1, 7562.452, -2873.018, 460.911, 2.530723, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 656) +(@OGUID+120, 180777, 1, 1, 1, 7559.907, -2871.458, 460.6194, 2.583081, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 656) +(@OGUID+121, 180875, 1, 1, 1, 7531.745, -2851.107, 457.8172, 2.408554, 0, 0, 0, 1, 120, 255, 1), -- 180875 (Area: 656) +(@OGUID+122, 180875, 1, 1, 1, 7561.202, -2872.201, 459.9906, 2.583081, 0, 0, 0, 1, 120, 255, 1), -- 180875 (Area: 656) +(@OGUID+123, 180773, 1, 1, 1, 7562.604, -2903.484, 462.9012, 1.413715, 0, 0, 0, 1, 120, 255, 1), -- 180773 (Area: 656) +(@OGUID+124, 180773, 1, 1, 1, 7570.199, -2903.755, 462.812, 1.640607, 0, 0, 0, 1, 120, 255, 1), -- 180773 (Area: 656) +(@OGUID+125, 180765, 1, 1, 1, 7478.559, -2652.309, 455.1449, 3.822273, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 656) +(@OGUID+126, 180765, 1, 1, 1, 7532.16, -2467.022, 455.5912, 0.8552105, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 0) +(@OGUID+127, 180766, 1, 1, 1, 7572.346, -2366.04, 454.7335, 4.01426, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 0) +(@OGUID+128, 180766, 1, 1, 1, 7535.119, -2436.779, 453.7722, 1.291542, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 0) +(@OGUID+129, 180766, 1, 1, 1, 7528.662, -2481.222, 454.3387, 4.32842, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 0) +(@OGUID+130, 180766, 1, 1, 1, 7499.897, -2487.684, 457.2921, 3.106652, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 0) +(@OGUID+131, 180766, 1, 1, 1, 7520.417, -2504.377, 454.1295, 4.276057, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 0) +(@OGUID+132, 180766, 1, 1, 1, 7479.219, -2479.521, 461.8409, 0.1745321, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 0) +(@OGUID+133, 180766, 1, 1, 1, 7497.929, -2564.247, 454.2826, 4.258607, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 656) +(@OGUID+134, 180766, 1, 1, 1, 7496.524, -2532.186, 452.8313, 0.9424766, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 656) +(@OGUID+135, 180766, 1, 1, 1, 7464.938, -2691.611, 454.3436, 1.396262, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 656) +(@OGUID+136, 180766, 1, 1, 1, 7475.028, -2597.744, 452.8322, 1.239183, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 656) +(@OGUID+137, 180766, 1, 1, 1, 7483.91, -2632.364, 453.8647, 4.415683, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 656) +(@OGUID+138, 180766, 1, 1, 1, 7463.901, -2741.921, 459.2945, 1.396262, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 656) +(@OGUID+139, 180766, 1, 1, 1, 7494.413, -2822.02, 461.3461, 4.991644, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 656) +(@OGUID+140, 180766, 1, 1, 1, 7481.923, -2829.692, 461.2198, 1.745327, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 656) +(@OGUID+141, 180766, 1, 1, 1, 7461.356, -2813.827, 462.3748, 1.797689, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 656) +(@OGUID+142, 180766, 1, 1, 1, 7474.328, -2795.222, 462.4803, 4.625124, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 656) +(@OGUID+143, 180766, 1, 1, 1, 7461.583, -2802.854, 462.1353, 1.396262, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 656) +(@OGUID+144, 180766, 1, 1, 1, 7475.494, -2750.214, 460.2916, 4.625124, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 656) +(@OGUID+145, 180766, 1, 1, 1, 7533.194, -2849.556, 456.259, 5.585054, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 656) +(@OGUID+146, 180766, 1, 1, 1, 7560.079, -2900.277, 460.4167, 2.949595, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 656) +(@OGUID+147, 180766, 1, 1, 1, 7562.421, -2870.49, 458.3398, 5.742135, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 656) +(@OGUID+148, 180766, 1, 1, 1, 7572.878, -2900.665, 460.2018, 3.159062, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 656) +(@OGUID+149, 180767, 1, 1, 1, 7472.893, -2651.321, 455.1381, 5.480334, 0, 0, 0, 1, 120, 255, 1), -- 180767 (Area: 656) +(@OGUID+150, 180767, 1, 1, 1, 7526.87, -2464.803, 455.183, 0.087266, 0, 0, 0, 1, 120, 255, 1), -- 180767 (Area: 0) +(@OGUID+151, 180767, 1, 1, 1, 7553.503, -2401.662, 456.9937, 1.483528, 0, 0, 0, 1, 120, 255, 1), -- 180767 (Area: 0) +(@OGUID+152, 180767, 1, 1, 1, 7547.994, -2399.728, 456.7213, 0.8203033, 0, 0, 0, 1, 120, 255, 1); -- 180767 (Area: 0) + +DELETE FROM `game_event_gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+152 AND `eventEntry`=@Event; +INSERT INTO `game_event_gameobject` SELECT @Event, gameobject.guid FROM `gameobject` WHERE gameobject.guid BETWEEN @OGUID+0 AND @OGUID+152; + +UPDATE `creature_addon` SET `emote`=0 WHERE `guid` IN (91639, 91644, 91657, 91658, 91663, 91669, 91671, 91676); + +-- Darnassus Reveler SAI +SET @ENTRY := 15905; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY 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 +(@ENTRY,0,0,0,1,0,100,0,5000,5000,5000,10000,10,11,94,0,0,0,0,1,0,0,0,0,0,0,0,"Darnassus Reveler - Out of Combat - Play Random Emote (11, 94)"); + +-- Ironforge Reveler SAI +SET @ENTRY := 15906; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY 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 +(@ENTRY,0,0,0,1,0,100,0,5000,5000,5000,10000,10,11,94,0,0,0,0,1,0,0,0,0,0,0,0,"Ironforge Reveler - Out of Combat - Play Random Emote (11, 94)"); + +-- Stormwind Reveler SAI +SET @ENTRY := 15694; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY 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 +(@ENTRY,0,0,0,1,0,100,0,5000,5000,5000,10000,10,11,94,0,0,0,0,1,0,0,0,0,0,0,0,"Stormwind Reveler - Out of Combat - Play Random Emote (11, 94)"); + +-- Orgrimmar Reveler SAI +SET @ENTRY := 15908; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY 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 +(@ENTRY,0,0,0,1,0,100,0,5000,5000,5000,10000,10,11,94,0,0,0,0,1,0,0,0,0,0,0,0,"Orgrimmar Reveler - Out of Combat - Play Random Emote (11, 94)"); + +-- Thunder Bluff Reveler SAI +SET @ENTRY := 15719; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY 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 +(@ENTRY,0,0,0,1,0,100,0,5000,5000,5000,10000,10,11,94,0,0,0,0,1,0,0,0,0,0,0,0,"Thunder Bluff Reveler - Out of Combat - Play Random Emote (11, 94)"); + +-- Undercity Reveler SAI +SET @ENTRY := 15907; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY 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 +(@ENTRY,0,0,0,1,0,100,0,5000,5000,5000,10000,10,11,94,0,0,0,0,1,0,0,0,0,0,0,0,"Undercity Reveler - Out of Combat - Play Random Emote (11, 94)"); diff --git a/sql/updates/world/2016_02_13_02_world.sql b/sql/updates/world/2016_02_13_02_world.sql new file mode 100644 index 00000000000..5a4633fee41 --- /dev/null +++ b/sql/updates/world/2016_02_13_02_world.sql @@ -0,0 +1,74 @@ +-- Update aura for Manifest Nightmare +UPDATE `creature_template_addon` SET `auras`='39579 37509' WHERE `entry`=22889; +-- Update aura for Phantasmal Lash +UPDATE `creature_template_addon` SET `auras`='34427' WHERE `entry`=22902; + +-- Pathing for Moonglade Warden Entry: 11822 'TDB FORMAT' +SET @NPC := 42393; +SET @PATH := @NPC * 10; +UPDATE `creature` SET `spawndist`=0,`MovementType`=2,`position_x`=7546.649,`position_y`=-2901.733,`position_z`=462.5362 WHERE `guid`=@NPC; +DELETE FROM `creature_addon` WHERE `guid`=@NPC; +INSERT INTO `creature_addon` (`guid`,`path_id`,`mount`,`bytes1`,`bytes2`,`emote`,`auras`) VALUES (@NPC,@PATH,0,0,1,0, ''); +DELETE FROM `waypoint_data` WHERE `id`=@PATH; +INSERT INTO `waypoint_data` (`id`,`point`,`position_x`,`position_y`,`position_z`,`orientation`,`delay`,`move_type`,`action`,`action_chance`,`wpguid`) VALUES +(@PATH,1,7546.649,-2901.733,462.5362,0,0,0,0,100,0), -- 13:28:53 +(@PATH,2,7528.728,-2908.457,461.338,0,0,0,0,100,0), -- 13:28:57 +(@PATH,3,7517.918,-2920.282,461.923,0,0,0,0,100,0), -- 13:29:03 +(@PATH,4,7512.568,-2933.285,464.4847,0,0,0,0,100,0), -- 13:29:09 +(@PATH,5,7509.731,-2947.129,463.4818,0,0,0,0,100,0), -- 13:29:15 +(@PATH,6,7510.136,-2952.441,461.5912,0,0,0,0,100,0), -- 13:29:20 +(@PATH,7,7511.554,-2961.568,462.0287,0,0,0,0,100,0), -- 13:29:26 +(@PATH,8,7529.275,-2970.313,461.0047,0,0,0,0,100,0), -- 13:29:30 +(@PATH,9,7534.475,-2972.501,460.6516,0,0,0,0,100,0), -- 13:29:36 +(@PATH,10,7542.61,-2984.713,461.6914,0,0,0,0,100,0), -- 13:29:41 +(@PATH,11,7541.939,-2996.007,464.5852,0,0,0,0,100,0), -- 13:29:44 +(@PATH,12,7537.476,-3005.4,466.0187,0,0,0,0,100,0), -- 13:29:47 +(@PATH,13,7535.565,-3017.812,466.2273,0,0,0,0,100,0), -- 13:29:52 +(@PATH,14,7550.125,-3028.802,462.2839,0,0,0,0,100,0), -- 13:29:57 +(@PATH,15,7566.678,-3023.841,461.0449,0,0,0,0,100,0), -- 13:30:05 +(@PATH,16,7574.592,-3019.921,460.4108,0,0,0,0,100,0), -- 13:30:16 +(@PATH,17,7580.481,-3005.122,461.308,0,0,0,0,100,0), -- 13:30:19 +(@PATH,18,7581.311,-2996.924,462.5332,0,0,0,0,100,0), -- 13:30:23 +(@PATH,19,7589.289,-2980.43,460.9365,0,0,0,0,100,0), -- 13:30:28 +(@PATH,20,7589.837,-2979.668,460.4661,0,0,0,0,100,0), -- 13:30:33 +(@PATH,21,7606.989,-2972.392,461.5837,0,0,0,0,100,0), -- 13:30:37 +(@PATH,22,7617.824,-2965.905,461.3898,0,0,0,0,100,0), -- 13:30:43 +(@PATH,23,7620.032,-2963.793,461.5444,0,0,0,0,100,0), -- 13:30:47 +(@PATH,24,7653.39,-2955.129,463.8018,0,0,0,0,100,0), -- 13:30:51 +(@PATH,25,7668.529,-2958.117,464.894,0,0,0,0,100,0), -- 13:31:05 +(@PATH,26,7652.024,-2942.818,463.3503,0,0,0,0,100,0), -- 13:31:13 +(@PATH,27,7648.988,-2940.365,462.6953,0,0,0,0,100,0), -- 13:31:24 +(@PATH,28,7623.73,-2923.926,462.5015,0,0,0,0,100,0), -- 13:31:36 +(@PATH,29,7596.945,-2907.005,462.287,0,0,0,0,100,0), -- 13:31:43 +(@PATH,30,7589.421,-2904.872,461.6304,0,0,0,0,100,0), -- 13:31:51 +(@PATH,31,7591.465,-2904.978,461.9995,0,0,0,0,100,0), -- 13:31:58 +(@PATH,32,7600.53,-2909.323,462.908,0,0,0,0,100,0), -- 13:32:02 +(@PATH,33,7610.539,-2915.46,462.7303,0,0,0,0,100,0), -- 13:32:10 +(@PATH,34,7623.934,-2924.251,462.4937,0,0,0,0,100,0), -- 13:32:16 +(@PATH,35,7670.327,-2956.833,465.3539,0,0,0,0,100,0), -- 13:32:28 +(@PATH,36,7656.929,-2955.638,464.1862,0,0,0,0,100,0), -- 13:32:40 +(@PATH,37,7622.145,-2953.092,462.1255,0,0,0,0,100,0), -- 13:32:49 +(@PATH,38,7621.655,-2953.013,461.7986,0,0,0,0,100,0), -- 13:33:01 +(@PATH,39,7615.943,-2966.924,461.1361,0,0,0,0,100,0), -- 13:33:06 +(@PATH,40,7603.335,-2972.608,460.9927,0,0,0,0,100,0), -- 13:33:12 +(@PATH,41,7598.073,-2973.764,460.5677,0,0,0,0,100,0), -- 13:33:16 +(@PATH,42,7584.056,-2987.697,461.8174,0,0,0,0,100,0), -- 13:33:20 +(@PATH,43,7581.24,-2999.696,462.0973,0,0,0,0,100,0), -- 13:33:25 +(@PATH,44,7580.043,-3009.624,460.9475,0,0,0,0,100,0), -- 13:33:29 +(@PATH,45,7579.715,-3010.909,460.7065,0,0,0,0,100,0), -- 13:33:34 +(@PATH,46,7556.479,-3028.306,461.8019,0,0,0,0,100,0), -- 13:33:38 +(@PATH,47,7535.963,-3018.814,465.7519,0,0,0,0,100,0), -- 13:33:48 +(@PATH,48,7541.39,-2997.226,464.9632,0,0,0,0,100,0), -- 13:34:01 +(@PATH,49,7544.303,-2989.159,462.7299,0,0,0,0,100,0), -- 13:34:06 +(@PATH,50,7542.205,-2983.293,461.2471,0,0,0,0,100,0), -- 13:34:09 +(@PATH,51,7540.801,-2981.162,461.0032,0,0,0,0,100,0), -- 13:34:13 +(@PATH,52,7521.677,-2967.251,461.8644,0,0,0,0,100,0), -- 13:34:17 +(@PATH,53,7519.106,-2965.93,461.9445,0,0,0,0,100,0), -- 13:34:24 +(@PATH,54,7509.905,-2950.868,462.2672,0,0,0,0,100,0), -- 13:34:28 +(@PATH,55,7510.615,-2942.81,464.3668,0,0,0,0,100,0), -- 13:34:33 +(@PATH,56,7515.797,-2924.253,463.1058,0,0,0,0,100,0), -- 13:34:37 +(@PATH,57,7521.769,-2915.139,460.8744,0,0,0,0,100,0), -- 13:34:45 +(@PATH,58,7537.507,-2902.868,462.3076,0,0,0,0,100,0), -- 13:34:50 +(@PATH,59,7538.777,-2902.161,462.3616,0,0,0,0,100,0), -- 13:34:56 +(@PATH,60,7546.649,-2901.733,462.5362,0,0,0,0,100,0); -- 13:35:03 +-- 0x1C392000200B8B8000003800003F2E06 .go 7546.649 -2901.733 462.5362 diff --git a/sql/updates/world/2016_02_13_03_world.sql b/sql/updates/world/2016_02_13_03_world.sql new file mode 100644 index 00000000000..136a068bd9e --- /dev/null +++ b/sql/updates/world/2016_02_13_03_world.sql @@ -0,0 +1,166 @@ + +SET @CGUID := 145042; +SET @OGUID := 82917; + + +DELETE FROM `spell_area` WHERE `spell`=58139 AND `area`IN(4530,4531); +INSERT INTO `spell_area` (`spell`, `area`, `quest_start`, `quest_end`, `aura_spell`, `racemask`, `gender`, `autocast`, `quest_start_status`, `quest_end_status`) VALUES +(58139, 4531, 13144, 0, 0, 0, 2, 1, 64, 11), -- The Fleshweks after Killing two scourge with one skeleton +(58139, 4530, 13144, 0, 0, 0, 2, 1, 64, 11); -- Sanctumn on renaimation after Killing two scourge with one skeleton + +DELETE FROM `creature` WHERE `id` IN(30703,30704,31015,30697,30696,31432); +INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `MovementType`) VALUES +(@CGUID+0, 31015, 571, 1, 64, 6661.146, 3261.688, 668.9714, 4.115243, 120, 5, 1), -- 31015 (Area: 4588) (possible waypoints or random movement) +(@CGUID+1, 31015, 571, 1, 64, 6627.71, 3189.896, 647.9885, 2.84596, 120, 5, 1), -- 31015 (Area: 4588) (possible waypoints or random movement) +(@CGUID+2, 31015, 571, 1, 64, 6659.174, 3212.105, 667.0215, 0.1042775, 120, 5, 1), -- 31015 (Area: 4588) (possible waypoints or random movement) +(@CGUID+3, 31015, 571, 1, 64, 6654.514, 3239.867, 670.2061, 5.907172, 120, 5, 1), -- 31015 (Area: 4588) (possible waypoints or random movement) +(@CGUID+4, 31015, 571, 1, 64, 6610.869, 3232.499, 668.5587, 2.604744, 120, 5, 1), -- 31015 (Area: 4588) (possible waypoints or random movement) +(@CGUID+5, 31015, 571, 1, 64, 6605.338, 3153.076, 665.3033, 5.409661, 120, 5, 1), -- 31015 (Area: 4588) (possible waypoints or random movement) +(@CGUID+6, 31015, 571, 1, 64, 6702.106, 3154.25, 654.8233, 5.986479, 120, 5, 1), -- 31015 (Area: 4588) (possible waypoints or random movement) +(@CGUID+7, 31015, 571, 1, 64, 6583.975, 3157.158, 665.6695, 2.269745, 120, 5, 1), -- 31015 (Area: 4588) (possible waypoints or random movement) +(@CGUID+8, 31015, 571, 1, 64, 6565.48, 3315.214, 667.1922, 3.576956, 120, 0, 0), -- 31015 (Area: 4588) +(@CGUID+9, 31015, 571, 1, 64, 6498.057, 3314.354, 664.8021, 0.5061455, 120, 5, 1), -- 31015 (Area: 4588) (possible waypoints or random movement) +(@CGUID+10, 31015, 571, 1, 64, 6518.352, 3309.556, 665.1537, 5.462881, 120, 5, 1), -- 31015 (Area: 4588) (possible waypoints or random movement) +(@CGUID+11, 31015, 571, 1, 64, 6571.921, 3315.821, 668.0949, 2.940412, 120, 0, 0), -- 31015 (Area: 4588) +(@CGUID+12, 31015, 571, 1, 64, 6572.489, 3319.39, 667.0414, -1.827478, 120, 0, 0), -- 31015 (Area: 4588) +(@CGUID+13, 31015, 571, 1, 64, 6530.034, 3256.114, 666.3459, 4.205114, 120, 0, 0), -- 31015 (Area: 4588) +(@CGUID+14, 31015, 571, 1, 64, 6493.935, 3292.664, 664.7191, 5.110613, 120, 5, 1), -- 31015 (Area: 4588) (possible waypoints or random movement) +(@CGUID+15, 31015, 571, 1, 64, 6569.369, 3316.948, 667.7736, -0.4594761, 120, 0, 0), -- 31015 (Area: 4588) (Auras: ) +(@CGUID+16, 31015, 571, 1, 64, 6530.081, 3256.11, 666.2975, 4.193476, 120, 0, 0), -- 31015 (Area: 4588) +(@CGUID+17, 31015, 571, 1, 64, 6464.674, 3252.994, 641.5389, 5.995564, 120, 0, 0), -- 31015 (Area: 4531) +(@CGUID+18, 31015, 571, 1, 64, 6489.055, 3385.385, 598.3196, -1.682238, 120, 0, 0), -- 31015 (Area: 4531) +(@CGUID+19, 31015, 571, 1, 64, 6456.603, 3166.644, 657.527, 1.598204, 120, 0, 0), -- 31015 (Area: 4531) +(@CGUID+20, 31015, 571, 1, 64, 6461.294, 3153.185, 657.5644, 4.921828, 120, 5, 1), -- 31015 (Area: 4531) (possible waypoints or random movement) +(@CGUID+21, 31015, 571, 1, 64, 6453.171, 3166.278, 657.5888, 0.3810751, 120, 0, 0), -- 31015 (Area: 4531) +(@CGUID+22, 31015, 571, 1, 64, 6455.606, 3164.106, 657.6061, 1.870695, 120, 0, 0), -- 31015 (Area: 4531) +(@CGUID+23, 31015, 571, 1, 64, 6412.766, 3231.688, 639.8654, 4.939847, 120, 5, 1), -- 31015 (Area: 4531) (possible waypoints or random movement) +(@CGUID+24, 31015, 571, 1, 64, 6667.497, 3354.504, 704.6642, -2.447248, 120, 0, 0), -- 31015 (Area: 4531) +(@CGUID+25, 30696, 571, 1, 64, 6638.812, 3160.733, 660.6064, 1.080401, 120, 5, 1), -- 30696 (Area: 4588) (possible waypoints or random movement) +(@CGUID+26, 30696, 571, 1, 64, 6686.414, 3147.764, 656.3453, 6.07866, 120, 5, 1), -- 30696 (Area: 4588) (possible waypoints or random movement) +(@CGUID+27, 30696, 571, 1, 64, 6526.674, 3303.937, 665.1752, 4.911891, 120, 5, 1), -- 30696 (Area: 4588) (possible waypoints or random movement) +(@CGUID+28, 30696, 571, 1, 64, 6548.213, 3310.022, 665.8172, 2.349988, 120, 0, 0), -- 30696 (Area: 4588) +(@CGUID+29, 30696, 571, 1, 64, 6532.149, 3256.876, 666.6301, -2.182277, 120, 0, 0), -- 30696 (Area: 4588) +(@CGUID+30, 30696, 571, 1, 64, 6521.981, 3320.334, 664.9473, 4.594295, 120, 0, 0), -- 30696 (Area: 4588) +(@CGUID+31, 30696, 571, 1, 64, 6470.161, 3250.802, 643.5604, 3.930473, 120, 0, 0), -- 30696 (Area: 4531) +(@CGUID+32, 30696, 571, 1, 64, 6487.702, 3380.006, 599.0916, 6.272988, 120, 0, 0), -- 30696 (Area: 4531) +(@CGUID+33, 30696, 571, 1, 64, 6488.242, 3194.719, 652.9039, 1.48353, 120, 0, 0), -- 30696 (Area: 4531) +(@CGUID+34, 30696, 571, 1, 64, 6435.536, 3141.343, 657.5279, 0.1379021, 120, 5, 1), -- 30696 (Area: 4531) (possible waypoints or random movement) +(@CGUID+35, 30696, 571, 1, 64, 6564.194, 3135.601, 666.2081, 0.4537856, 120, 0, 0), -- 30696 (Area: 4531) +(@CGUID+36, 30696, 571, 1, 64, 6410.666, 3233.757, 640.489, 4.667454, 120, 5, 1), -- 30696 (Area: 4531) (possible waypoints or random movement) +(@CGUID+37, 30696, 571, 1, 64, 6413.427, 3218.029, 638.4678, 0.122173, 120, 0, 0), -- 30696 (Area: 4531) +(@CGUID+38, 30696, 571, 1, 64, 6452.031, 3161.715, 657.5867, 0.9863433, 120, 0, 0), -- 30696 (Area: 4531) +(@CGUID+39, 30696, 571, 1, 64, 6459.535, 3110.506, 657.6054, 1.157361, 120, 5, 1), -- 30696 (Area: 4531) (possible waypoints or random movement) +(@CGUID+40, 30696, 571, 1, 64, 6679.659, 3345.589, 704.6539, 3.205272, 120, 5, 1), -- 30696 (Area: 4531) (possible waypoints or random movement) +(@CGUID+41, 30703, 571, 1, 64, 6571.963, 3314.406, 668.2784, 2.36651, 120, 0, 0), -- 30703 (Area: 4588) +(@CGUID+42, 30703, 571, 1, 64, 6517.844, 3323.566, 664.8954, -0.663258, 120, 0, 0), -- 30703 (Area: 4588) +(@CGUID+43, 30703, 571, 1, 64, 6528.306, 3259.301, 665.793, -1.073858, 120, 0, 0), -- 30703 (Area: 4588) +(@CGUID+44, 30703, 571, 1, 64, 6454.563, 3168.846, 657.5237, 5.535412, 120, 0, 0), -- 30703 (Area: 4531) +(@CGUID+45, 30703, 571, 1, 64, 6421.846, 3257.234, 640.0424, 2.456618, 120, 0, 0), -- 30703 (Area: 4531) (Auras: ) +(@CGUID+46, 30703, 571, 1, 64, 6669.027, 3354.094, 704.2711, 2.458861, 120, 0, 0), -- 30703 (Area: 4531) +(@CGUID+47, 30704, 571, 1, 64, 6572.606, 3315.346, 668.405, -2.30596, 120, 0, 0), -- 30704 (Area: 4588) +(@CGUID+48, 30704, 571, 1, 64, 6568.352, 3316.549, 667.683, 2.906086, 120, 0, 0), -- 30704 (Area: 4588) +(@CGUID+49, 30704, 571, 1, 64, 6571.605, 3316.023, 668.1923, -2.073231, 120, 0, 0), -- 30704 (Area: 4588) +(@CGUID+50, 30704, 571, 1, 64, 6530.246, 3252.483, 666.8104, 1.616269, 120, 0, 0), -- 30704 (Area: 4588) +(@CGUID+51, 30704, 571, 1, 64, 6543.361, 3308.063, 665.3945, 0.383608, 120, 0, 0), -- 30704 (Area: 4588) +(@CGUID+52, 30704, 571, 1, 64, 6529.136, 3252.577, 666.5628, 1.30948, 120, 0, 0), -- 30704 (Area: 4588) (Auras: ) +(@CGUID+53, 30704, 571, 1, 64, 6489.347, 3384.931, 598.3163, -1.893157, 120, 0, 0), -- 30704 (Area: 4531) +(@CGUID+54, 30704, 571, 1, 64, 6492.296, 3382.427, 598.8416, 5.579057, 120, 0, 0), -- 30704 (Area: 4531) +(@CGUID+55, 30704, 571, 1, 64, 6488.653, 3381.798, 598.9666, 1.330476, 120, 0, 0), -- 30704 (Area: 4531) +(@CGUID+56, 30704, 571, 1, 64, 6492.833, 3385.416, 598.5916, -3.133257, 120, 0, 0), -- 30704 (Area: 4531) +(@CGUID+57, 30704, 571, 1, 64, 6492.375, 3197.953, 653.0616, -2.477693, 120, 0, 0), -- 30704 (Area: 4531) +(@CGUID+58, 30704, 571, 1, 64, 6571.54, 3281.336, 670.894, 5.986175, 120, 0, 0), -- 30704 (Area: 4531) +(@CGUID+59, 30704, 571, 1, 64, 6463.915, 3257.741, 640.313, 0.01159616, 120, 0, 0), -- 30704 (Area: 4531) +(@CGUID+60, 30704, 571, 1, 64, 6462.88, 3253.862, 641.1767, 0.2747464, 120, 0, 0), -- 30704 (Area: 4531) +(@CGUID+61, 30704, 571, 1, 64, 6468.83, 3249.454, 643.105, 0.7893116, 120, 0, 0), -- 30704 (Area: 4531) +(@CGUID+62, 30704, 571, 1, 64, 6509.02, 3212.699, 658.4735, 2.319517, 120, 0, 0), -- 30704 (Area: 4531) +(@CGUID+63, 30704, 571, 1, 64, 6507.89, 3210.89, 658.0303, 1.634014, 120, 0, 0), -- 30704 (Area: 4531) +(@CGUID+64, 30704, 571, 1, 64, 6456.575, 3167.642, 657.5801, -1.838321, 120, 0, 0), -- 30704 (Area: 4531) +(@CGUID+65, 30704, 571, 1, 64, 6452.937, 3166.663, 657.6061, -0.005128502, 120, 0, 0), -- 30704 (Area: 4531) +(@CGUID+66, 30704, 571, 1, 64, 6454.717, 3168.428, 657.5237, 2.709053, 120, 0, 0), -- 30704 (Area: 4531) +(@CGUID+67, 30704, 571, 1, 64, 6455.861, 3167.833, 657.575, -1.598367, 120, 0, 0), -- 30704 (Area: 4531) +(@CGUID+68, 30704, 571, 1, 64, 6416.846, 3214.117, 639.7312, 2.10443, 120, 0, 0), -- 30704 (Area: 4531) +(@CGUID+69, 30704, 571, 1, 64, 6590.434, 3331.823, 667.183, 4.037075, 120, 0, 0), -- 30704 (Area: 4531) +(@CGUID+70, 30704, 571, 1, 64, 6668.725, 3357.257, 704.2558, -3.137703, 120, 0, 0), -- 30704 (Area: 4531) +(@CGUID+71, 30704, 571, 1, 64, 6664.69, 3352.166, 704.3459, 1.520238, 120, 0, 0), -- 30704 (Area: 4531) +(@CGUID+72, 30697, 571, 1, 64, 6559.192, 3333.02, 664.9217, 4.991642, 120, 0, 0), -- 30697 (Area: 4588) +(@CGUID+73, 30697, 571, 1, 64, 6512.84, 3320.273, 665.2345, 0.5819893, 120, 0, 0), -- 30697 (Area: 4588) +(@CGUID+74, 30697, 571, 1, 64, 6515.811, 3280.09, 665.0708, 0.1396263, 120, 0, 0), -- 30697 (Area: 4531) +(@CGUID+75, 30697, 571, 1, 64, 6476.128, 3146.229, 657.5644, 4.380776, 120, 0, 0), -- 30697 (Area: 4531) +(@CGUID+76, 30697, 571, 1, 64, 6417.988, 3260.385, 640.6262, -0.6849744, 120, 0, 0), -- 30697 (Area: 4531) +(@CGUID+77, 31432, 571, 1, 64, 6588.427, 3278.203, 818.2033, 5.044002, 120, 5, 1); -- 31432 (Area: 4588) (possible waypoints or random movement) + + +UPDATE `creature` SET `phaseMask`=64 WHERE `id` IN(31314,30698,31306,31428); +UPDATE `creature` SET `phaseMask`=65 WHERE `id` IN(30597,32467); +UPDATE `creature_template` SET `unit_flags`=768 WHERE `entry`=31432; +UPDATE `creature` SET `equipment_id`=1 WHERE `id` IN(30703,30704); + +DELETE FROM `vehicle_template_accessory` WHERE `entry`=31432; +INSERT INTO `vehicle_template_accessory` (`entry`, `accessory_entry`, `seat_id`, `minion`, `description`, `summontype`, `summontimer`) VALUES +(31432, 31428, 0, 0, '31432 - 31428', 6, 30000); -- 31432 - 31428 + + +DELETE FROM `gameobject` WHERE `id` IN(193203,193204); +INSERT INTO `gameobject` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`) VALUES +(@OGUID+0, 193203, 571, 1, 64, 6531.642, 3336.632, 666.5159, 2.565632, 0, 0, 0, 1, 120, 255, 1), -- 193203 (Area: 4531) +(@OGUID+1, 193203, 571, 1, 64, 6541.198, 3337.612, 674.4935, 3.194002, 0, 0, 0, 1, 120, 255, 1), -- 193203 (Area: 4531) +(@OGUID+2, 193203, 571, 1, 64, 6561.242, 3342.843, 667.0536, 3.106652, 0, 0, 0, 1, 120, 255, 1), -- 193203 (Area: 4531) +(@OGUID+3, 193203, 571, 1, 64, 6575.444, 3336.632, 667.6539, 4.398232, 0, 0, 0, 1, 120, 255, 1), -- 193203 (Area: 4531) +(@OGUID+4, 193203, 571, 1, 64, 6517.65, 3262.135, 668.0207, 0.3141584, 0, 0, 0, 1, 120, 255, 1), -- 193203 (Area: 4531) +(@OGUID+5, 193204, 571, 1, 64, 6509.69, 3298.966, 670.1282, 3.892087, 0, 0, 0, 1, 120, 255, 1), -- 193204 (Area: 4531) +(@OGUID+6, 193203, 571, 1, 64, 6441.041, 3245.802, 643.5339, 4.433136, 0, 0, 0, 1, 120, 255, 1), -- 193203 (Area: 4531) +(@OGUID+7, 193203, 571, 1, 64, 6523.465, 3403.516, 599.7352, 1.06465, 0, 0, 0, 1, 120, 255, 1), -- 193203 (Area: 4531) +(@OGUID+8, 193204, 571, 1, 64, 6774.447, 3517.597, 670.3411, 3.106652, 0, 0, 0, 1, 120, 255, 1), -- 193204 (Area: 4531) +(@OGUID+9, 193204, 571, 1, 64, 6774.1, 3539.328, 670.2827, 3.961899, 0, 0, 0, 1, 120, 255, 1), -- 193204 (Area: 4531) +(@OGUID+10, 193203, 571, 1, 64, 6815.187, 3502.362, 691.7656, 2.234018, 0, 0, 0, 1, 120, 255, 1), -- 193203 (Area: 4531) +(@OGUID+11, 193203, 571, 1, 64, 6836.54, 3514.926, 691.6472, 3.560473, 0, 0, 0, 1, 120, 255, 1), -- 193203 (Area: 4531) +(@OGUID+12, 193204, 571, 1, 64, 6859.746, 3515.827, 696.0732, 4.747296, 0, 0, 0, 1, 120, 255, 1), -- 193204 (Area: 4531) +(@OGUID+13, 193203, 571, 1, 64, 6717.095, 3499.194, 656.2964, 1.308995, 0, 0, 0, 1, 120, 255, 1), -- 193203 (Area: 4531) +(@OGUID+14, 193203, 571, 1, 64, 6716.513, 3544.395, 670.4061, 0.6632232, 0, 0, 0, 1, 120, 255, 1), -- 193203 (Area: 4531) +(@OGUID+15, 193203, 571, 1, 64, 6671.143, 3539.871, 670.931, 3.560473, 0, 0, 0, 1, 120, 255, 1), -- 193203 (Area: 4531) +(@OGUID+16, 193203, 571, 1, 64, 6656.081, 3455.363, 632.7549, 2.705255, 0, 0, 0, 1, 120, 255, 1), -- 193203 (Area: 4531) +(@OGUID+17, 193203, 571, 1, 64, 6678.709, 3572.928, 671.7523, 4.06662, 0, 0, 0, 1, 120, 255, 1), -- 193203 (Area: 4531) +(@OGUID+18, 193203, 571, 1, 64, 6665.039, 3553.045, 670.4769, 2.076939, 0, 0, 0, 1, 120, 255, 1), -- 193203 (Area: 4531) +(@OGUID+19, 193203, 571, 1, 64, 6466.252, 3423.323, 598.091, 0.4537851, 0, 0, 0, 1, 120, 255, 1), -- 193203 (Area: 4531) +(@OGUID+20, 193203, 571, 1, 64, 6522.733, 3429.231, 599.0632, 3.351047, 0, 0, 0, 1, 120, 255, 1), -- 193203 (Area: 4531) +(@OGUID+21, 193203, 571, 1, 64, 6516.931, 3478.982, 597.8824, 4.729844, 0, 0, 0, 1, 120, 255, 1), -- 193203 (Area: 4531) +(@OGUID+22, 193203, 571, 1, 64, 6498.917, 3480.367, 596.7786, 2.024579, 0, 0, 0, 1, 120, 255, 1), -- 193203 (Area: 4531) +(@OGUID+23, 193203, 571, 1, 64, 6544.474, 3464.513, 597.8202, 0.1396245, 0, 0, 0, 1, 120, 255, 1), -- 193203 (Area: 4531) +(@OGUID+24, 193203, 571, 1, 64, 6671.423, 3264.837, 669.0335, 5.724681, 0, 0, 0, 1, 120, 255, 1), -- 193203 (Area: 4531) +(@OGUID+25, 193203, 571, 1, 64, 6669.524, 3338.208, 703.5842, 1.797689, 0, 0, 0, 1, 120, 255, 1), -- 193203 (Area: 4531) +(@OGUID+26, 193204, 571, 1, 64, 6926.368, 3514.581, 713.6303, 4.031712, 0, 0, 0, 1, 120, 255, 1), -- 193204 (Area: 4531) +(@OGUID+27, 193203, 571, 1, 64, 6901.291, 3446.396, 704.4607, 2.583081, 0, 0, 0, 1, 120, 255, 1), -- 193203 (Area: 4531) +(@OGUID+28, 193204, 571, 1, 64, 6885.061, 3495.637, 707.6733, 6.056293, 0, 0, 0, 1, 120, 255, 1), -- 193204 (Area: 4531) +(@OGUID+29, 193203, 571, 1, 64, 6907.985, 3453.707, 705.4143, 6.03884, 0, 0, 0, 1, 120, 255, 1), -- 193203 (Area: 4531) +(@OGUID+30, 193203, 571, 1, 64, 6680.36, 3371.357, 701.1601, 0.3141584, 0, 0, 0, 1, 120, 255, 1); -- 193203 (Area: 4531) + +DELETE FROM `creature_template_addon` WHERE `entry` IN(30703,30704,31432); +INSERT INTO `creature_template_addon` (`entry`, `mount`, `bytes1`, `bytes2`, `auras`) VALUES +(31432, 0, 0x3000000, 0x1, ''), -- 31432 +(30703, 25280, 0x0, 0x1, ''), -- 30703 +(30704, 28919, 0x0, 0x1, ''); -- 30704 + +DELETE FROM `creature_addon` WHERE `guid` IN(@CGUID+41,@CGUID+42,@CGUID+43,@CGUID+47,@CGUID+48,@CGUID+49,@CGUID+50,@CGUID+51,@CGUID+52); +INSERT INTO `creature_addon` (`guid`, `mount`, `bytes1`, `bytes2`, `auras`) VALUES +(@CGUID+41, 0, 0x0, 0x1, ''), +(@CGUID+42, 0, 0x0, 0x1, ''), +(@CGUID+43, 0, 0x0, 0x1, ''), +(@CGUID+47, 0, 0x0, 0x1, ''), +(@CGUID+48, 0, 0x0, 0x1, ''), +(@CGUID+49, 0, 0x0, 0x1, ''), +(@CGUID+50, 0, 0x0, 0x1, ''), +(@CGUID+51, 0, 0x0, 0x1, ''), +(@CGUID+52, 0, 0x0, 0x1, ''); + +UPDATE `creature_template` SET `ainame`='SmartAI' WHERE `entry` IN(30703,30704,31015); +DELETE FROM `smart_scripts` WHERE `entryorguid` IN(30703,30704,31015) 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 +(30703,0,0,0,4,0,100,0,0,0,0,0,43,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Ebon Blade Champion - On Agro - Dismount'), +(30703,0,1,0,0,0,100,0,0,5000,25000,35000,11,58130,2,0,0,0,0,1,0,0,0,0,0,0,0,'Ebon Blade Champion - IC - Cast Icebound Fortitude'), +(30703,0,2,0,9,0,100,0,0,5,20000,30000,11,50688,2,0,0,0,0,2,0,0,0,0,0,0,0,'Ebon Blade Champion - On Range - Cast Plague Strike'), +(30704,0,0,0,4,0,100,0,0,0,0,0,43,0,0,0,0,0,0,1,0,0,0,0,0,0,0,'Argent Paladin - On Agro - Dismount'), +(30704,0,1,0,9,0,100,0,0,5,12000,15000,11,58127,2,0,0,0,0,2,0,0,0,0,0,0,0,'Argent Paladin - On Range - Cast Divine Storm'), +(31015,0,0,0,9,0,100,0,0,5,15000,25000,11,60873,2,0,0,0,0,2,0,0,0,0,0,0,0,'Intrepid Ghoul - On Range - Cast Festering Bite'), +(31015,0,1,0,9,0,100,0,0,5,9000,16000,11,60872,2,0,0,0,0,2,0,0,0,0,0,0,0,'Intrepid Ghoul - On Range - Cast Festering Bite'), +(31015,0,2,0,2,0,100,1,0,10,0,0,11,58137,2,0,0,0,0,2,0,0,0,0,0,0,0,'Intrepid Ghoul - On Less than 10% hp - Cast Ghoulplosion'); diff --git a/sql/updates/world/2016_02_13_04_world.sql b/sql/updates/world/2016_02_13_04_world.sql new file mode 100644 index 00000000000..83d95745052 --- /dev/null +++ b/sql/updates/world/2016_02_13_04_world.sql @@ -0,0 +1,51 @@ +-- +-- Arred +UPDATE `creature` SET `spawndist` = 0, `MovementType` = 0 WHERE `guid` = 63008; +UPDATE `creature_template` SET `MovementType` = 0 WHERE `Entry` = 17512; +-- Arred SAI +SET @ENTRY := 17512; +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry`=@ENTRY; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY 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 +(@ENTRY,0,0,0,25,0,100,0,0,0,0,0,53,0,17512,1,0,0,0,1,0,0,0,0,0,0,0,"Arred - On Reset - Start Waypoint"), +(@ENTRY,0,1,0,64,0,100,0,0,0,0,0,54,20000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Arred - On Gossip Hello - Pause Waypoint"), +(@ENTRY,0,2,0,40,0,100,0,1,17512,0,0,54,90000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Arred - On Waypoint 1 Reached - Pause Waypoint"), +(@ENTRY,0,3,0,40,0,100,0,3,17512,0,0,80,@ENTRY*100+00,2,0,0,0,0,1,0,0,0,0,0,0,0,"Arred - On Waypoint 3 Reached - Run Script"), +(@ENTRY,0,4,0,40,0,100,0,7,17512,0,0,80,@ENTRY*100+01,2,0,0,0,0,1,0,0,0,0,0,0,0,"Arred - On Waypoint 7 Reached - Run Script"), +(@ENTRY,0,5,0,40,0,100,0,8,17512,0,0,80,@ENTRY*100+02,2,0,0,0,0,1,0,0,0,0,0,0,0,"Arred - On Waypoint 8 Reached - Run Script"), +(@ENTRY,0,6,0,40,0,100,0,9,17512,0,0,54,210000,0,0,0,0,0,1,0,0,0,0,0,0,0,"Arred - On Waypoint 9 Reached - Pause Waypoint"); + +-- Actionlist SAI +SET @ENTRY := 1751200; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,9,0,0,0,0,100,0,0,0,0,0,54,90000,0,0,0,0,0,1,0,0,0,0,0,0,0,"On Script - Pause Waypoint"), +(@ENTRY,9,1,0,0,0,100,0,88000,88000,0,0,5,3,0,0,0,0,0,1,0,0,0,0,0,0,0,"On Script - Play Emote 3"); + +-- Actionlist SAI +SET @ENTRY := 1751201; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,9,0,0,0,0,100,0,0,0,0,0,54,120000,0,0,0,0,0,1,0,0,0,0,0,0,0,"On Script - Pause Waypoint"), +(@ENTRY,9,1,0,0,0,100,0,3000,3000,0,0,90,8,0,0,0,0,0,1,0,0,0,0,0,0,0,"On Script - Set Flag Standstate Kneel"), +(@ENTRY,9,2,0,0,0,100,0,115000,115000,0,0,91,8,0,0,0,0,0,1,0,0,0,0,0,0,0,"On Script - Remove Flag Standstate Kneel"); + +-- Actionlist SAI +SET @ENTRY := 1751202; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ENTRY AND `source_type`=9; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ENTRY,9,0,0,0,0,100,0,0,0,0,0,54,30000,0,0,0,0,0,1,0,0,0,0,0,0,0,"On Script - Pause Waypoint"), +(@ENTRY,9,1,0,0,0,100,0,4000,4000,0,0,5,25,0,0,0,0,0,1,0,0,0,0,0,0,0,"On Script - Play Emote 25"), +(@ENTRY,9,2,0,0,0,100,0,12000,12000,0,0,5,273,0,0,0,0,0,1,0,0,0,0,0,0,0,"On Script - Play Emote 273"); + +DELETE FROM `waypoints` WHERE `entry`=17512; +INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES +(17512,1,-3788.04,-11547.3,-134.842, 'Arred'), +(17512,2,-3789.79,-11543.9,-134.849, 'Arred'), +(17512,3,-3793.72,-11542.8,-134.892, 'Arred'), +(17512,4,-3789.94,-11543.8,-134.851, 'Arred'), +(17512,5,-3787.24,-11546.9,-134.831, 'Arred'), +(17512,6,-3786.81,-11549.6,-134.836, 'Arred'), +(17512,7,-3787.67,-11551.3,-134.853, 'Arred'), +(17512,8,-3784.96,-11550.9,-134.819, 'Arred'), +(17512,9,-3788.04,-11547.3,-134.842, 'Arred'); diff --git a/sql/updates/world/2016_02_14_00_world.sql b/sql/updates/world/2016_02_14_00_world.sql new file mode 100644 index 00000000000..961ecd74d4d --- /dev/null +++ b/sql/updates/world/2016_02_14_00_world.sql @@ -0,0 +1,3 @@ +-- Disallow flight form while affected by no-mount shapeshift +DELETE FROM `spell_script_names` WHERE `spell_id` IN (-33943, 33943, 40120); +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES (-33943, "spell_dru_flight_form"); diff --git a/sql/updates/world/2016_02_14_01_world.sql b/sql/updates/world/2016_02_14_01_world.sql new file mode 100644 index 00000000000..2ce06020621 --- /dev/null +++ b/sql/updates/world/2016_02_14_01_world.sql @@ -0,0 +1,2 @@ +-- +UPDATE `creature` SET `modelid`=0 WHERE `id`=27452; diff --git a/sql/updates/world/2016_02_14_02_world.sql b/sql/updates/world/2016_02_14_02_world.sql new file mode 100644 index 00000000000..1459b702cf0 --- /dev/null +++ b/sql/updates/world/2016_02_14_02_world.sql @@ -0,0 +1,16 @@ +-- Free at Last + +UPDATE `smart_scripts` SET `action_type`=45, `action_param1`=1, `action_param2`=1, `target_type`=1, `comment`='Runed Giant - On Script - Set Data Self' WHERE `entryorguid`=2641700 AND `source_type`=9 AND `id`=2 AND `link`=0; + +DELETE FROM `smart_scripts` WHERE `entryorguid`=26417 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 +(26417, 0, 0, 0, 11, 0, 100, 0, 0, 0, 0, 0, 11, 47329, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Runed Giant - On Spellhit \'Gavrock\'s Runebreaker\' - Run Script (No Repeat)'), +(26417, 0, 1, 0, 38, 0, 100, 0, 1, 1, 0, 0, 33, 26783, 0, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 0, 0, 'Runed Giant - On Script - Quest Credit \'Free at Last\''), +(26417, 0, 2, 3, 8, 0, 25, 0, 47604, 0, 10000, 10000, 64, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Runed Giant - On Spell Hit - Store Target List'), +(26417, 0, 3, 0, 61, 0, 0, 0, 0, 0, 10000, 10000, 80, 2641700, 2, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Runed Giant - On Spell Hit - Start Script for Free At Last'); + +-- Put on Your Best Face for Loken +UPDATE `creature_template` SET `unit_flags`=33555200 WHERE `entry`=27212; + +-- Send them Packing +UPDATE `smart_scripts` SET `event_flags`=1 WHERE `entryorguid`=23977 AND `source_type`=0 AND `id`=0 AND `link`=0; diff --git a/sql/updates/world/2016_02_14_03_world.sql b/sql/updates/world/2016_02_14_03_world.sql new file mode 100644 index 00000000000..9a0237725c0 --- /dev/null +++ b/sql/updates/world/2016_02_14_03_world.sql @@ -0,0 +1,3 @@ +-- +DELETE FROM `linked_respawn` WHERE `guid`=150211 AND `linkedGuid`=150211; +DELETE FROM `creature` WHERE `guid`=150212 AND `id`=38995; diff --git a/sql/updates/world/2016_02_14_04_world.sql b/sql/updates/world/2016_02_14_04_world.sql new file mode 100644 index 00000000000..58e0aaee311 --- /dev/null +++ b/sql/updates/world/2016_02_14_04_world.sql @@ -0,0 +1,2 @@ +-- +UPDATE `creature_template` SET `flags_extra`=(`flags_extra`|2097152) WHERE `entry` IN (31304); diff --git a/sql/updates/world/2016_02_15_00_world.sql b/sql/updates/world/2016_02_15_00_world.sql new file mode 100644 index 00000000000..43c2ae69382 --- /dev/null +++ b/sql/updates/world/2016_02_15_00_world.sql @@ -0,0 +1,73 @@ +-- +UPDATE `creature_template` SET `unit_flags`=512, `VehicleId`=240, `InhabitType`=4 WHERE `entry`=30477; +UPDATE `creature_template` SET `minlevel`=80, `maxlevel`=80, `exp`=2, `unit_flags`=512, `VehicleId`=240, `InhabitType`=4 WHERE `entry`=30487; +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry` IN (29428,30477,30487); +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (29428,30477,30487) AND `source_type`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (30477*100,30487*100) AND `source_type`=9; +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 +(29428,0,0,2,62,0,100,0,9917,0,0,0,11,58061,0,0,0,0,0,7,0,0,0,0,0,0,0,'Ricket - On gossip select - Spellcast Forcecast Summon Rocket (Alliance)'), +(29428,0,1,2,62,0,100,0,9917,1,0,0,11,58062,0,0,0,0,0,7,0,0,0,0,0,0,0,'Ricket - On gossip select - Spellcast Forcecast Summon Rocket (Horde)'), +(29428,0,2,0,61,0,100,0,0,0,0,0,72,0,0,0,0,0,0,7,0,0,0,0,0,0,0,'Ricket - On gossip select - Close gossip'), +(30477,0,0,0,54,0,100,0,0,0,0,0,80,30477*100,2,0,0,0,0,1,0,0,0,0,0,0,0,'D16 Propelled Delivery Device - Just summoned - Run script'), +(30477,0,1,2,40,0,100,0,18,30477,0,0,11,50630,0,0,0,0,0,1,0,0,0,0,0,0,0,'D16 Propelled Delivery Device - On WP 18 reached - Spellcast Eject All Passengers'), +(30477,0,2,0,61,0,100,0,0,0,0,0,11,42895,0,0,0,0,0,23,0,0,0,0,0,0,0,'D16 Propelled Delivery Device - On WP 18 reached - Spellcast Cosmetic - Combat Knockdown Foe'), +(30477,0,3,0,40,0,100,0,24,30477,0,0,41,100,0,0,0,0,0,1,0,0,0,0,0,0,0,'D16 Propelled Delivery Device - On WP 24 reached - Despawn'), +(30487,0,0,0,54,0,100,0,0,0,0,0,80,30487*100,2,0,0,0,0,1,0,0,0,0,0,0,0,'D16 Propelled Delivery Device - Just summoned - Run script'), +(30487,0,1,2,40,0,100,0,13,30487,0,0,11,50630,0,0,0,0,0,1,0,0,0,0,0,0,0,'D16 Propelled Delivery Device - On WP 13 reached - Spellcast Eject All Passengers'), +(30487,0,2,0,61,0,100,0,0,0,0,0,11,42895,0,0,0,0,0,23,0,0,0,0,0,0,0,'D16 Propelled Delivery Device - On WP 13 reached - Spellcast Cosmetic - Combat Knockdown Foe'), +(30487,0,3,0,40,0,100,0,17,30487,0,0,41,100,0,0,0,0,0,1,0,0,0,0,0,0,0,'D16 Propelled Delivery Device - On WP 17 reached - Despawn'), +(30477*100,9,0,0,0,0,100,0,3000,3000,0,0,53,1,30477,0,0,0,0,1,0,0,0,0,0,0,0,'D16 Propelled Delivery Device script - Start WP movement'), +(30487*100,9,0,0,0,0,100,0,3000,3000,0,0,53,1,30487,0,0,0,0,1,0,0,0,0,0,0,0,'D16 Propelled Delivery Device script - Start WP movement'); + +DELETE FROM `waypoints` WHERE `entry` IN (30477,30487); +INSERT INTO `waypoints` (`entry`,`pointid`,`position_x`,`position_y`,`position_z`,`point_comment`) VALUES +(30477,1,6164.999,-1064.512,422.1189,'D16 Propelled Delivery Device'), +(30477,2,6204.096,-998.4872,457.5628,'D16 Propelled Delivery Device'), +(30477,3,6289.573,-952.1809,504.6187,'D16 Propelled Delivery Device'), +(30477,4,6307.788,-872.7999,541.7296,'D16 Propelled Delivery Device'), +(30477,5,6370.582,-821.9507,653.868,'D16 Propelled Delivery Device'), +(30477,6,6413.268,-660.4708,808.3953,'D16 Propelled Delivery Device'), +(30477,7,6554.813,-550.3772,1018.112,'D16 Propelled Delivery Device'), +(30477,8,6633.265,-419.3159,1173.914,'D16 Propelled Delivery Device'), +(30477,9,6760.503,-364.4665,1277.719,'D16 Propelled Delivery Device'), +(30477,10,6807.88,-427.5194,1399.109,'D16 Propelled Delivery Device'), +(30477,11,6808.07,-471.4465,1419.247,'D16 Propelled Delivery Device'), +(30477,12,6775.634,-529.2309,1394.387,'D16 Propelled Delivery Device'), +(30477,13,6720.645,-535.5529,1328.054,'D16 Propelled Delivery Device'), +(30477,14,6660.31,-486.8651,1238.553,'D16 Propelled Delivery Device'), +(30477,15,6658.937,-417.8409,1186.11,'D16 Propelled Delivery Device'), +(30477,16,6680.49,-329.3087,1098.609,'D16 Propelled Delivery Device'), +(30477,17,6683.783,-220.3454,972.7203,'D16 Propelled Delivery Device'), +(30477,18,6663.772,-192.1261,962.2485,'D16 Propelled Delivery Device'), +(30477,19,6654.82,-180.1689,958.1317,'D16 Propelled Delivery Device'), +(30477,20,6631.467,-171.3305,966.4633,'D16 Propelled Delivery Device'), +(30477,21,6598.223,-162.3664,984.2227,'D16 Propelled Delivery Device'), +(30477,22,6566.67,-155.2077,992.0551,'D16 Propelled Delivery Device'), +(30477,23,6529.651,-154.9363,992.0551,'D16 Propelled Delivery Device'), +(30477,24,6454.417,-152.1311,962.305,'D16 Propelled Delivery Device'), +(30487,1,6169.229,-1069.619,420.6945,'D16 Propelled Delivery Device'), +(30487,2,6232.725,-1031.598,505.7779,'D16 Propelled Delivery Device'), +(30487,3,6339.224,-1035.08,575.3331,'D16 Propelled Delivery Device'), +(30487,4,6431.492,-987.6745,694.8887,'D16 Propelled Delivery Device'), +(30487,5,6632.437,-925.9739,896.1384,'D16 Propelled Delivery Device'), +(30487,6,6822.084,-755.521,1171.194,'D16 Propelled Delivery Device'), +(30487,7,7090.693,-619.4874,1455.639,'D16 Propelled Delivery Device'), +(30487,8,7260.75,-282.75,1513.362,'D16 Propelled Delivery Device'), +(30487,9,7552.502,-334.6509,1657.668,'D16 Propelled Delivery Device'), +(30487,10,7692.301,-509.425,1536.5,'D16 Propelled Delivery Device'), +(30487,11,7799.192,-636.3267,1252.278,'D16 Propelled Delivery Device'), +(30487,12,7841.555,-726.5501,1193.916,'D16 Propelled Delivery Device'), +(30487,13,7844.731,-775.3613,1185.833,'D16 Propelled Delivery Device'), +(30487,14,7842.449,-815.5735,1186.396,'D16 Propelled Delivery Device'), +(30487,15,7838.703,-859.9572,1173.173,'D16 Propelled Delivery Device'), +(30487,16,7865.014,-911.2181,1163.979,'D16 Propelled Delivery Device'), +(30487,17,7856.225,-951.6568,1151.563,'D16 Propelled Delivery Device'); + +DELETE FROM `gossip_menu_option` WHERE `menu_id`=9917 AND `id`=1; +INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`OptionBroadcastTextID`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`) VALUES +(9917,1,0,'I am ready to head further into Storm Peaks.',32890,1,1,0,0,0,0,''); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=9917; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(15,9917,0,0,28,12862,0,0,0,'','Ricket - Show gossip option only if player has completed but not rewarded quest When All Else Fails'), +(15,9917,1,0,28,13060,0,0,0,'','Ricket - Show gossip option only if player has completed but not rewarded quest When All Else Fails'); diff --git a/sql/updates/world/2016_02_17_00_world.sql b/sql/updates/world/2016_02_17_00_world.sql new file mode 100644 index 00000000000..8f22aaa3e4e --- /dev/null +++ b/sql/updates/world/2016_02_17_00_world.sql @@ -0,0 +1,343 @@ +-- +DELETE FROM `creature_addon` WHERE `guid` IN (SELECT `guid` FROM `creature` WHERE `id` IN (20102, 19172, 19169, 19173, 19171, 19148, 19177, 19176, 19178, 18927, 19175)); +DELETE FROM `game_event_creature` WHERE `guid` IN (SELECT `guid` FROM `creature` WHERE `id` IN (20102, 19172, 19169, 19173, 19171, 19148, 19177, 19176, 19178, 18927, 19175)) AND `eventEntry` !=2; +DELETE FROM `creature` WHERE `id` IN (20102, 19172, 19169, 19173, 19171, 19148, 19177, 19176, 19178, 18927, 19175) AND `guid` NOT IN (SELECT `guid` FROM `game_event_creature` WHERE `eventEntry` =2); +DELETE FROM `creature_template_addon` WHERE `entry` IN (20102, 19172, 19169, 19173, 19171, 19148, 19177, 19176, 19178, 18927, 19175); +UPDATE `creature` SET `equipment_id`=0, `modelid`=0 WHERE `id` IN (20102, 19172, 19169, 19173, 19171, 19148, 19177, 19176, 19178, 18927, 19175); +UPDATE `creature_template` SET `npcflag`=3, `unit_flags`=`unit_flags`|768 WHERE `entry` IN (20102, 19172, 19169, 19173, 19171, 19148, 19177, 19176, 19178, 18927, 19175); + +INSERT INTO `game_event_creature` SELECT 12, creature.guid FROM `creature` WHERE creature.id IN (20102, 19172, 19169, 19173, 19171, 19148, 19177, 19176, 19178, 18927, 19175); +INSERT INTO `game_event_creature` SELECT 24, creature.guid FROM `creature` WHERE creature.id IN (20102, 19172, 19169, 19173, 19171, 19148, 19177, 19176, 19178, 18927, 19175); +INSERT INTO `game_event_creature` SELECT 7, creature.guid FROM `creature` WHERE creature.id IN (20102, 19172, 19169, 19173, 19171, 19148, 19177, 19176, 19178, 18927, 19175); +INSERT INTO `game_event_creature` SELECT 1, creature.guid FROM `creature` WHERE creature.id IN (20102, 19172, 19169, 19173, 19171, 19148, 19177, 19176, 19178, 18927, 19175); +INSERT INTO `game_event_creature` SELECT 26, creature.guid FROM `creature` WHERE creature.id IN (20102, 19172, 19169, 19173, 19171, 19148, 19177, 19176, 19178, 18927, 19175); +INSERT INTO `game_event_creature` SELECT 51, creature.guid FROM `creature` WHERE creature.id IN (20102, 19172, 19169, 19173, 19171, 19148, 19177, 19176, 19178, 18927, 19175); +INSERT INTO `game_event_creature` SELECT 50, creature.guid FROM `creature` WHERE creature.id IN (20102, 19172, 19169, 19173, 19171, 19148, 19177, 19176, 19178, 18927, 19175); +INSERT INTO `game_event_creature` SELECT 9, creature.guid FROM `creature` WHERE creature.id IN (20102, 19172, 19169, 19173, 19171, 19148, 19177, 19176, 19178, 18927, 19175); + +SET @entry1:=20102; +SET @entry2:=19172; +SET @entry3:=19169; +SET @entry4:=19173; +SET @entry5:=19171; +SET @entry6:=19148; +SET @entry7:=19177; +SET @entry8:=19176; +SET @entry9:=19178; +SET @entry10:=18927; +SET @entry11:=19175; + +DELETE FROM smart_scripts WHERE `entryorguid` IN(@entry1,@entry2,@entry3,@entry4,@entry5,@entry6,@entry7,@entry8,@entry9,@entry10,@entry11) AND source_type=0 AND id>12; +DELETE FROM smart_scripts WHERE `entryorguid` IN (@entry1*100, @entry1*100+1, @entry2*100, @entry2*100+1, @entry3*100, @entry3*100+1, @entry4*100, @entry4*100+1, @entry5*100, @entry5*100+1, @entry6*100, @entry6*100+1, @entry7*100, @entry7*100+1, @entry8*100, @entry8*100+1, @entry9*100, @entry9*100+1, @entry10*100, @entry10*100+1, @entry11*100, @entry11*100+1) AND source_type=9; +DELETE FROM smart_scripts WHERE `entryorguid` IN (@entry1*100+2, @entry1*100+3, @entry2*100+2, @entry2*100+3, @entry3*100+2, @entry3*100+3, @entry4*100+2, @entry4*100+3, @entry5*100+2, @entry5*100+3, @entry6*100+2, @entry6*100+3, @entry7*100+2, @entry7*100+3, @entry8*100+2, @entry8*100+3, @entry9*100+2, @entry9*100+3, @entry10*100+2, @entry10*100+3, @entry11*100+2, @entry11*100+3) AND source_type=9; +DELETE FROM smart_scripts WHERE `entryorguid` IN (@entry1*100+4, @entry1*100+5, @entry2*100+4, @entry2*100+5, @entry3*100+4, @entry3*100+5, @entry4*100+5, @entry4*100+4, @entry5*100+4, @entry5*100+5, @entry6*100+4, @entry6*100+5, @entry7*100+4, @entry7*100+5, @entry8*100+4, @entry8*100+5, @entry9*100+4, @entry9*100+5, @entry10*100+4, @entry10*100+5, @entry11*100+4, @entry11*100+5) AND source_type=9; +DELETE FROM smart_scripts WHERE `entryorguid` IN (@entry1*100+6, @entry1*100+7, @entry2*100+6, @entry2*100+7, @entry3*100+6, @entry3*100+7, @entry4*100+6, @entry4*100+7, @entry5*100+6, @entry5*100+7, @entry6*100+6, @entry6*100+7, @entry7*100+6, @entry7*100+7, @entry8*100+6, @entry8*100+7, @entry9*100+6, @entry9*100+7, @entry10*100+6, @entry10*100+7, @entry11*100+6, @entry11*100+7) AND source_type=9; +DELETE FROM smart_scripts WHERE `entryorguid` IN (@entry1*100+8, @entry1*100+9, @entry2*100+8, @entry2*100+9, @entry3*100+8, @entry3*100+9, @entry4*100+8, @entry4*100+9, @entry5*100+8, @entry5*100+9, @entry6*100+8, @entry6*100+9, @entry7*100+8, @entry7*100+9, @entry8*100+8, @entry8*100+9, @entry9*100+8, @entry9*100+9, @entry10*100+8, @entry10*100+9, @entry11*100+8, @entry11*100+9) AND source_type=9; +DELETE FROM smart_scripts WHERE `entryorguid` IN (@entry1*100+10, @entry1*100+11, @entry2*100+10, @entry2*100+11, @entry3*100+10, @entry3*100+11, @entry4*100+10, @entry4*100+11, @entry5*100+10, @entry5*100+11, @entry6*100+10, @entry6*100+11, @entry7*100+10, @entry7*100+11, @entry8*100+10, @entry8*100+11, @entry9*100+10, @entry9*100+11, @entry10*100+10, @entry10*100+11, @entry11*100+10, @entry11*100+11) AND source_type=9; +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 +(@entry1, 0, 13, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry1*100, @entry1*100+1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Goblin commoner - On respawn - random action list'), -- Goblin christmas +(@entry1*100, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 34845, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Goblin commoner - random action list - cast '), +(@entry1*100+1, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 34849, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Goblin commoner - random action list - cast'), +(@entry1, 0, 14, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry1*100+2, @entry1*100+3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Goblin commoner - On respawn - random action list'), -- Goblin Halloween +(@entry1*100+2, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 43631, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Goblin commoner - random action list - cast '), +(@entry1*100+3, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 43630, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Goblin commoner - random action list - cast'), +(@entry1, 0, 15, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry1*100+4, @entry1*100+5, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Goblin commoner - On respawn - random action list'), -- Goblin Lunar +(@entry1*100+4, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 34848, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Goblin commoner - random action list - cast '), +(@entry1*100+5, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 34851, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Goblin commoner - random action list - cast'), +(@entry1, 0, 16, 0, 11, 0, 100, 0, 0, 0, 0, 0, 80, @entry1*100+6, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Goblin commoner - On respawn - random action list'), -- Goblin Brewfest +(@entry1*100+6, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 43911, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Goblin commoner - random action list - cast '), +(@entry1*100+6, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 71, 0, 0, 13861, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Goblin commoner - random action list - Equip'), +(@entry1, 0, 17, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry1*100+7, @entry1*100+8, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Goblin commoner - On respawn - random action list'), -- Goblin DOTD +(@entry1*100+7, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 29203, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Goblin commoner - random action list - Morph '), +(@entry1*100+8, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 29204, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Goblin commoner - random action list - Morph'), +(@entry1, 0, 18, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry1*100+9, @entry1*100+10, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Goblin commoner - On respawn - random action list'), -- Goblin pirates +(@entry1*100+9, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 25036, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Goblin commoner - random action list - Morph '), +(@entry1*100+10, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 25047, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Goblin commoner - random action list - Morph'), +(@entry1, 0, 19, 0, 11, 0, 100, 0, 0, 0, 0, 0, 3, 25872, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Goblin commoner - On respawn - Morph'), -- Goblin midsummer +(@entry2, 0, 13, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry2*100, @entry2*100+1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Gnome commoner - On respawn - random action list'), -- Gnome christmas +(@entry2*100, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33448, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Gnome commoner - random action list - cast '), +(@entry2*100+1, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33445, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Gnome commoner - random action list - cast'), +(@entry2, 0, 14, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry2*100+2, @entry2*100+3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Gnome commoner - On respawn - random action list'), -- Gnome Halloween +(@entry2*100+2, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 43629, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Gnome commoner - random action list - cast '), +(@entry2*100+3, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 43628, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Gnome commoner - random action list - cast'), +(@entry2, 0, 15, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry2*100+4, @entry2*100+5, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Gnome - On respawn - random action list'), -- Gnome Lunar +(@entry2*100+4, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33446, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Gnome - random action list - cast '), +(@entry2*100+5, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33449, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Gnome - random action list - cast'), +(@entry2, 0, 16, 0, 11, 0, 100, 0, 0, 0, 0, 0, 80, @entry2*100+6, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Gnome commoner - On respawn - random action list'), -- Gnome Brewfest +(@entry2*100+6, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 43910, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Gnome commoner - random action list - cast '), +(@entry2*100+6, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 71, 0, 0, 13861, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Gnome commoner - random action list - Equip'), +(@entry2, 0, 17, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry2*100+7, @entry2*100+8, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Gnome commoner - On respawn - random action list'), -- Gnome DOTD +(@entry2*100+7, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 29203, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Gnome commoner - random action list - Morph '), +(@entry2*100+8, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 29204, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Gnome commoner - random action list - Morph'), +(@entry2, 0, 18, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry2*100+9, @entry2*100+10, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Gnome commoner - On respawn - random action list'), -- Gnome pirates +(@entry2*100+9, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 25035, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Gnome commoner - random action list - Morph '), +(@entry2*100+10, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 25046, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Gnome commoner - random action list - Morph'), +(@entry2, 0, 19, 0, 11, 0, 100, 0, 0, 0, 0, 0, 3, 25871, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Gnome commoner - On respawn - Morph'), -- Gnome midsummer +(@entry3, 0, 13, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry3*100, @entry3*100+1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Bloodelf commoner - On respawn - random action list'), -- blood elf christmas +(@entry3*100, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33412, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Bloodelf commoner - random action list - cast '), +(@entry3*100+1, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33415, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Bloodelf commoner - random action list - cast'), +(@entry3, 0, 14, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry3*100+2, @entry3*100+3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Bloodelf commoner - On respawn - random action list'), -- blood elf Halloween +(@entry3*100+2, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 43406, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Bloodelf commoner - random action list - cast '), +(@entry3*100+3, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 43405, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Bloodelf commoner - random action list - cast'), +(@entry3, 0, 15, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry3*100+4, @entry3*100+5, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Bloodelf commoner - On respawn - random action list'), -- blood elf Lunar +(@entry3*100+4, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33413, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Bloodelf commoner - random action list - cast '), +(@entry3*100+5, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33416, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Bloodelf commoner - random action list - cast'), +(@entry3, 0, 16, 0, 11, 0, 100, 0, 0, 0, 0, 0, 80, @entry3*100+6, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Bloodelf commoner - On respawn - random action list'), -- blood elf Brewfest +(@entry3*100+6, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 43907, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Bloodelf commoner - random action list - cast '), +(@entry3*100+6, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 71, 0, 0, 2703, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Bloodelf commoner - random action list - Equip'), +(@entry3, 0, 17, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry3*100+7, @entry3*100+8, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'blood elf commoner - On respawn - random action list'), -- blood elf DOTD +(@entry3*100+7, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 29203, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'blood elf commoner - random action list - Morph '), +(@entry3*100+8, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 29204, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'blood elf commoner - random action list - Morph'), +(@entry3, 0, 18, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry3*100+9, @entry3*100+10, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'blood elf commoner - On respawn - random action list'), -- blood elf pirates +(@entry3*100+9, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 25032, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'blood elf commoner - random action list - Morph '), +(@entry3*100+10, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 25043, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'blood elf commoner - random action list - Morph'), +(@entry3, 0, 19, 0, 11, 0, 100, 0, 0, 0, 0, 0, 3, 25868, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'blood elf commoner - On respawn - Morph'), -- blood elf midsummer +(@entry4, 0, 13, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry4*100, @entry4*100+1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'night commoner - On respawn - random action list'), -- night elf christmas +(@entry4*100, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33439, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'night commoner - random action list - cast '), +(@entry4*100+1, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33442, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'night commoner - random action list - cast'), +(@entry4, 0, 14, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry4*100+2, @entry4*100+3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'night commoner - On respawn - random action list'), -- night elf Halloween +(@entry4*100+2, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 43635, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'night commoner - random action list - cast '), +(@entry4*100+3, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 43634, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'night commoner - random action list - cast'), +(@entry4, 0, 15, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry4*100+4, @entry4*100+5, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'night commoner - On respawn - random action list'), -- night elf Lunar +(@entry4*100+4, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33443, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'night commoner - random action list - cast '), +(@entry4*100+5, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33440, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'night commoner - random action list - cast'), +(@entry4, 0, 16, 0, 11, 0, 100, 0, 0, 0, 0, 0, 80, @entry4*100+6, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'night commoner - On respawn - random action list'), -- night elf Brewfest +(@entry4*100+6, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 43913, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'night commoner - random action list - cast '), +(@entry4*100+6, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 71, 0, 0, 2703, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'night commoner - random action list - Equip'), +(@entry4, 0, 17, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry4*100+7, @entry4*100+8, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'night commoner - On respawn - random action list'), -- night commoner DOTD +(@entry4*100+7, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 29203, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'night commoner - random action list - Morph '), +(@entry4*100+8, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 29204, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'night commoner - random action list - Morph'), +(@entry4, 0, 18, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry4*100+9, @entry4*100+10, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'night elf commoner - On respawn - random action list'), -- night elf pirates +(@entry4*100+9, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 25038, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'night elf commoner - random action list - Morph '), +(@entry4*100+10, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 25049, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'night elf commoner - random action list - Morph'), +(@entry4, 0, 19, 0, 11, 0, 100, 0, 0, 0, 0, 0, 3, 25874, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'night elf commoner - On respawn - Morph'), -- night elf midsummer +(@entry5, 0, 13, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry5*100, @entry5*100+1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Draenei - On respawn - random action list'), -- Draenei christmas +(@entry5*100, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33427, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Draenei - random action list - cast '), +(@entry5*100+1, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33430, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Draenei - random action list - cast'), +(@entry5, 0, 14, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry5*100+2, @entry5*100+3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Draenei - On respawn - random action list'), -- Draenei Halloween +(@entry5*100+2, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 43625, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Draenei - random action list - cast '), +(@entry5*100+3, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 43623, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Draenei - random action list - cast'), +(@entry5, 0, 15, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry5*100+4, @entry5*100+5, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Draenei - On respawn - random action list'), -- Draenei Lunar +(@entry5*100+4, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33428, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Draenei - random action list - cast '), +(@entry5*100+5, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33431, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Draenei - random action list - cast'), +(@entry5, 0, 16, 0, 11, 0, 100, 0, 0, 0, 0, 0, 80, @entry5*100+6, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Draenei - On respawn - random action list'), -- Draenei Brewfest +(@entry5*100+6, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 43908, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Draenei - random action list - cast '), +(@entry5*100+6, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 71, 0, 0, 2703, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Draenei commoner - random action list - Equip'), +(@entry5, 0, 17, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry5*100+7, @entry5*100+8, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Draenei commoner - On respawn - random action list'), -- Draenei DOTD +(@entry5*100+7, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 29203, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Draenei commoner - random action list - Morph '), +(@entry5*100+8, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 29204, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Draenei commoner - random action list - Morph'), +(@entry5, 0, 18, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry5*100+9, @entry5*100+10, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Draenei commoner - On respawn - random action list'), -- Draenei pirates +(@entry5*100+9, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 25033, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Draenei commoner - random action list - Morph '), +(@entry5*100+10, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 25044, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Draenei commoner - random action list - Morph'), +(@entry5, 0, 19, 0, 11, 0, 100, 0, 0, 0, 0, 0, 3, 25869, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Draenei commoner - On respawn - Morph'), -- Draenei midsummer +(@entry6, 0, 13, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry6*100, @entry6*100+1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Dwarf commoner - On respawn - random action list'), -- Dwarf christmas +(@entry6*100, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33433, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Dwarf commoner - random action list - cast '), +(@entry6*100+1, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33436, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Dwarf commoner - random action list - cast'), +(@entry6, 0, 14, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry6*100+2, @entry6*100+3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Dwarf - On respawn - random action list'), -- Dwarf Halloween +(@entry6*100+2, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 43626, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Dwarf commoner - random action list - cast '), +(@entry6*100+3, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 43627, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Dwarf commoner - random action list - cast'), +(@entry6, 0, 15, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry6*100+4, @entry6*100+5, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Dwarf - On respawn - random action list'), -- Dwarf Lunar +(@entry6*100+4, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33437, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Dwarf commoner - random action list - cast '), +(@entry6*100+5, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33434, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Dwarf commoner - random action list - cast'), +(@entry6, 0, 16, 0, 11, 0, 100, 0, 0, 0, 0, 0, 80, @entry6*100+6, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Dwarf commoner - On respawn - random action list'), -- Dwarf Brewfest +(@entry6*100+6, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 43909, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Dwarf commoner - random action list - cast '), +(@entry6*100+6, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 71, 0, 0, 13861, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Dwarf commoner - random action list - Equip'), +(@entry6, 0, 17, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry6*100+7, @entry6*100+8, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Dwarf commoner - On respawn - random action list'), -- Dwarf DOTD +(@entry6*100+7, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 29203, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Dwarf commoner - random action list - Morph '), +(@entry6*100+8, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 29204, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Dwarf commoner - random action list - Morph'), +(@entry6, 0, 18, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry6*100+9, @entry6*100+10, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Dwarf commoner - On respawn - random action list'), -- Dwarf pirates +(@entry6*100+9, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 25034, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Dwarf commoner - random action list - Morph '), +(@entry6*100+10, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 25045, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Dwarf commoner - random action list - Morph'), +(@entry6, 0, 19, 0, 11, 0, 100, 0, 0, 0, 0, 0, 3, 25870, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Dwarf commoner - On respawn - Morph'), -- Dwarf midsummer +(@entry7, 0, 13, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry7*100, @entry7*100+1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Troll - On respawn - random action list'), -- Troll christmas +(@entry7*100, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33471, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Troll - random action list - cast '), +(@entry7*100+1, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33468, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Troll - random action list - cast'), +(@entry7, 0, 14, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry7*100+2, @entry7*100+3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Troll - On respawn - random action list'), -- Troll Halloween +(@entry7*100+2, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 43641, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Troll - random action list - cast '), +(@entry7*100+3, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 43640, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Troll - random action list - cast'), +(@entry7, 0, 15, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry7*100+4, @entry7*100+5, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Troll - On respawn - random action list'), -- Troll Lunar +(@entry7*100+4, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33472, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Troll - random action list - cast '), +(@entry7*100+5, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33469, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Troll - random action list - cast'), +(@entry7, 0, 16, 0, 11, 0, 100, 0, 0, 0, 0, 0, 80, @entry7*100+6, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Troll commoner - On respawn - random action list'), -- Troll Brewfest +(@entry7*100+6, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 43916, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Troll commoner - random action list - cast '), +(@entry7*100+6, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 71, 0, 0, 2705, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Troll commoner - random action list - Equip'), +(@entry7, 0, 17, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry7*100+7, @entry7*100+8, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Troll commoner - On respawn - random action list'), -- Troll DOTD +(@entry7*100+7, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 29203, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Troll commoner - random action list - Morph '), +(@entry7*100+8, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 29204, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Troll commoner - random action list - Morph'), +(@entry7, 0, 18, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry7*100+9, @entry7*100+10, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Troll commoner - On respawn - random action list'), -- Troll pirates +(@entry7*100+9, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 25041, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Troll commoner - random action list - Morph '), +(@entry7*100+10, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 25052, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Troll commoner - random action list - Morph'), +(@entry7, 0, 19, 0, 11, 0, 100, 0, 0, 0, 0, 0, 3, 25877, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Troll commoner - On respawn - Morph'), -- Troll midsummer +(@entry8, 0, 13, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry8*100, @entry8*100+1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Tauren - On respawn - random action list'), -- Tauren christmas +(@entry8*100, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33465, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Tauren - random action list - cast '), +(@entry8*100+1, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33458, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Tauren - random action list - cast'), +(@entry8, 0, 14, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry8*100+2, @entry8*100+3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Tauren - On respawn - random action list'), -- Tauren Halloween +(@entry8*100+2, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 43638, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Tauren - random action list - cast '), +(@entry8*100+3, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 43639, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Tauren - random action list - cast'), +(@entry8, 0, 15, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry8*100+4, @entry8*100+5, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Tauren - On respawn - random action list'), -- Tauren Lunar +(@entry8*100+4, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33459, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Tauren - random action list - cast '), +(@entry8*100+5, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33466, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Tauren - random action list - cast'), +(@entry8, 0, 16, 0, 11, 0, 100, 0, 0, 0, 0, 0, 80, @entry8*100+6, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Tauren commoner - On respawn - random action list'), -- Tauren Brewfest +(@entry8*100+6, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 43915, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Tauren commoner - random action list - cast '), +(@entry8*100+6, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 71, 0, 0, 2705, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Tauren commoner - random action list - Equip'), +(@entry8, 0, 17, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry8*100+7, @entry8*100+8, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Tauren commoner - On respawn - random action list'), -- Tauren DOTD +(@entry8*100+7, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 29203, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Tauren commoner - random action list - Morph '), +(@entry8*100+8, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 29204, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Tauren commoner - random action list - Morph'), +(@entry8, 0, 18, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry8*100+9, @entry8*100+10, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Tauren commoner - On respawn - random action list'), -- Tauren pirates +(@entry8*100+9, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 25040, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Tauren commoner - random action list - Morph '), +(@entry8*100+10, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 25051, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Tauren commoner - random action list - Morph'), +(@entry8, 0, 19, 0, 11, 0, 100, 0, 0, 0, 0, 0, 3, 25876, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Tauren commoner - On respawn - Morph'), -- Tauren midsummer +(@entry9, 0, 13, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry9*100, @entry9*100+1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Undead - On respawn - random action list'), -- Undead christmas +(@entry9*100, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33474, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Undead - random action list - cast '), +(@entry9*100+1, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33477, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Undead - random action list - cast'), +(@entry9, 0, 14, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry9*100+2, @entry9*100+3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Undead - On respawn - random action list'), -- Undead christmas +(@entry9*100+2, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 43642, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Undead - random action list - cast '), +(@entry9*100+3, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 43643, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Undead - random action list - cast'), +(@entry9, 0, 15, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry9*100+4, @entry9*100+5, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Undead - On respawn - random action list'), -- Undead Lunar +(@entry9*100+4, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33478, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Undead - random action list - cast '), +(@entry9*100+5, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33475, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Undead - random action list - cast'), +(@entry9, 0, 16, 0, 11, 0, 100, 0, 0, 0, 0, 0, 80, @entry9*100+6, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Undead commoner - On respawn - random action list'), -- Undead Brewfest +(@entry9*100+6, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 43917, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Undead commoner - random action list - cast '), +(@entry9*100+6, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 71, 0, 0, 2705, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Undead commoner - random action list - Equip'), +(@entry9, 0, 17, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry9*100+7, @entry9*100+8, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Undead commoner - On respawn - random action list'), -- Undead DOTD +(@entry9*100+7, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 29203, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Undead commoner - random action list - Morph '), +(@entry9*100+8, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 29204, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Undead commoner - random action list - Morph'), +(@entry9, 0, 18, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry9*100+9, @entry9*100+10, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'undead commoner - On respawn - random action list'), -- undead pirates +(@entry9*100+9, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 25042, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'undead commoner - random action list - Morph '), +(@entry9*100+10, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 25053, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'undead commoner - random action list - Morph'), +(@entry9, 0, 19, 0, 11, 0, 100, 0, 0, 0, 0, 0, 3, 25878, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'undead commoner - On respawn - Morph'), -- undead midsummer +(@entry10, 0, 13, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry10*100, @entry10*100+1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Human - On respawn - random action list'), -- Human christmas +(@entry10*100, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33402, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Human - random action list - cast '), +(@entry10*100+1, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33403, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Human - random action list - cast'), +(@entry10, 0, 14, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry10*100+2, @entry10*100+3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Human - On respawn - random action list'), -- Human Halloween +(@entry10*100+2, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 43633, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Human - random action list - cast '), +(@entry10*100+3, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 43632, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Human - random action list - cast'), +(@entry10, 0, 15, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry10*100+4, @entry10*100+5, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Human - On respawn - random action list'), -- Human Lunar +(@entry10*100+4, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33397, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Human - random action list - cast '), +(@entry10*100+5, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33398, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Human - random action list - cast'), +(@entry10, 0, 16, 0, 11, 0, 100, 0, 0, 0, 0, 0, 80, @entry10*100+6, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Human commoner - On respawn - random action list'), -- Human Brewfest +(@entry10*100+6, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 43912, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Human commoner - random action list - cast '), +(@entry10*100+6, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 71, 0, 0, 2705, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Human commoner - random action list - Equip'), +(@entry10, 0, 17, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry10*100+7, @entry10*100+8, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Human commoner - On respawn - random action list'), -- Human DOTD +(@entry10*100+7, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 29203, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Human commoner - random action list - Morph '), +(@entry10*100+8, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 29204, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Human commoner - random action list - Morph'), +(@entry10, 0, 18, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry10*100+9, @entry10*100+10, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Human commoner - On respawn - random action list'), -- Human pirates +(@entry10*100+9, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 25037, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Human commoner - random action list - Morph '), +(@entry10*100+10, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 25048, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Human commoner - random action list - Morph'), +(@entry10, 0, 19, 0, 11, 0, 100, 0, 0, 0, 0, 0, 3, 25873, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Human commoner - On respawn - Morph'), -- Human midsummer +(@entry11, 0, 13, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry11*100, @entry11*100+1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Orc - On respawn - random action list'), -- Orc christmas +(@entry11*100, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33451, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Orc - random action list - cast '), +(@entry11*100+1, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33455, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Orc - random action list - cast'), +(@entry11, 0, 14, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry11*100+2, @entry11*100+3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Orc - On respawn - random action list'), -- Orc Halloween +(@entry11*100+2, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 43637, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Orc - random action list - cast '), +(@entry11*100+3, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 43636, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Orc - random action list - cast'), +(@entry11, 0, 15, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry11*100+4, @entry11*100+5, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Orc - On respawn - random action list'), -- Orc Lunar +(@entry11*100+4, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33456, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Orc - random action list - cast '), +(@entry11*100+5, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 33453, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Orc - random action list - cast'), +(@entry11, 0, 16, 0, 11, 0, 100, 0, 0, 0, 0, 0, 80, @entry11*100+6, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Orc commoner - On respawn - random action list'), -- Orc Brewfest +(@entry11*100+6, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 43914, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Orc commoner - random action list - cast '), +(@entry11*100+6, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 71, 0, 0, 2705, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Orc commoner - random action list - Equip'), +(@entry11, 0, 17, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry11*100+7, @entry11*100+8, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Orc commoner - On respawn - random action list'), -- Orc DOTD +(@entry11*100+7, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 29203, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Orc commoner - random action list - Morph '), +(@entry11*100+8, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 29204, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Orc commoner - random action list - Morph'), +(@entry11, 0, 18, 0, 11, 0, 100, 0, 0, 0, 0, 0, 87, @entry11*100+9, @entry11*100+10, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Orc commoner - On respawn - random action list'), -- Orc pirates +(@entry11*100+9, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 25039, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Orc commoner - random action list - Morph '), +(@entry11*100+10, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 3, 0, 25050, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Orc commoner - random action list - Morph'), +(@entry11, 0, 19, 0, 11, 0, 100, 0, 0, 0, 0, 0, 3, 25875, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Orc commoner - On respawn - Morph'); -- Orc midsummer + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceEntry` IN (20102,18927,19177,19169,19175,19171,19172,19176,19178,19173,19148) AND `SourceGroup` >13; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(22, 14, 19148, 0, 0, 12, 1, 2, 0, 0, 0, 0, 0, '', 'Commoner - Winter Veil must be active'), +(22, 14, 20102, 0, 0, 12, 1, 2, 0, 0, 0, 0, 0, '', 'Commoner - Winter Veil must be active'), +(22, 14, 18927, 0, 0, 12, 1, 2, 0, 0, 0, 0, 0, '', 'Commoner - Winter Veil must be active'), +(22, 14, 19171, 0, 0, 12, 1, 2, 0, 0, 0, 0, 0, '', 'Commoner - Winter Veil must be active'), +(22, 14, 19172, 0, 0, 12, 1, 2, 0, 0, 0, 0, 0, '', 'Commoner - Winter Veil must be active'), +(22, 14, 19173, 0, 0, 12, 1, 2, 0, 0, 0, 0, 0, '', 'Commoner - Winter Veil must be active'), +(22, 14, 19175, 0, 0, 12, 1, 2, 0, 0, 0, 0, 0, '', 'Commoner - Winter Veil must be active'), +(22, 14, 19176, 0, 0, 12, 1, 2, 0, 0, 0, 0, 0, '', 'Commoner - Winter Veil must be active'), +(22, 14, 19177, 0, 0, 12, 1, 2, 0, 0, 0, 0, 0, '', 'Commoner - Winter Veil must be active'), +(22, 14, 19178, 0, 0, 12, 1, 2, 0, 0, 0, 0, 0, '', 'Commoner - Winter Veil must be active'), +(22, 14, 19169, 0, 0, 12, 1, 2, 0, 0, 0, 0, 0, '', 'Commoner - Winter Veil must be active'), +(22, 15, 19148, 0, 0, 12, 1, 12, 0, 0, 0, 0, 0, '', 'Commoner - Hallow''s End must be active'), +(22, 15, 20102, 0, 0, 12, 1, 12, 0, 0, 0, 0, 0, '', 'Commoner - Hallow''s End must be active'), +(22, 15, 18927, 0, 0, 12, 1, 12, 0, 0, 0, 0, 0, '', 'Commoner - Hallow''s End must be active'), +(22, 15, 19171, 0, 0, 12, 1, 12, 0, 0, 0, 0, 0, '', 'Commoner - Hallow''s End must be active'), +(22, 15, 19172, 0, 0, 12, 1, 12, 0, 0, 0, 0, 0, '', 'Commoner - Hallow''s End must be active'), +(22, 15, 19173, 0, 0, 12, 1, 12, 0, 0, 0, 0, 0, '', 'Commoner - Hallow''s End must be active'), +(22, 15, 19175, 0, 0, 12, 1, 12, 0, 0, 0, 0, 0, '', 'Commoner - Hallow''s End must be active'), +(22, 15, 19176, 0, 0, 12, 1, 12, 0, 0, 0, 0, 0, '', 'Commoner - Hallow''s End must be active'), +(22, 15, 19177, 0, 0, 12, 1, 12, 0, 0, 0, 0, 0, '', 'Commoner - Hallow''s End must be active'), +(22, 15, 19178, 0, 0, 12, 1, 12, 0, 0, 0, 0, 0, '', 'Commoner - Hallow''s End must be active'), +(22, 15, 19169, 0, 0, 12, 1, 12, 0, 0, 0, 0, 0, '', 'Commoner - Hallow''s End must be active'), +(22, 16, 19148, 0, 0, 12, 1, 7, 0, 0, 0, 0, 0, '', 'Commoner - Lunar Festival must be active'), +(22, 16, 20102, 0, 0, 12, 1, 7, 0, 0, 0, 0, 0, '', 'Commoner - Lunar Festival must be active'), +(22, 16, 18927, 0, 0, 12, 1, 7, 0, 0, 0, 0, 0, '', 'Commoner - Lunar Festival must be active'), +(22, 16, 19171, 0, 0, 12, 1, 7, 0, 0, 0, 0, 0, '', 'Commoner - Lunar Festival must be active'), +(22, 16, 19172, 0, 0, 12, 1, 7, 0, 0, 0, 0, 0, '', 'Commoner - Lunar Festival must be active'), +(22, 16, 19173, 0, 0, 12, 1, 7, 0, 0, 0, 0, 0, '', 'Commoner - Lunar Festival must be active'), +(22, 16, 19175, 0, 0, 12, 1, 7, 0, 0, 0, 0, 0, '', 'Commoner - Lunar Festival must be active'), +(22, 16, 19176, 0, 0, 12, 1, 7, 0, 0, 0, 0, 0, '', 'Commoner - Lunar Festival must be active'), +(22, 16, 19177, 0, 0, 12, 1, 7, 0, 0, 0, 0, 0, '', 'Commoner - Lunar Festival must be active'), +(22, 16, 19178, 0, 0, 12, 1, 7, 0, 0, 0, 0, 0, '', 'Commoner - Lunar Festival must be active'), +(22, 16, 19169, 0, 0, 12, 1, 7, 0, 0, 0, 0, 0, '', 'Commoner - Lunar Festival must be active'), +(22, 17, 19148, 0, 0, 12, 1, 24, 0, 0, 0, 0, 0, '', 'Commoner - Brew Fest must be active'), +(22, 17, 20102, 0, 0, 12, 1, 24, 0, 0, 0, 0, 0, '', 'Commoner - Brew Fest must be active'), +(22, 17, 18927, 0, 0, 12, 1, 24, 0, 0, 0, 0, 0, '', 'Commoner - Brew Fest must be active'), +(22, 17, 19171, 0, 0, 12, 1, 24, 0, 0, 0, 0, 0, '', 'Commoner - Brew Fest must be active'), +(22, 17, 19172, 0, 0, 12, 1, 24, 0, 0, 0, 0, 0, '', 'Commoner - Brew Fest must be active'), +(22, 17, 19173, 0, 0, 12, 1, 24, 0, 0, 0, 0, 0, '', 'Commoner - Brew Fest must be active'), +(22, 17, 19175, 0, 0, 12, 1, 24, 0, 0, 0, 0, 0, '', 'Commoner - Brew Fest must be active'), +(22, 17, 19176, 0, 0, 12, 1, 24, 0, 0, 0, 0, 0, '', 'Commoner - Brew Fest must be active'), +(22, 17, 19177, 0, 0, 12, 1, 24, 0, 0, 0, 0, 0, '', 'Commoner - Brew Fest must be active'), +(22, 17, 19178, 0, 0, 12, 1, 24, 0, 0, 0, 0, 0, '', 'Commoner - Brew Fest must be active'), +(22, 17, 19169, 0, 0, 12, 1, 24, 0, 0, 0, 0, 0, '', 'Commoner - Brew Fest must be active'), +(22, 18, 19148, 0, 0, 12, 1, 51, 0, 0, 0, 0, 0, '', 'Commoner - DOTD must be active'), +(22, 18, 20102, 0, 0, 12, 1, 51, 0, 0, 0, 0, 0, '', 'Commoner - DOTD must be active'), +(22, 18, 18927, 0, 0, 12, 1, 51, 0, 0, 0, 0, 0, '', 'Commoner - DOTD must be active'), +(22, 18, 19171, 0, 0, 12, 1, 51, 0, 0, 0, 0, 0, '', 'Commoner - DOTD must be active'), +(22, 18, 19172, 0, 0, 12, 1, 51, 0, 0, 0, 0, 0, '', 'Commoner - DOTD must be active'), +(22, 18, 19173, 0, 0, 12, 1, 51, 0, 0, 0, 0, 0, '', 'Commoner - DOTD must be active'), +(22, 18, 19175, 0, 0, 12, 1, 51, 0, 0, 0, 0, 0, '', 'Commoner - DOTD must be active'), +(22, 18, 19176, 0, 0, 12, 1, 51, 0, 0, 0, 0, 0, '', 'Commoner - DOTD must be active'), +(22, 18, 19177, 0, 0, 12, 1, 51, 0, 0, 0, 0, 0, '', 'Commoner - DOTD must be active'), +(22, 18, 19178, 0, 0, 12, 1, 51, 0, 0, 0, 0, 0, '', 'Commoner - DOTD must be active'), +(22, 18, 19169, 0, 0, 12, 1, 51, 0, 0, 0, 0, 0, '', 'Commoner - DOTD must be active'), +(22, 19, 19148, 0, 0, 12, 1, 50, 0, 0, 0, 0, 0, '', 'Commoner - Pirates Day must be active'), +(22, 19, 20102, 0, 0, 12, 1, 50, 0, 0, 0, 0, 0, '', 'Commoner - Pirates Day must be active'), +(22, 19, 18927, 0, 0, 12, 1, 50, 0, 0, 0, 0, 0, '', 'Commoner - Pirates Day must be active'), +(22, 19, 19171, 0, 0, 12, 1, 50, 0, 0, 0, 0, 0, '', 'Commoner - Pirates Day must be active'), +(22, 19, 19172, 0, 0, 12, 1, 50, 0, 0, 0, 0, 0, '', 'Commoner - Pirates Day must be active'), +(22, 19, 19173, 0, 0, 12, 1, 50, 0, 0, 0, 0, 0, '', 'Commoner - Pirates Day must be active'), +(22, 19, 19175, 0, 0, 12, 1, 50, 0, 0, 0, 0, 0, '', 'Commoner - Pirates Day must be active'), +(22, 19, 19176, 0, 0, 12, 1, 50, 0, 0, 0, 0, 0, '', 'Commoner - Pirates Day must be active'), +(22, 19, 19177, 0, 0, 12, 1, 50, 0, 0, 0, 0, 0, '', 'Commoner - Pirates Day must be active'), +(22, 19, 19178, 0, 0, 12, 1, 50, 0, 0, 0, 0, 0, '', 'Commoner - Pirates Day must be active'), +(22, 19, 19169, 0, 0, 12, 1, 50, 0, 0, 0, 0, 0, '', 'Commoner - Pirates Day must be active'), +(22, 20, 19148, 0, 0, 12, 1, 1, 0, 0, 0, 0, 0, '', 'Commoner - Midsummer Fire Festival must be active'), +(22, 20, 20102, 0, 0, 12, 1, 1, 0, 0, 0, 0, 0, '', 'Commoner - Midsummer Fire Festival must be active'), +(22, 20, 18927, 0, 0, 12, 1, 1, 0, 0, 0, 0, 0, '', 'Commoner - Midsummer Fire Festival must be active'), +(22, 20, 19171, 0, 0, 12, 1, 1, 0, 0, 0, 0, 0, '', 'Commoner - Midsummer Fire Festival must be active'), +(22, 20, 19172, 0, 0, 12, 1, 1, 0, 0, 0, 0, 0, '', 'Commoner - Midsummer Fire Festival must be active'), +(22, 20, 19173, 0, 0, 12, 1, 1, 0, 0, 0, 0, 0, '', 'Commoner - Midsummer Fire Festival must be active'), +(22, 20, 19175, 0, 0, 12, 1, 1, 0, 0, 0, 0, 0, '', 'Commoner - Midsummer Fire Festival must be active'), +(22, 20, 19176, 0, 0, 12, 1, 1, 0, 0, 0, 0, 0, '', 'Commoner - Midsummer Fire Festival must be active'), +(22, 20, 19177, 0, 0, 12, 1, 1, 0, 0, 0, 0, 0, '', 'Commoner - Midsummer Fire Festival must be active'), +(22, 20, 19178, 0, 0, 12, 1, 1, 0, 0, 0, 0, 0, '', 'Commoner - Midsummer Fire Festival must be active'), +(22, 20, 19169, 0, 0, 12, 1, 1, 0, 0, 0, 0, 0, '', 'Commoner - Midsummer Fire Festival must be active'); + +DELETE FROM `game_event_creature_quest` WHERE `quest` IN (13483, 13484); +INSERT INTO `game_event_creature_quest` (`eventEntry`, `id`, `quest`) VALUES +(9, 19148, 13484), +(9, 18927, 13484), +(9, 19178, 13483), +(9, 19177, 13483), +(9, 19176, 13483), +(9, 19175, 13483), +(9, 19169, 13483), +(9, 19171, 13484), +(9, 19172, 13484), +(9, 19173, 13484), +(9, 20102, 13484), +(9, 20102, 13483); + +DELETE FROM `creature_queststarter` WHERE `id` IN(20102, 19172, 19169, 19173, 19171, 19148, 19177, 19176, 19178, 18927, 19175); diff --git a/sql/updates/world/2016_02_17_01_world.sql b/sql/updates/world/2016_02_17_01_world.sql new file mode 100644 index 00000000000..20f3605b197 --- /dev/null +++ b/sql/updates/world/2016_02_17_01_world.sql @@ -0,0 +1,40 @@ +UPDATE `creature_template` SET `AIName`='SmartAI',`npcflag`=1,`gossip_menu_id`=10990 WHERE `entry`IN(37671,38065); +UPDATE `creature` SET `npcflag`=3 WHERE `id`=38293; + +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid` IN(37172,38066) AND `id`>2; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid` IN(37671,38065); + +DELETE FROM `smart_scripts` WHERE `source_type`=2 AND `entryorguid` IN(5703,5705) AND `id`=1; + +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 +(37671, 0, 0, 0, 38, 0, 100, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 21, 100, 0, 0, 0, 0, 0, 0, 'Crown Supply Guard - On Data Set - Say'), +(38065, 0, 0, 0, 38, 0, 100, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 21, 100, 0, 0, 0, 0, 0, 0, 'Crown Supply Guard - On Data Set - Say'), +(37172, 0, 3, 0, 8, 0, 100, 0, 69445, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Detective Snap Snagglebolt - On Spellhit - say'), +(37172, 0, 4, 0, 8, 0, 100, 0, 69563, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Detective Snap Snagglebolt - On Spellhit - say'), +(37172, 0, 5, 0, 8, 0, 100, 0, 69489, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Detective Snap Snagglebolt - On Spellhit - say'), +(38066, 0, 3, 0, 8, 0, 100, 0, 69445, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Inspector Snip Snagglebolt - On Spellhit - say'), +(38066, 0, 4, 0, 8, 0, 100, 0, 69563, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Inspector Snip Snagglebolt - On Spellhit - say'), +(38066, 0, 5, 0, 8, 0, 100, 0, 69489, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Inspector Snip Snagglebolt - On Spellhit - say'), +(5703,2,1,0,61,0,100,0,0,0,0,0,45,1,1,0,0,0,0,10,208843,38065,0,0,0,0,0,"On Trigger - Set Data"), +(5705,2,1,0,61,0,100,0,0,0,0,0,45,1,1,0,0,0,0,10,48573,37671,0,0,0,0,0,"On Trigger - Set Data"); + +UPDATE `smart_scripts` SET `link`=1 WHERE `entryorguid`IN(5703,5705) AND `source_type`=2 AND `id`=0 AND `link`=0; + +DELETE FROM `creature_text` WHERE `entry` IN(37172,38066,37671,38065); +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(37671, 0, 0, 'That crate won''t deliver itself, friend. Get a move on!', 12, 0, 100, 1, 0, 0, 38024, 0, 'Crown Supply Guard'), +(38065, 0, 0, 'That crate won''t deliver itself, friend. Get a move on!', 12, 0, 100, 1, 0, 0, 38024, 0, 'Crown Supply Guard'), +(37172, 0, 0, 'You know, that does smell pretty... Hey! Stop spraying that thing at me!', 12, 0, 100, 1, 0, 0, 38296, 0, 'Detective Snap Snagglebolt'), +(37172, 1, 0, 'Don''t tempt me! Do you even know what''s in those things?', 12, 0, 100, 1, 0, 0, 38382, 0, 'Detective Snap Snagglebolt'), +(38066, 0, 0, 'You know, that does smell pretty... Hey! Stop spraying that thing at me!', 12, 0, 100, 1, 0, 0, 38296, 0, 'Inspector Snip Snagglebolt'), +(38066, 1, 0, 'Don''t tempt me! Do you even know what''s in those things?', 12, 0, 100, 1, 0, 0, 38382, 0, 'Inspector Snip Snagglebolt'); + +DELETE FROM `gossip_menu` WHERE `entry`=10990; +INSERT INTO `gossip_menu` (`entry`, `text_id`) VALUES +(10990, 15282), +(10990, 15280); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=14 AND `SourceGroup`=10990; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(14, 10990, 15280, 0, 0, 1, 0, 71450, 0, 0, 1, 0, 0, '', 'Crown Guard has different gossip if player has no aura Crown Parcel Service Uniform'), +(14, 10990, 15282, 0, 0, 1, 0, 71450, 0, 0, 0, 0, 0, '', 'Crown Guard has different gossip if player has aura Crown Parcel Service Uniform'); diff --git a/sql/updates/world/2016_02_17_02_world.sql b/sql/updates/world/2016_02_17_02_world.sql new file mode 100644 index 00000000000..6590396b7d9 --- /dev/null +++ b/sql/updates/world/2016_02_17_02_world.sql @@ -0,0 +1,21 @@ + UPDATE `creature_template` SET `gossip_menu_id`=10948, `npcflag`=3, `AIName`='SmartAI' WHERE `entry` IN(38045,38044,38043,38042,38041,38040,38039,37887); + + DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid` IN (38045,38044,38043,38042,38041,38040,38039,37887); + + 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 + (38045, 0, 0, 1, 62, 0, 100, 0, 10948, 0, 0, 0, 11, 70648, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Kwee Q. Peddlefeet - On Gossip Option Select - Cast Create Lovely Charm Collectors Kit'), + (38045, 0, 1, 0, 61, 0, 100, 0, 10948, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Kwee Q. Peddlefeet - On Gossip Option Select - Close Gossip'), + (38044, 0, 0, 1, 62, 0, 100, 0, 10948, 0, 0, 0, 11, 70648, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Kwee Q. Peddlefeet - On Gossip Option Select - Cast Create Lovely Charm Collectors Kit'), + (38044, 0, 1, 0, 61, 0, 100, 0, 10948, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Kwee Q. Peddlefeet - On Gossip Option Select - Close Gossip'), + (38043, 0, 0, 1, 62, 0, 100, 0, 10948, 0, 0, 0, 11, 70648, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Kwee Q. Peddlefeet - On Gossip Option Select - Cast Create Lovely Charm Collectors Kit'), + (38043, 0, 1, 0, 61, 0, 100, 0, 10948, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Kwee Q. Peddlefeet - On Gossip Option Select - Close Gossip'), + (38042, 0, 0, 1, 62, 0, 100, 0, 10948, 0, 0, 0, 11, 70648, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Kwee Q. Peddlefeet - On Gossip Option Select - Cast Create Lovely Charm Collectors Kit'), + (38042, 0, 1, 0, 61, 0, 100, 0, 10948, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Kwee Q. Peddlefeet - On Gossip Option Select - Close Gossip'), + (38041, 0, 0, 1, 62, 0, 100, 0, 10948, 0, 0, 0, 11, 70648, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Kwee Q. Peddlefeet - On Gossip Option Select - Cast Create Lovely Charm Collectors Kit'), + (38041, 0, 1, 0, 61, 0, 100, 0, 10948, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Kwee Q. Peddlefeet - On Gossip Option Select - Close Gossip'), + (38040, 0, 0, 1, 62, 0, 100, 0, 10948, 0, 0, 0, 11, 70648, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Kwee Q. Peddlefeet - On Gossip Option Select - Cast Create Lovely Charm Collectors Kit'), + (38040, 0, 1, 0, 61, 0, 100, 0, 10948, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Kwee Q. Peddlefeet - On Gossip Option Select - Close Gossip'), + (38039, 0, 0, 1, 62, 0, 100, 0, 10948, 0, 0, 0, 11, 70648, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Kwee Q. Peddlefeet - On Gossip Option Select - Cast Create Lovely Charm Collectors Kit'), + (38039, 0, 1, 0, 61, 0, 100, 0, 10948, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Kwee Q. Peddlefeet - On Gossip Option Select - Close Gossip'), + (37887, 0, 0, 1, 62, 0, 100, 0, 10948, 0, 0, 0, 11, 70648, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Kwee Q. Peddlefeet - On Gossip Option Select - Cast Create Lovely Charm Collectors Kit'), + (37887, 0, 1, 0, 61, 0, 100, 0, 10948, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Kwee Q. Peddlefeet - On Gossip Option Select - Close Gossip'); diff --git a/sql/updates/world/2016_02_18_00_world.sql b/sql/updates/world/2016_02_18_00_world.sql new file mode 100644 index 00000000000..c20196ddc80 --- /dev/null +++ b/sql/updates/world/2016_02_18_00_world.sql @@ -0,0 +1,7 @@ +-- Add missing creature text for Mr. Smite in Deadmines. +DELETE FROM creature_text WHERE entry=646; +INSERT INTO creature_text (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(646, 0, 0, 'You there, check out that noise!', 14, 0, 100, 0, 0, 5775, 1148, 2, 'smite SAY_ALARM1'), +(646, 1, 0, 'We\'re under attack! Avast, ye swabs! Repel the invaders!', 14, 0, 100, 0, 0, 5777, 1149, 2, 'smite SAY_ALARM2'), +(646, 2, 0, 'You landlubbers are tougher than I thought, I\'ll have to Improvise!', 12, 0, 100, 0, 0, 5778, 1344, 0, 'smite SAY_PHASE_1'), +(646, 3, 0, 'D\'ah! Now you\'re making me angry!', 12, 0, 100, 0, 0, 5779, 1345, 0, 'smite SAY_PHASE_2'); diff --git a/sql/updates/world/2016_02_18_01_world.sql b/sql/updates/world/2016_02_18_01_world.sql new file mode 100644 index 00000000000..c3ffdbb6344 --- /dev/null +++ b/sql/updates/world/2016_02_18_01_world.sql @@ -0,0 +1,49 @@ +UPDATE `creature_template` SET `spell2`=61784,`spell3`=61785,`spell4`=61788,`spell5`=61786,`spell6`=61787 WHERE `entry` IN (34812,34819,34822,34823,34824); +-- The Turkey Chair +UPDATE `creature_template` SET `spell1`=66250 WHERE `entry`=34812; +UPDATE `creature_template_addon` SET `auras`='61796 61801' WHERE `entry`=34812; +-- The Stuffing Chair +UPDATE `creature_template` SET `spell1`=66259 WHERE `entry`=34819; +UPDATE `creature_template_addon` SET `auras`='61795 61800' WHERE `entry`=34819; +-- The Pie Chair +UPDATE `creature_template` SET `spell1`=66260 WHERE `entry`=34822; +UPDATE `creature_template_addon` SET `auras`='61794 61799' WHERE `entry`=34822; +-- The Cranberry Chair +UPDATE `creature_template` SET `spell1`=66261 WHERE `entry`=34823; +UPDATE `creature_template_addon` SET `auras`='61793 61798' WHERE `entry`=34823; +-- The Potato Chair +UPDATE `creature_template` SET `spell1`=66262 WHERE `entry`=34824; +UPDATE `creature_template_addon` SET `auras`='61797 61802' WHERE `entry`=34824; + +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_pilgrims_bounty_feast_on'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(61784, 'spell_pilgrims_bounty_feast_on'), -- Feast On Turkey +(61785, 'spell_pilgrims_bounty_feast_on'), -- Feast On Cranberries +(61786, 'spell_pilgrims_bounty_feast_on'), -- Feast On Sweet Potatoes +(61787, 'spell_pilgrims_bounty_feast_on'), -- Feast On Pie +(61788, 'spell_pilgrims_bounty_feast_on'); -- Feast On Stuffing + +DELETE FROM `spell_script_names` WHERE `ScriptName` IN +('spell_pilgrims_bounty_well_fed_cranberry', +'spell_pilgrims_bounty_well_fed_turkey', +'spell_pilgrims_bounty_well_fed_stuffing', +'spell_pilgrims_bounty_well_fed_sweet_potatoes', +'spell_pilgrims_bounty_well_fed_pie'); +INSERT INTO `spell_script_names` (`spell_id` ,`ScriptName`) VALUES +(61841, 'spell_pilgrims_bounty_well_fed_cranberry'), +(61842, 'spell_pilgrims_bounty_well_fed_turkey'), +(61843, 'spell_pilgrims_bounty_well_fed_stuffing'), +(61844, 'spell_pilgrims_bounty_well_fed_sweet_potatoes'), +(61845, 'spell_pilgrims_bounty_well_fed_pie'); + +-- Pilgrim's Paunch criterias +DELETE FROM `achievement_criteria_data` WHERE `criteria_id` IN (11078,11079,11080,11081,11082,11083,11084,11085); +INSERT INTO `achievement_criteria_data` (`criteria_id`, `type`, `value1`, `value2`) VALUES +(11078,6,1657,0), +(11079,6,809,0), +(11080,6,3557,0), +(11081,6,12,0), +(11082,6,14,0), +(11083,6,3470,0), +(11084,6,1638,0), +(11085,6,1497,0); diff --git a/sql/updates/world/2016_02_18_02_world.sql b/sql/updates/world/2016_02_18_02_world.sql new file mode 100644 index 00000000000..414c6fd9c3a --- /dev/null +++ b/sql/updates/world/2016_02_18_02_world.sql @@ -0,0 +1,5 @@ +-- Change Egbert's script name +UPDATE creature_template SET ScriptName = "npc_pet_gen_egbert" WHERE entry = 23258; + +-- Change Pandaran Monk's script name +UPDATE creature_template SET ScriptName = "npc_pet_gen_pandaren_monk" WHERE entry = 36911; diff --git a/sql/updates/world/2016_02_19_00_world.sql b/sql/updates/world/2016_02_19_00_world.sql new file mode 100644 index 00000000000..bee93f7bdd4 --- /dev/null +++ b/sql/updates/world/2016_02_19_00_world.sql @@ -0,0 +1,9 @@ +UPDATE `quest_template_addon` SET `PrevQuestID` =0 WHERE `ID` IN(24536,24655); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN (19,20) AND `SourceEntry`IN(24805,24804) AND `ConditionTypeOrReference`=14 AND `ConditionValue1` IN(24536,24655); + +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(19, 0, 24805, 0, 0, 14, 0, 24536, 0, 0, 0, 0, 0, '', 'Uncommon Scents is optional BreadCrumb Quest'), +(20, 0, 24805, 0, 0, 14, 0, 24536, 0, 0, 0, 0, 0, '', 'Uncommon Scents is optional BreadCrumb Quest'), +(19, 0, 24804, 0, 0, 14, 0, 24655, 0, 0, 0, 0, 0, '', 'Uncommon Scents is optional BreadCrumb Quest'), +(20, 0, 24804, 0, 0, 14, 0, 24655, 0, 0, 0, 0, 0, '', 'Uncommon Scents is optional BreadCrumb Quest'); diff --git a/sql/updates/world/2016_02_19_01_world_335.sql b/sql/updates/world/2016_02_19_01_world_335.sql new file mode 100644 index 00000000000..f7fee657170 --- /dev/null +++ b/sql/updates/world/2016_02_19_01_world_335.sql @@ -0,0 +1,8 @@ +-- +DELETE FROM `spell_proc_event` WHERE `entry`= 56841; +INSERT INTO `spell_proc_event` (`entry`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `procFlags`, `procEx`, `ppmRate`, `CustomChance`, `Cooldown`) VALUES +(56841, 0, 9, 0x800, 0x800, 0x800, 0x100, 0, 0, 0, 0); + +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_hun_glyph_of_arcane_shot'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(56841,'spell_hun_glyph_of_arcane_shot'); diff --git a/sql/updates/world/2016_02_22_00_world.sql b/sql/updates/world/2016_02_22_00_world.sql new file mode 100644 index 00000000000..d92ea91681a --- /dev/null +++ b/sql/updates/world/2016_02_22_00_world.sql @@ -0,0 +1,2 @@ +-- baron geddon & ragnaros do pure fire elemental damage with melee attacks +UPDATE `creature_template` SET `dmgschool`=2 WHERE `entry` in (12056,11502); diff --git a/sql/updates/world/2016_02_22_01_world.sql b/sql/updates/world/2016_02_22_01_world.sql new file mode 100644 index 00000000000..b1345bb1aab --- /dev/null +++ b/sql/updates/world/2016_02_22_01_world.sql @@ -0,0 +1,26 @@ +UPDATE`spell_dbc` SET `Effect1`=28, `EffectMiscValueB1`=64 WHERE `Id`IN(38953,38955,38956,38957,38958,38978); +UPDATE `creature_template` SET `AIName`='SmartAI', `ScriptName`='' WHERE `entry` =22355; +DELETE FROM `smart_scripts` WHERE `entryorguid` =22355 AND `source_type`=0; +DELETE FROM `smart_scripts` WHERE `source_type`=9 AND `entryorguid` BETWEEN 2235500 AND 2235505; + +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 +(22355, 0, 0, 1, 11, 0, 100, 1, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - On Respawn - Disable Combat Movement (No Repeat)'), +(22355, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 18, 2097152, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - On Respawn - Set Flag Disarmed (No Repeat)'), +(22355, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 42, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - On Respawn - Set Invincibility HP'), +(22355, 0, 3, 0, 4, 0, 100, 0, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - On Agro - Store Target List (No Repeat)'), +(22355, 0, 4, 5, 2, 0, 100, 1, 0, 0, 0, 0, 11, 38949, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - On 1% HP - Cast Terokkar Free Webbed Creature (No Repeat)'), +(22355, 0, 5, 6,61, 0, 100, 1, 0, 0, 0, 0, 11, 38950, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - On 1% HP - Cast Terokkar Free Webbed Creature ON QUEST (No Repeat)'), +(22355, 0, 6, 0,61, 0, 100, 1, 0, 0, 0, 0, 87, 2233500, 2233501, 2233502, 2233503, 2233504, 2233505, 1, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - On 1% HP - Run Random Script (No Repeat)'), +(2235500, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 38953, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - Script 1 - Cast Terokkar Free Webbed Creature '), +(2235500, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - Script 1 - Die'), +(2235501, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 38955, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - Script 2 - Cast Terokkar Free Webbed Creature '), +(2235501, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - Script 2 - Die'), +(2235502, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 38956, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - Script 3 - Cast Terokkar Free Webbed Creature '), +(2235502, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - Script 3 - Die'), +(2235503, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 38957, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - Script 4 - Cast Terokkar Free Webbed Creature '), +(2235503, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - Script 4 - Die'), +(2235504, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 38958, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - Script 5 - Cast Terokkar Free Webbed Creature '), +(2235504, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - Script 5 - Die'), +(2235505, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 33, 22459, 2, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - Script 6 - Kill Credit'), +(2235505, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 38978, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - Script 6 - Cast Terokkar Free Webbed Creature '), +(2235505, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - Script 6 - Die'); diff --git a/sql/updates/world/2016_02_22_02_world.sql b/sql/updates/world/2016_02_22_02_world.sql new file mode 100644 index 00000000000..dd62e6dce29 --- /dev/null +++ b/sql/updates/world/2016_02_22_02_world.sql @@ -0,0 +1,34 @@ +SET @OGUID := 74901; + +UPDATE `gameobject` SET `spawntimesecs`=120 WHERE `id`=188441; +DELETE FROM `gameobject` WHERE `id`=188441 AND `guid` BETWEEN @OGUID+0 AND @OGUID+28; +INSERT INTO `gameobject` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`) VALUES +(@OGUID+0 , 188441, 571, 1, 1, 4599.037, 285.0833, 95.23787, 0.4188786, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+1 , 188441, 571, 1, 1, 4556.1, 231.2934, 96.77894, 0.4537851, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+2 , 188441, 571, 1, 1, 4499.447, 108.0523, 89.83501, 3.996807, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+3 , 188441, 571, 1, 1, 4481.178, 127.8052, 88.98753, 5.044002, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+4 , 188441, 571, 1, 1, 4518.543, 226.8698, 90.04359, 4.97419, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+5 , 188441, 571, 1, 1, 4476.379, 92.48655, 88.96384, 2.321287, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+6 , 188441, 571, 1, 1, 4599.19, 760.0677, 93.87521, 5.654869, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+7, 188441, 571, 1, 1, 4593.348, 741.4844, 95.79951, 3.735006, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+8, 188441, 571, 1, 1, 4751.073, 453.6788, 126.705, 0.6806767, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+9, 188441, 571, 1, 1, 4682.298, 401.2016, 113.0896, 0.9075702, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+10, 188441, 571, 1, 1, 4751.073, 453.6788, 126.705, 0.6806767, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+11, 188441, 571, 1, 1, 4682.298, 401.2016, 113.0896, 0.9075702, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+12, 188441, 571, 1, 1, 4607.061, 650.2381, 99.33231, 0.3141584, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+13, 188441, 571, 1, 1, 4617.78, 647.2289, 100.198, 6.161013, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+14, 188441, 571, 1, 1, 4603.35, 646.6047, 99.39375, 3.281239, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+15, 188441, 571, 1, 1, 4599.037, 285.0833, 95.23787, 0.4188786, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+16, 188441, 571, 1, 1, 4601.033, 262.5729, 94.59935, 3.595379, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+17, 188441, 571, 1, 1, 4578.877, 274.382, 94.57744, 1.256636, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+18, 188441, 571, 1, 1, 4516.654, 214.9381, 90.17368, 4.76475, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+19, 188441, 571, 1, 1, 4570.082, 246.2316, 90.96891, 4.869471, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+20, 188441, 571, 1, 1, 4553.599, 249.401, 91.1224, 3.857183, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+21, 188441, 571, 1, 1, 4532.682, 221.2274, 92.86555, 5.340709, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+22, 188441, 571, 1, 1, 4481.178, 127.8052, 88.98753, 5.044002, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+23, 188441, 571, 1, 1, 4499.447, 108.0523, 89.83501, 3.996807, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+24, 188441, 571, 1, 1, 4505.154, 59.0905, 86.1317, 5.078908, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+25, 188441, 571, 1, 1, 4458.161, 127.8561, 89.45293, 5.881761, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+26, 188441, 571, 1, 1, 4556.1, 231.2934, 96.77894, 0.4537851, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+27, 188441, 571, 1, 1, 4556.1, 231.2934, 96.77894, 0.4537851, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+28, 188441, 571, 1, 1, 4583.655, 232.1632, 95.92954, 4.729844, 0, 0, 0, 1, 120, 255, 1); -- 188441 (Area: 65) diff --git a/sql/updates/world/2016_02_23_00_world.sql b/sql/updates/world/2016_02_23_00_world.sql new file mode 100644 index 00000000000..871ce608f1c --- /dev/null +++ b/sql/updates/world/2016_02_23_00_world.sql @@ -0,0 +1 @@ +UPDATE `smart_scripts` SET `action_param1`=2235500, `action_param2`=2235501, `action_param3`=2235502, `action_param4`=2235503, `action_param5`=2235504, `action_param6`=2235505 WHERE `entryorguid`=22355 AND `source_type`=0 AND `id`=6 AND `link`=0; diff --git a/sql/updates/world/2016_02_23_01_world.sql b/sql/updates/world/2016_02_23_01_world.sql new file mode 100644 index 00000000000..0773487dbc7 --- /dev/null +++ b/sql/updates/world/2016_02_23_01_world.sql @@ -0,0 +1,119 @@ +SET @OGUID:=82948; +SET @CGUID:=85532; +SET @Event:=7; + +-- Add missing lunar objects +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+89; +INSERT INTO `gameobject` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`) VALUES +(@OGUID+0 , 180879, 530, 1, 1, -4021.671, -11847.32, 0.006294, 1.902409, 0, 0, 0, 1, 120, 255, 1), -- 180879 (Area: 0) -- exodar +(@OGUID+1 , 180777, 530, 1, 1, -4016.04, -11831.66, 0.122772, 1.605702, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 0) +(@OGUID+2 , 180777, 530, 1, 1, -4019.716, -11831.79, 0.095343, 4.694937, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 0) +(@OGUID+3 , 180880, 530, 1, 1, -4021.575, -11847.88, 1.865077, 3.42085, 0, 0, 0, 1, 120, 255, 1), -- 180880 (Area: 0) +(@OGUID+4 , 180881, 530, 1, 1, -4021.983, -11847.42, 1.806305, 4.799657, 0, 0, 0, 1, 120, 255, 1), -- 180881 (Area: 0) +(@OGUID+5 , 180882, 530, 1, 1, -4021.177, -11847.73, 1.821342, 3.769912, 0, 0, 0, 1, 120, 255, 1), -- 180882 (Area: 0) +(@OGUID+6 , 180883, 530, 1, 1, -4021.107, -11847.26, 1.800923, 5.811947, 0, 0, 0, 1, 120, 255, 1), -- 180883 (Area: 0) +(@OGUID+7 , 180883, 530, 1, 1, -4021.65, -11846.95, 1.829355, 5.445428, 0, 0, 0, 1, 120, 255, 1), -- 180883 (Area: 0) +(@OGUID+8 , 180869, 530, 1, 1, -4023.456, -11837.75, 0.015313, 4.747296, 0, 0, 0, 1, 120, 255, 1), -- 180869 (Area: 0) +(@OGUID+9 , 180869, 530, 1, 1, -4011.058, -11837.71, 0.147322, 4.694937, 0, 0, 0, 1, 120, 255, 1), -- 180869 (Area: 0) +(@OGUID+10, 180766, 530, 1, 1, -4012.713, -11842.4, 0.117445, 0.802851, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 0) +(@OGUID+11, 180766, 530, 1, 1, -4020.125, -11847.21, 0.023653, 4.642576, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 0) +(@OGUID+12, 180766, 530, 1, 1, -4014.778, -11847.44, 0.082153, 1.623156, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 0) +(@OGUID+13, 180766, 530, 1, 1, -4022.487, -11842.52, 0.009148, 5.305802, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 0) +(@OGUID+14, 180766, 530, 1, 1, -4008.917, -11837.83, 0.170679, 1.361356, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 0) +(@OGUID+15, 180766, 530, 1, 1, -4012.804, -11831.57, 0.146643, 2.146753, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 0) +(@OGUID+16, 180766, 530, 1, 1, -4025.327, -11837.02, 0.008528, 4.677484, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 0) +(@OGUID+17, 180766, 530, 1, 1, -4023.502, -11831.39, 0.072735, 4.06662, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 0) +(@OGUID+18, 180878, 530, 1, 1, -4022.725, -11846.54, -0.003436, 4.502952, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 0) +(@OGUID+19, 180878, 530, 1, 1, -4023.054, -11847.33, -0.00903, 3.543024, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 0) +(@OGUID+20, 180878, 530, 1, 1, -4022.056, -11846.02, 0.005262, 2.687807, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 0) +(@OGUID+21, 180878, 530, 1, 1, -4021.267, -11845.9, 0.014263, 5.567601, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 0) +(@OGUID+22, 180878, 530, 1, 1, -4021.343, -11848.85, 0.009881, 4.869471, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 0) +(@OGUID+23, 180878, 530, 1, 1, -4022.729, -11848.02, -0.005639, 2.129301, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 0) +(@OGUID+24, 180878, 530, 1, 1, -4022.064, -11848.56, 0.00076, 5.585054, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 0) +(@OGUID+25, 180766, 1, 1, 1, 10147.02, 2574.3, 1320.719, 1.186823, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 1659) -- darnassus +(@OGUID+26, 180766, 1, 1, 1, 10149.6, 2592.33, 1330.62, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 1659) +(@OGUID+27, 180766, 1, 1, 1, 10154.62, 2593.352, 1330.546, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 1659) +(@OGUID+28, 180766, 1, 1, 1, 10148.55, 2610.374, 1330.823, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 1658) +(@OGUID+29, 180766, 1, 1, 1, 10159.98, 2604.604, 1330.823, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 1658) +(@OGUID+30, 180766, 1, 1, 1, 10141.72, 2600.144, 1330.823, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 1658) +(@OGUID+31, 180765, 1, 1, 1, 10040.4, 2478.42, 1353.98, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 0) +(@OGUID+32, 180765, 1, 1, 1, 10050.7, 2510.37, 1353.98, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 0) +(@OGUID+33, 180765, 1, 1, 1, 10170.16, 2554.241, 1344.727, 5.846854, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 1659) +(@OGUID+34, 180765, 1, 1, 1, 10088.98, 2580.349, 1341.743, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 1659) +(@OGUID+35, 180765, 1, 1, 1, 10170.96, 2556.492, 1366.235, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 1659) +(@OGUID+36, 180765, 1, 1, 1, 10163.1, 2568.72, 1353.59, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 1659) +(@OGUID+37, 180765, 1, 1, 1, 10156.62, 2582.27, 1345.43, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 1659) +(@OGUID+38, 180765, 1, 1, 1, 10107.72, 2590.667, 1341.86, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 1659) +(@OGUID+39, 180765, 1, 1, 1, 10106.9, 2600.88, 1340.55, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 1659) +(@OGUID+40, 180765, 1, 1, 1, 10080.89, 2586.866, 1340.509, 5.201083, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 1659) +(@OGUID+41, 180765, 1, 1, 1, 10185.6, 2561.11, 1366.71, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 1659) +(@OGUID+42, 180765, 1, 1, 1, 10165.39, 2580.426, 1361.882, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 1659) +(@OGUID+43, 180765, 1, 1, 1, 10162.87, 2569.218, 1366.497, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 1659) +(@OGUID+44, 180765, 1, 1, 1, 10180.73, 2583.701, 1364.723, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 1658) +(@OGUID+45, 180765, 1, 1, 1, 10185.8, 2575.52, 1366.34, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 1658) +(@OGUID+46, 180878, 1, 1, 1, 10147.58, 2574.047, 1320.637, 2.129301, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 1659) +(@OGUID+47, 180878, 1, 1, 1, 10145.04, 2573.837, 1321.027, 5.567601, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 1659) +(@OGUID+48, 180878, 1, 1, 1, 10146.93, 2572.094, 1320.741, 3.543024, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 1659) +(@OGUID+49, 180878, 1, 1, 1, 10147.89, 2574.833, 1320.575, 5.585054, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 1659) +(@OGUID+50, 180878, 1, 1, 1, 10145.3, 2572.096, 1320.981, 4.502952, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 1659) +(@OGUID+51, 180878, 1, 1, 1, 10144.76, 2572.774, 1321.074, 2.687807, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 1659) +(@OGUID+52, 180878, 1, 1, 1, 10148.35, 2574.187, 1320.516, 4.869471, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 1659) +(@OGUID+53, 180879, 1, 1, 1, 10146.29, 2573.105, 1320.675, 5.864307, 0, 0, 0, 1, 120, 255, 1), -- 180879 (Area: 1659) +(@OGUID+54, 180777, 1, 1, 1, 10155.51, 2571.573, 1320.54, 4.031712, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 1659) +(@OGUID+55, 180777, 1, 1, 1, 10146.33, 2574.491, 1320.823, 1.169369, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 1659) +(@OGUID+56, 180777, 1, 1, 1, 10148.78, 2592.293, 1330.527, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 1659) +(@OGUID+57, 180777, 1, 1, 1, 10155.43, 2593.67, 1330.43, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 1659) +(@OGUID+58, 180881, 1, 1, 1, 10146.31, 2573.473, 1322.492, 4.799657, 0, 0, 0, 1, 120, 255, 1), -- 180881 (Area: 1659) +(@OGUID+59, 180882, 1, 1, 1, 10146.49, 2573.022, 1322.495, 4.450591, 0, 0, 0, 1, 120, 255, 1), -- 180882 (Area: 1659) +(@OGUID+60, 180883, 1, 1, 1, 10145.72, 2573.401, 1322.479, 5.445428, 0, 0, 0, 1, 120, 255, 1), -- 180883 (Area: 1659) +(@OGUID+61, 180883, 1, 1, 1, 10145.87, 2572.747, 1322.489, 5.811947, 0, 0, 0, 1, 120, 255, 1), -- 180883 (Area: 1659) +(@OGUID+62, 180868, 1, 1, 1, 10148.56, 2596.947, 1330.823, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 1659) +(@OGUID+63, 180868, 1, 1, 1, 10154.36, 2598.172, 1330.823, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 1658) +(@OGUID+64, 180868, 1, 1, 1, 10152.6, 2607.9, 1330.82, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 1658) +(@OGUID+65, 180868, 1, 1, 1, 10145.24, 2600.956, 1330.823, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 1658) +(@OGUID+66, 180868, 1, 1, 1, 10146.67, 2607.012, 1330.823, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 1658) +(@OGUID+67, 180868, 1, 1, 1, 10156.24, 2603.661, 1330.823, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 1658) +(@OGUID+68, 180869, 1, 1, 1, 10147.5, 2600.15, 1330.82, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 180869 (Area: 1658) +(@OGUID+69, 180869, 1, 1, 1, 10153.85, 2601.112, 1330.823, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180869 (Area: 1658) +(@OGUID+70, 180884, 0, 1, 1, -4643.956, -952.7753, 501.6609, 1.675514, 0, 0, 0, 1, 120, 255, 1), -- 180884 (Area: 4679) -- ironforge +(@OGUID+71, 180777, 0, 1, 1, -4657.851, -970.8358, 502.1435, 1.780234, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 4679) +(@OGUID+72, 180777, 0, 1, 1, -4647.056, -954.0901, 502.1464, 3.246347, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 4679) +(@OGUID+73, 180777, 0, 1, 1, -4657.756, -940.899, 502.1457, 1.291542, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 4679) +(@OGUID+74, 180777, 0, 1, 1, -4676.447, -948.0982, 502.145, 5.689774, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 4679) +(@OGUID+75, 180880, 0, 1, 1, -4643.901, -952.4222, 502.6053, 1.675514, 0, 0, 0, 1, 120, 255, 1), -- 180880 (Area: 4679) +(@OGUID+76, 180880, 0, 1, 1, -4644.116, -952.0615, 502.6122, 6.021387, 0, 0, 0, 1, 120, 255, 1), -- 180880 (Area: 4679) +(@OGUID+77, 180881, 0, 1, 1, -4644.559, -952.6501, 502.5913, 0.1047193, 0, 0, 0, 1, 120, 255, 1), -- 180881 (Area: 4679) +(@OGUID+78, 180881, 0, 1, 1, -4644.697, -951.6542, 502.5873, 4.01426, 0, 0, 0, 1, 120, 255, 1), -- 180881 (Area: 4679) +(@OGUID+79, 180882, 0, 1, 1, -4643.973, -951.5918, 502.5915, 5.061456, 0, 0, 0, 1, 120, 255, 1), -- 180882 (Area: 4679) +(@OGUID+80, 180882, 0, 1, 1, -4643.597, -952.0538, 502.5845, 3.926996, 0, 0, 0, 1, 120, 255, 1), -- 180882 (Area: 4679) +(@OGUID+81, 180883, 0, 1, 1, -4643.862, -952.8162, 502.5914, 0.1047193, 0, 0, 0, 1, 120, 255, 1), -- 180883 (Area: 4679) +(@OGUID+82, 180883, 0, 1, 1, -4644.573, -952.2311, 502.5913, 0.1047193, 0, 0, 0, 1, 120, 255, 1), -- 180883 (Area: 4679) +(@OGUID+83, 180868, 530, 1, 1, -4014.642, -11845.6, 0.088204, 4.694937, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 0) -- more exodar +(@OGUID+84, 180868, 530, 1, 1, -4020.391, -11845.43, 0.025103, 4.747296, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 0) +(@OGUID+85, 180868, 530, 1, 1, -4014.579, -11842.59, 0.096342, 4.694937, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 0) +(@OGUID+86, 180868, 530, 1, 1, -4014.198, -11835.3, 0.118586, 4.694937, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 0) +(@OGUID+87, 180868, 530, 1, 1, -4021.152, -11835.28, 0.0539, 4.747296, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 0) +(@OGUID+88, 180868, 530, 1, 1, -4020.445, -11842.34, 0.032153, 4.747296, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 0) +(@OGUID+89, 180868, 530, 1, 1, -4017.739, -11832.38, 0.104225, 4.729844, 0, 0, 0, 1, 120, 255, 1); -- 180868 (Area: 0) + +DELETE FROM `game_event_gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+89 AND `eventEntry`=@Event; +INSERT INTO `game_event_gameobject` SELECT @Event, gameobject.guid FROM `gameobject` WHERE gameobject.guid BETWEEN @OGUID+0 AND @OGUID+89; + +-- Add missing lunar spawns +DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+11; +INSERT INTO `creature` (`guid`, `id`, `map`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `curhealth`) VALUES +(@CGUID+0, 15892, 530, -4014.533, -11839.5, 0.1878313, 2.617994, 120, 0), -- 15892 (Area: 0) +(@CGUID+1, 15892, 530, -4017.631, -11834.3, 0.1710953, 4.747295, 120, 0), -- 15892 (Area: 0) +(@CGUID+2, 15892, 530, -4020.615, -11839.4, 0.1208633, 0.4712389, 120, 0), -- 15892 (Area: 0) +(@CGUID+3, 15892, 1, 10146.8, 2603.15, 1330.903, 6.021386, 120, 0), -- 15892 (Area: 1658) +(@CGUID+4, 15892, 1, 10151.3, 2598.93, 1330.903, 1.780236, 120, 0), -- 15892 (Area: 1658) +(@CGUID+5, 15892, 1, 10153.2, 2604.51, 1330.903, 3.961897, 120, 0), -- 15892 (Area: 1658) +(@CGUID+6, 15898, 530, -4020.056, -11848.42, 0.1050933, 4.677482, 120, 0), -- 15898 (Area: 0) (Auras: ) +(@CGUID+7, 15898, 1, 10148.03, 2572.627, 1320.697, 4.18879, 120, 0), -- 15898 (Area: 1659) (Auras: ) +(@CGUID+8, 15895, 530, -4014.714, -11848.54, 0.1634673, 4.799655, 120, 0), -- 15895 (Area: 0) (Auras: ) +(@CGUID+9, 15895, 1, 10153.6, 2593.45, 1330.843, 4.799655, 120, 0), -- 15895 (Area: 1659) (Auras: ) +(@CGUID+10, 15897, 530, -4017.511, -11837.73, 0.1593063, 4.39823, 120, 0), -- 15897 (Area: 0) (Auras: 25824 - 25824) +(@CGUID+11, 15897, 1, 10150.53, 2602.14, 1330.906, 1.570796, 120, 0); -- 15897 (Area: 1658) (Auras: 25824 - 25824) + +DELETE FROM `game_event_creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+11 AND `eventEntry`=@Event; +INSERT INTO `game_event_creature` SELECT @Event, creature.guid FROM `creature` WHERE creature.guid BETWEEN @CGUID+0 AND @CGUID+11; diff --git a/sql/updates/world/2016_02_23_02_world.sql b/sql/updates/world/2016_02_23_02_world.sql new file mode 100644 index 00000000000..9e2c550dd65 --- /dev/null +++ b/sql/updates/world/2016_02_23_02_world.sql @@ -0,0 +1,6 @@ +DELETE FROM `creature_text` WHERE `entry` IN(37671,38065) AND `id`>0; +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(37671, 0, 1, 'Time is money, friend. Go go go!', 12, 0, 100, 1, 0, 0, 38022, 0, 'Crown Supply Guard'), +(38065, 0, 1, 'Time is money, friend. Go go go!', 12, 0, 100, 1, 0, 0, 38022, 0, 'Crown Supply Guard'), +(37671, 0, 2, 'The Lovely Merchant is waiting for that. Hurry it up!', 12, 0, 100, 1, 0, 0, 38023, 0, 'Crown Supply Guard'), +(38065, 0, 2, 'The Lovely Merchant is waiting for that. Hurry it up!', 12, 0, 100, 1, 0, 0, 38023, 0, 'Crown Supply Guard'); diff --git a/sql/updates/world/2016_02_24_00_world.sql b/sql/updates/world/2016_02_24_00_world.sql new file mode 100644 index 00000000000..06c7c29bd72 --- /dev/null +++ b/sql/updates/world/2016_02_24_00_world.sql @@ -0,0 +1,1966 @@ +SET @OGUID:=83038; +SET @Event:=8; + +-- Add missing love is in the air objects +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+1941; +INSERT INTO `gameobject` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`) VALUES +(@OGUID+0 , 187575, 571, 1, 1, 5820.163, 557.1407, 653.0472, 1.919862, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4395) +(@OGUID+1 , 187575, 571, 1, 1, 5813.242, 555.0104, 653.1141, 1.832595, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4395) +(@OGUID+2 , 187575, 571, 1, 1, 5828.393, 518.7396, 659.42, 5.026549, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4395) +(@OGUID+3 , 187575, 571, 1, 1, 5619.527, 688.4839, 653.2624, 5.846854, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4568) +(@OGUID+4 , 187575, 571, 1, 1, 5622.715, 695.6467, 653.2054, 5.864307, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4568) +(@OGUID+5 , 187575, 571, 1, 1, 5625.892, 702.7949, 653.3616, 5.846854, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4568) +(@OGUID+6 , 187575, 571, 1, 1, 5982.965, 599.3807, 651.8081, 2.775069, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4618) +(@OGUID+7 , 187575, 571, 1, 1, 5988.552, 613.9961, 651.6794, 2.687807, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4618) +(@OGUID+8 , 187575, 571, 1, 1, 5985.754, 606.6982, 651.8865, 2.722713, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4618) +(@OGUID+9 , 187575, 571, 1, 1, 6193.209, -1053.005, 410.5604, 2.495818, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4419) +(@OGUID+10 , 187575, 571, 1, 1, 6111.217, -1074.599, 407.2788, 1.745327, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4419) +(@OGUID+11 , 187575, 571, 1, 1, 6122.76, -1081.095, 406.5847, 4.76475, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4419) +(@OGUID+12 , 187575, 571, 1, 1, 6139.989, -1079.811, 405.7787, 0.087266, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4419) +(@OGUID+13 , 187575, 571, 1, 1, 6122.866, -1073.905, 407.455, 1.640607, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4419) +(@OGUID+14 , 187575, 571, 1, 1, 6133.952, -1074.677, 406.6819, 1.483528, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4419) +(@OGUID+15 , 187575, 571, 1, 1, 6105.763, -1080.907, 407.3781, 3.228859, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4419) +(@OGUID+16 , 187575, 571, 1, 1, 6121.725, -1096.696, 406.5187, 1.396262, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4419) +(@OGUID+17 , 187575, 571, 1, 1, 5141.983, -2154.615, 244.3087, 0.05235888, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+18 , 187575, 571, 1, 1, 5179.932, -2192.024, 239.8268, 2.897245, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+19 , 187575, 571, 1, 1, 5193.838, -2203.542, 239.8356, 3.560473, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+20 , 187575, 571, 1, 1, 5111.679, -2201.835, 243.7792, 1.082103, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+21 , 187575, 571, 1, 1, 5196.897, -2215.816, 243.9398, 2.111848, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+22 , 187575, 571, 1, 1, 5526.034, -2669.764, 304.289, 3.124123, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4275) +(@OGUID+23 , 187575, 571, 1, 1, 5762.96, -3526.665, 391.1757, 3.979355, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4324) +(@OGUID+24 , 187575, 571, 1, 1, 5746.468, -3556.428, 390.0896, 6.056293, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4324) +(@OGUID+25 , 187575, 571, 1, 1, 5768.534, -3620.057, 389.5159, 3.42085, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4324) +(@OGUID+26 , 187575, 571, 1, 1, 5778.518, -3600.462, 387.3365, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4324) +(@OGUID+27 , 187575, 571, 1, 1, 4608.65, -4233.896, 181.3112, 3.054327, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+28 , 187575, 571, 1, 1, 4583.46, -4214.486, 178.712, 5.096362, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4159) +(@OGUID+29 , 187575, 571, 1, 1, 4588.769, -4259.397, 183.0127, 2.129301, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4159) +(@OGUID+30 , 187575, 571, 1, 1, 4545.505, -4198.653, 174.6676, 3.176533, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4159) +(@OGUID+31 , 187575, 571, 1, 1, 4516.881, -4237.698, 172.0961, 3.316144, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4159) +(@OGUID+32 , 187575, 571, 1, 1, 4525.026, -4220.745, 171.4343, 2.757613, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4159) +(@OGUID+33 , 187575, 571, 1, 1, 4524.598, -4165.28, 174.0965, 2.879789, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4159) +(@OGUID+34 , 187575, 571, 1, 1, 4530.678, -4141.924, 175.9093, 2.321287, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4159) +(@OGUID+35 , 187575, 571, 1, 1, 4456.922, -4314.456, 160.9202, 4.572764, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4159) +(@OGUID+36 , 187575, 571, 1, 1, 3876.39, -4523.813, 218.0925, 1.954769, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4205) +(@OGUID+37 , 187575, 571, 1, 1, 3454.602, -2802.049, 202.4846, 3.351047, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+38 , 187575, 571, 1, 1, 3259.021, -2267.587, 114.378, 2.007128, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4248) +(@OGUID+39 , 187575, 571, 1, 1, 3263.253, -2264.287, 115.0179, 2.670348, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4248) +(@OGUID+40 , 187575, 571, 1, 1, 1420.218, -3720.073, 139.7719, 3.752462, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+41 , 187575, 571, 1, 1, 737.0417, -2925.07, 7.038448, 5.969027, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3987) +(@OGUID+42 , 187575, 571, 1, 1, 737.8021, -2929.837, 6.96212, 0.5934101, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3987) +(@OGUID+43 , 187575, 571, 1, 1, 789.0579, -2887.322, 6.061472, 4.276057, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3988) +(@OGUID+44 , 187575, 571, 1, 1, 2491.536, -5071.006, 298.8146, 1.466076, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4003) +(@OGUID+45 , 187575, 571, 1, 1, 2472.029, -5066.281, 286.0714, 3.787367, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4003) +(@OGUID+46 , 187575, 571, 1, 1, 2472.168, -5058.874, 292.4872, 6.178466, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4003) +(@OGUID+47 , 187575, 571, 1, 1, 2474.881, -5069.709, 286.0041, 3.839725, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4003) +(@OGUID+48 , 187575, 571, 1, 1, 2499.964, -5059.02, 286.9637, 3.036838, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4003) +(@OGUID+49 , 187575, 571, 1, 1, 2653.467, -4398.361, 284.5294, 0.9250238, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+50 , 187575, 571, 1, 1, 2645.279, -4389.678, 283.9462, 0.1047193, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+51 , 187575, 571, 1, 1, 3644.348, -723.9233, 218.8718, 1.448622, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4177) +(@OGUID+52 , 187575, 571, 1, 1, 3647.875, -707.9075, 217.1875, 6.178466, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4177) +(@OGUID+53 , 187575, 571, 1, 1, 3658.615, -719.4378, 218.7648, 3.054327, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4177) +(@OGUID+54 , 187575, 571, 1, 1, 3713.571, -686.2274, 216.503, 4.450591, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4177) +(@OGUID+55 , 187575, 571, 1, 1, 3720.316, -705.8351, 216.0074, 2.495818, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4177) +(@OGUID+56 , 187575, 571, 1, 1, 3827.11, 1482.655, 95.12893, 1.431168, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4165) +(@OGUID+57 , 187575, 571, 1, 1, 3859.411, 1466.078, 94.9991, 1.692969, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4165) +(@OGUID+58 , 187575, 571, 1, 1, 3825.417, 1465.946, 95.10252, 1.745327, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4165) +(@OGUID+59 , 187575, 571, 1, 1, 3842.333, 1481.939, 97.79363, 1.640607, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4165) +(@OGUID+60 , 187575, 571, 1, 1, 3857.466, 1482.773, 96.1758, 1.623156, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4165) +(@OGUID+61 , 187575, 571, 1, 1, 3827.736, 1496.177, 95.10645, 6.213374, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4165) +(@OGUID+62 , 187575, 571, 1, 1, 3857.144, 1496.144, 95.12449, 3.141593, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4165) +(@OGUID+63 , 187575, 571, 1, 1, 3770.23, 1602.427, 95.77409, 5.044002, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4165) +(@OGUID+64 , 187575, 571, 1, 1, 3781.036, 1623.459, 95.58131, 0.4363316, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4165) +(@OGUID+65 , 187575, 571, 1, 1, 3553.18, 1827.47, 81.077, 4.310966, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+66 , 187575, 571, 1, 1, 3643.384, 1884.3, 80.81538, 2.740162, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+67 , 187575, 571, 1, 1, 2756.815, 926.7635, 23.2116, 2.984498, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4152) +(@OGUID+68 , 187575, 571, 1, 1, 2792.32, 944.9219, 23.26566, 1.151916, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4152) +(@OGUID+69 , 187575, 571, 1, 1, 2798.089, 941.0677, 24.67208, 0.3141584, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4152) +(@OGUID+70 , 187575, 571, 1, 1, 2756.885, 920.0313, 24.40833, 3.33359, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4152) +(@OGUID+71 , 187575, 571, 1, 1, 2791.102, 904.5616, 23.04511, 1.256636, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4152) +(@OGUID+72 , 187575, 571, 1, 1, 2787.111, 910.8663, 32.01936, 5.270896, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4152) +(@OGUID+73 , 187575, 571, 1, 1, 2742.9, 887.7947, 6.358366, 2.426008, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4152) +(@OGUID+74 , 187575, 571, 1, 1, 2732.103, 881.1441, 6.379679, 1.186823, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4152) +(@OGUID+75 , 187575, 571, 1, 1, 2713.987, 894.1632, 16.31461, 2.059488, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4152) +(@OGUID+76 , 187575, 571, 1, 1, 4971.71, 1267.167, 228.3888, 5.096362, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4170) +(@OGUID+77 , 187575, 571, 1, 1, 4967.139, 1265.599, 227.7066, 4.869471, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4170) +(@OGUID+78 , 187575, 571, 1, 1, 4942.589, 1170.193, 239.8133, 4.97419, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4170) +(@OGUID+79 , 187575, 571, 1, 1, 4951.857, 1167.702, 240.1477, 4.206246, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4170) +(@OGUID+80 , 187575, 571, 1, 1, 4937.846, 1158.604, 240.5038, 0.6632232, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4170) +(@OGUID+81 , 187575, 571, 1, 1, 5009.385, 1205.95, 231.4591, 2.565632, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4170) +(@OGUID+82 , 187575, 571, 1, 1, 3449.408, 4085.986, 17.83682, 1.815142, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4042) +(@OGUID+83 , 187575, 571, 1, 1, 2980.379, 4053.99, 28.38085, 3.089183, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4113) +(@OGUID+84 , 187575, 571, 1, 1, 3007.164, 4071.765, 35.89487, 1.553341, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4113) +(@OGUID+85 , 187575, 571, 1, 1, 3026.245, 4045.878, 28.50895, 5.829401, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4113) +(@OGUID+86 , 187575, 571, 1, 1, 2279.208, 5188.578, 16.22224, 1.134463, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+87 , 187575, 571, 1, 1, 2288.109, 5196.549, 14.44638, 1.169369, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+88 , 187575, 571, 1, 1, 2924.559, 6242.063, 209.8437, 2.687807, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4129) +(@OGUID+89 , 187575, 571, 1, 1, 2924.903, 6244.5, 210.3616, 3.42085, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4129) +(@OGUID+90 , 187575, 571, 1, 1, 4111.603, 5303.919, 31.3832, 2.391098, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+91 , 187575, 571, 1, 1, 4475.266, 5707.764, 82.36211, 1.466076, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+92 , 187575, 571, 1, 1, 4470.285, 5710.635, 82.27143, 0.9948372, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+93 , 187575, 571, 1, 1, 5482.611, 4728.695, -191.6311, 1.221729, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4290) +(@OGUID+94 , 187575, 571, 1, 1, 8473.581, -342.7954, 906.4036, 2.286379, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4436) +(@OGUID+95 , 187575, 571, 1, 1, 8418.453, -349.0424, 909.3304, 5.602507, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4436) +(@OGUID+96 , 187575, 571, 1, 1, 8433.876, -362.944, 908.5649, 2.373644, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4436) +(@OGUID+97 , 187575, 571, 1, 1, 7856.078, -735.8157, 1178.389, 0.122173, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+98 , 187575, 530, 1, 1, -2564.838, 4432.062, 39.61848, 3.909541, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3683) +(@OGUID+99 , 187575, 530, 1, 1, -2560.156, 4422.9, 40.24272, 3.368496, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3683) +(@OGUID+100 , 187575, 530, 1, 1, -2621.607, 4461.632, 39.31939, 2.949595, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3683) +(@OGUID+101 , 187575, 530, 1, 1, -2618.607, 4461.301, 39.33173, 6.108654, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3683) +(@OGUID+102 , 187575, 530, 1, 1, -2619.96, 4462.996, 39.3169, 1.448622, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3683) +(@OGUID+103 , 187575, 530, 1, 1, -2620.309, 4459.896, 39.31923, 4.607672, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3683) +(@OGUID+104 , 187575, 530, 1, 1, -3009.571, 3998.962, 5.706537, 4.537859, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3684) +(@OGUID+105 , 187575, 530, 1, 1, -2991.61, 3988.035, 5.85871, 4.572764, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3684) +(@OGUID+106 , 187575, 530, 1, 1, -3002.449, 3997.882, 5.743727, 4.520406, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3684) +(@OGUID+107 , 187575, 530, 1, 1, -3026.769, 2565.998, 80.07526, 0.1396245, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3744) +(@OGUID+108 , 187575, 530, 1, 1, -3012.218, 2548.628, 79.43921, 1.500983, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3744) +(@OGUID+109 , 187575, 530, 1, 1, -2979.819, 2565.84, 79.82945, 5.829401, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3744) +(@OGUID+110 , 187575, 530, 1, 1, -2963.231, 2558.747, 80.31774, 2.617989, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3744) +(@OGUID+111 , 187575, 530, 1, 1, -3977.41, 2165.698, 106.9871, 2.460913, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3745) +(@OGUID+112 , 187575, 530, 1, 1, -4075.49, 2189.597, 111.462, 4.76475, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3745) +(@OGUID+113 , 187575, 530, 1, 1, -4069.704, 2183.112, 108.5346, 3.298687, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3745) +(@OGUID+114 , 187575, 530, 1, 1, -4064.588, 1124.245, 43.41816, 2.44346, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3929) +(@OGUID+115 , 187575, 530, 1, 1, -3061.328, 737.1945, -8.771701, 1.448622, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3754) +(@OGUID+116 , 187575, 530, 1, 1, -154.7856, 5523.646, 31.50904, 3.47321, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3565) +(@OGUID+117 , 187575, 530, 1, 1, -158.5099, 5535.154, 31.47245, 3.525572, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3565) +(@OGUID+118 , 187575, 530, 1, 1, 225.3918, 7813.881, 22.98265, 3.403396, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+119 , 187575, 530, 1, 1, 221.99, 7810.066, 23.68496, 2.234018, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+120 , 187575, 530, 1, 1, 332.2872, 7829.961, 39.40045, 6.213374, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3645) +(@OGUID+121 , 187575, 530, 1, 1, 241.3687, 7913.663, 27.14164, 5.044002, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3645) +(@OGUID+122 , 187575, 530, 1, 1, 342.1493, 7867.583, 45.30079, 3.944446, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3645) +(@OGUID+123 , 187575, 530, 1, 1, 233.8486, 7910.588, 27.21144, 5.218536, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3645) +(@OGUID+124 , 187575, 530, 1, 1, 1044.723, 7368.755, 43.1856, 0.5585039, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3766) +(@OGUID+125 , 187575, 530, 1, 1, 1052.611, 7359.699, 42.62963, 0.8726639, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3766) +(@OGUID+126 , 187575, 530, 1, 1, 1989.314, 6784.465, 167.9164, 4.537859, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3772) +(@OGUID+127 , 187575, 530, 1, 1, 2016.857, 6885.055, 182.8496, 4.223697, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3772) +(@OGUID+128 , 187575, 530, 1, 1, 2944.679, 5466.702, 150.6358, 0, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3951) +(@OGUID+129 , 187575, 530, 1, 1, 3013.267, 5429.971, 148.0764, 0.5759573, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3951) +(@OGUID+130 , 187575, 530, 1, 1, 2165.546, 4727.486, 159.5631, 2.268925, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3844) +(@OGUID+131 , 187575, 530, 1, 1, 2188.357, 4795.172, 158.674, 4.921829, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3844) +(@OGUID+132 , 187575, 530, 1, 1, 2181.066, 4706.845, 159.5976, 5.358162, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3844) +(@OGUID+133 , 187575, 530, 1, 1, 2045.43, 4686.257, 153.306, 1.029743, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3844) +(@OGUID+134 , 187575, 530, 1, 1, 2032.304, 4663.961, 153.4191, 4.171338, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3844) +(@OGUID+135 , 187575, 0, 1, 1, -4630.104, -928.945, 506.1224, 0.7330382, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 5344) +(@OGUID+136 , 187575, 530, 1, 1, -4227.08, -12484.05, 47.71632, 3.124123, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+137 , 187575, 530, 1, 1, -4231.724, -12498.08, 47.24671, 2.635444, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+138 , 187575, 530, 1, 1, -4207.997, -12557.59, 46.31153, 4.886924, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3576) +(@OGUID+139 , 187575, 530, 1, 1, -4183.172, -12564.08, 45.20827, 4.502952, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3576) +(@OGUID+140 , 187575, 530, 1, 1, -4107.671, -12483.03, 47.42568, 6.213374, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3576) +(@OGUID+141 , 187575, 530, 1, 1, -4105.227, -12501.2, 47.79556, 0.5759573, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3576) +(@OGUID+142 , 187575, 530, 1, 1, -4122.453, -12463.12, 48.0975, 3.842447, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3576) +(@OGUID+143 , 187668, 571, 1, 1, 5855.43, 634.2999, 649.2884, 2.286379, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4395) +(@OGUID+144 , 187668, 571, 1, 1, 5858.512, 638.0903, 649.1016, 2.478367, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4395) +(@OGUID+145 , 187668, 571, 1, 1, 5838.521, 520.3542, 659.7874, 2.652894, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4395) +(@OGUID+146 , 187668, 571, 1, 1, 5819.291, 514.2288, 659.8239, 1.099556, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4395) +(@OGUID+147 , 187668, 571, 1, 1, 5855.882, 661.2175, 649.2011, 3.839725, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4395) +(@OGUID+148 , 187668, 571, 1, 1, 5852.286, 664.1205, 649.1534, 4.031712, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4395) +(@OGUID+149 , 187668, 571, 1, 1, 5726.839, 678.6988, 648.3967, 2.478367, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4739) +(@OGUID+150 , 187668, 571, 1, 1, 5730.19, 682.8389, 648.4232, 2.408554, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4739) +(@OGUID+151 , 187668, 571, 1, 1, 5769.932, 711.6566, 619.6014, 5.602507, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4739) +(@OGUID+152 , 187668, 571, 1, 1, 5766.1, 706.9418, 619.6938, 5.462882, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4739) +(@OGUID+153 , 187668, 571, 1, 1, 5863.507, 473.3883, 642.9924, 0.01745246, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4613) +(@OGUID+154 , 187668, 571, 1, 1, 5904.753, 489.8196, 643.4774, 3.455756, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4616) +(@OGUID+155 , 187668, 571, 1, 1, 5906.59, 480.6752, 643.4434, 3.38594, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4616) +(@OGUID+156 , 187668, 571, 1, 1, 5864.693, 467.3737, 643.1257, 0.122173, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4616) +(@OGUID+157 , 187668, 571, 1, 1, 6676.186, -199.1807, 956.5273, 3.368496, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4428) +(@OGUID+158 , 187668, 571, 1, 1, 6124.218, -1074.936, 405.0566, 1.692969, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4419) +(@OGUID+159 , 187668, 571, 1, 1, 6124.213, -1076.51, 404.6239, 4.625124, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4419) +(@OGUID+160 , 187668, 571, 1, 1, 6120.367, -1076.484, 404.6041, 4.886924, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4419) +(@OGUID+161 , 187668, 571, 1, 1, 6120.694, -1074.873, 405.0674, 1.413715, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4419) +(@OGUID+162 , 187668, 571, 1, 1, 5796.578, -3553.885, 388.331, 3.159062, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4323) +(@OGUID+163 , 187668, 571, 1, 1, 3416.354, -2799.535, 203.6574, 2.042035, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+164 , 187668, 571, 1, 1, 3404.744, -2783.643, 203.9436, 5.532695, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+165 , 187668, 571, 1, 1, 3421.742, -2795.542, 203.7708, 2.286379, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+166 , 187668, 571, 1, 1, 3410.07, -2779.702, 203.9763, 5.323256, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+167 , 187668, 571, 1, 1, 1454.493, -3273.58, 168.5273, 2.408554, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4071) +(@OGUID+168 , 187668, 571, 1, 1, 1427.002, -3268.351, 169.1821, 5.707228, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3998) +(@OGUID+169 , 187668, 571, 1, 1, 1431.483, -3274.533, 169.1915, 1.047198, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3998) +(@OGUID+170 , 187668, 571, 1, 1, 1438.028, -3267.566, 169.513, 5.637414, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3998) +(@OGUID+171 , 187668, 571, 1, 1, 1437.135, -3266.915, 169.5058, 2.391098, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3998) +(@OGUID+172 , 187668, 571, 1, 1, 1429.582, -3265.274, 169.2192, 5.462882, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3998) +(@OGUID+173 , 187668, 571, 1, 1, 1445.74, -3257.578, 169.2403, 4.01426, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3998) +(@OGUID+174 , 187668, 571, 1, 1, 440.0521, -4547.913, 248.6341, 3.839725, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3991) +(@OGUID+175 , 187668, 571, 1, 1, 441.8183, -4550.703, 248.5898, 3.57793, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3991) +(@OGUID+176 , 187668, 571, 1, 1, 455.1633, -4536.68, 247.5673, 3.857183, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3991) +(@OGUID+177 , 187668, 571, 1, 1, 458.6449, -4542.124, 247.7258, 3.612838, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3991) +(@OGUID+178 , 187668, 571, 1, 1, 587.3395, -4934.356, 20.82388, 0.1919852, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3981) +(@OGUID+179 , 187668, 571, 1, 1, 586.2632, -4934.662, 20.74441, 3.38594, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3981) +(@OGUID+180 , 187668, 571, 1, 1, 580.5126, -4939.842, 20.76777, 0.2094394, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3981) +(@OGUID+181 , 187668, 571, 1, 1, 581.4718, -4943.683, 20.63075, 0.383971, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3981) +(@OGUID+182 , 187668, 571, 1, 1, 1891.333, -6175.724, 26.62351, 0.9075702, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4000) +(@OGUID+183 , 187668, 571, 1, 1, 1894.171, -6177.047, 26.61499, 1.256636, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4000) +(@OGUID+184 , 187668, 571, 1, 1, 1890.348, -6204.115, 26.52463, 2.617989, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4000) +(@OGUID+185 , 187668, 571, 1, 1, 1872.679, -6195.768, 26.33468, 5.777041, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4000) +(@OGUID+186 , 187668, 571, 1, 1, 2425.66, -5166.585, 282.1942, 1.186823, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4003) +(@OGUID+187 , 187668, 571, 1, 1, 2482.925, -5077.249, 291.7695, 1.466076, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4003) +(@OGUID+188 , 187668, 571, 1, 1, 2472.532, -5054.136, 292.9761, 0, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4003) +(@OGUID+189 , 187668, 571, 1, 1, 2678.708, -4395.557, 285.5654, 0.8377575, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+190 , 187668, 571, 1, 1, 2681.623, -4397.512, 285.5597, 0.9599299, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+191 , 187668, 571, 1, 1, 2677.323, -4386.643, 290.0943, 5.689774, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+192 , 187668, 571, 1, 1, 3217.361, -685.8459, 169.8989, 1.047198, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4232) +(@OGUID+193 , 187668, 571, 1, 1, 3219.979, -680.9132, 169.6687, 4.136433, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4232) +(@OGUID+194 , 187668, 571, 1, 1, 3207.445, -675.2426, 170.4363, 5.67232, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4232) +(@OGUID+195 , 187668, 571, 1, 1, 3205.08, -679.9858, 170.4128, 6.03884, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4232) +(@OGUID+196 , 187668, 571, 1, 1, 3635.864, -710.7761, 215.8188, 4.869471, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+197 , 187668, 571, 1, 1, 3640.115, -711.2604, 215.9585, 4.398232, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+198 , 187668, 571, 1, 1, 3651.599, -711.7225, 216.8413, 4.747296, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4177) +(@OGUID+199 , 187668, 571, 1, 1, 3666.347, -703.8602, 217.6456, 6.230826, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4177) +(@OGUID+200 , 187668, 571, 1, 1, 3665.587, -710.9298, 217.4738, 6.161013, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4177) +(@OGUID+201 , 187668, 571, 1, 1, 3480.165, 1977.29, 70.61582, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4158) +(@OGUID+202 , 187668, 571, 1, 1, 3472.212, 1983.86, 69.00069, 0.5061446, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4158) +(@OGUID+203 , 187668, 571, 1, 1, 3476.039, 2008.531, 68.95277, 5.515242, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4158) +(@OGUID+204 , 187668, 571, 1, 1, 3484.333, 2013.51, 68.88947, 5.044002, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4158) +(@OGUID+205 , 187668, 571, 1, 1, 2770.71, 934.493, 25.70063, 5.67232, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4152) +(@OGUID+206 , 187668, 571, 1, 1, 2777.521, 938.1545, 25.58711, 4.34587, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4152) +(@OGUID+207 , 187668, 571, 1, 1, 2271.331, 5194.442, 14.39653, 5.93412, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+208 , 187668, 571, 1, 1, 2299.134, 5198.044, 13.93274, 2.722713, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+209 , 187668, 571, 1, 1, 2280.926, 5198.394, 14.63274, 4.188792, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+210 , 187668, 571, 1, 1, 2281.226, 5199.101, 14.57226, 1.221729, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+211 , 187668, 571, 1, 1, 2272.831, 5198.149, 14.36126, 5.829401, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+212 , 187668, 571, 1, 1, 2824.468, 6139.032, 88.58996, 5.742135, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4129) +(@OGUID+213 , 187668, 571, 1, 1, 2792.786, 6176.63, 88.45963, 0.2268925, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4129) +(@OGUID+214 , 187668, 571, 1, 1, 2824.102, 6142.47, 88.44103, 0.8552105, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4129) +(@OGUID+215 , 187668, 571, 1, 1, 2789.38, 6177.33, 88.61863, 2.111848, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4129) +(@OGUID+216 , 187668, 571, 1, 1, 4176.385, 5285.042, 28.29611, 5.131269, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4108) +(@OGUID+217 , 187668, 571, 1, 1, 4176.302, 5277.055, 28.09965, 1.117009, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4108) +(@OGUID+218 , 187668, 571, 1, 1, 4171.795, 5282.206, 41.54663, 0.03490625, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4108) +(@OGUID+219 , 187668, 571, 1, 1, 4178.876, 5273.907, 40.73148, 1.396262, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4108) +(@OGUID+220 , 187668, 530, 1, 1, -2961.582, 2546.881, 79.93132, 1.692969, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3744) +(@OGUID+221 , 187668, 530, 1, 1, -2963.262, 2557.669, 96.95348, 3.403396, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3744) +(@OGUID+222 , 187668, 530, 1, 1, -2954.958, 2567.078, 81.00614, 3.822273, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3744) +(@OGUID+223 , 187668, 530, 1, 1, -2961.015, 2557.951, 93.87666, 6.213374, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3744) +(@OGUID+224 , 187668, 530, 1, 1, -4074.347, 2162.13, 111.4437, 1.53589, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3745) +(@OGUID+225 , 187668, 530, 1, 1, -4072.622, 2162.176, 111.4297, 1.658062, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3745) +(@OGUID+226 , 187668, 530, 1, 1, -4076.15, 2162.084, 111.4253, 1.605702, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3745) +(@OGUID+227 , 187668, 530, 1, 1, -2979.535, 851.0223, -5.23692, 1.658062, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3754) +(@OGUID+228 , 187668, 530, 1, 1, -2974.166, 852.9896, -5.184109, 1.884953, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3754) +(@OGUID+229 , 187668, 530, 1, 1, 289.163, 6085.788, 135.125, 4.747296, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3644) +(@OGUID+230 , 187668, 530, 1, 1, 276.0255, 6085.296, 135.0984, 4.886924, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3644) +(@OGUID+231 , 187668, 530, 1, 1, 270.995, 6092.489, 133.5649, 1.186823, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3644) +(@OGUID+232 , 187668, 530, 1, 1, 261.8294, 6096.237, 133.3653, 1.117009, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3644) +(@OGUID+233 , 187668, 530, 1, 1, 266.4354, 6094.357, 133.5182, 1.186823, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3644) +(@OGUID+234 , 187668, 530, 1, 1, 239.3766, 7930.089, 27.83519, 2.809975, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3645) +(@OGUID+235 , 187668, 530, 1, 1, 223.9831, 7923.57, 27.90063, 1.291542, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3645) +(@OGUID+236 , 187668, 530, 1, 1, 228.6397, 7945.422, 29.25893, 5.235988, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3645) +(@OGUID+237 , 187668, 530, 1, 1, 3057.197, 3694.741, 145.4213, 3.647741, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3712) +(@OGUID+238 , 187668, 530, 1, 1, 3060.614, 3691.763, 144.8515, 0.6457717, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3712) +(@OGUID+239 , 187668, 530, 1, 1, 3058.398, 3696.026, 144.8155, 0.1919852, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3712) +(@OGUID+240 , 187668, 530, 1, 1, 3058.831, 3691.601, 145.45, 3.508117, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3712) +(@OGUID+241 , 187668, 530, 1, 1, -4207.088, -12473.58, 46.58454, 4.694937, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+242 , 187668, 530, 1, 1, -4192.907, -12467.66, 46.6215, 5.794494, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+243 , 187668, 530, 1, 1, -4216.924, -12483.89, 48.3932, 6.230826, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+244 , 187668, 530, 1, 1, -4216.502, -12480.64, 48.98628, 6.213374, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+245 , 187668, 530, 1, 1, -4212.281, -12515.08, 50.44548, 0.3141584, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+246 , 187668, 530, 1, 1, -4212.782, -12506.34, 46.88014, 6.003934, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+247 , 187668, 530, 1, 1, -4208.398, -12519.56, 47.62306, 5.567601, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+248 , 187668, 530, 1, 1, -4149.234, -12485.86, 50.90091, 3.859896, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3576) +(@OGUID+249 , 187668, 530, 1, 1, -4164.37, -12536.8, 48.27224, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3576) +(@OGUID+250 , 187668, 530, 1, 1, -4160.896, -12457.07, 47.62824, 4.153885, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3576) +(@OGUID+251 , 187668, 530, 1, 1, -4167.781, -12537.14, 48.95461, 1.675514, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3576) +(@OGUID+252 , 187668, 530, 1, 1, -4144.596, -12490.33, 45.72705, 4.607672, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3576) +(@OGUID+253 , 187668, 530, 1, 1, -4152.799, -12480.7, 45.96771, 2.844883, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3576) +(@OGUID+254 , 187668, 530, 1, 1, -4163.363, -12455.46, 47.14916, 4.06662, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3576) +(@OGUID+255 , 187668, 530, 1, 1, -4153.813, -12532.33, 49.37784, 2.600535, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3576) +(@OGUID+256 , 187668, 530, 1, 1, -4150.61, -12525.97, 49.39287, 2.722713, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3576) +(@OGUID+257 , 187668, 530, 1, 1, -4173.694, -13729.01, 76.77699, 2.809975, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3526) +(@OGUID+258 , 187668, 530, 1, 1, -4050.141, -13778.29, 76.35183, 5.67232, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3527) +(@OGUID+259 , 187668, 530, 1, 1, -4047.493, -13771.29, 76.13934, 6.19592, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3527) +(@OGUID+260 , 201940, 530, 1, 1, 9611.64, -7183.144, 14.28471, 1.745327, 0, 0, 0, 1, 120, 255, 1), -- 201940 (Area: 3487) +(@OGUID+261 , 201940, 0, 1, 1, -4918.394, -983.5625, 501.4531, 2.268925, 0, 0, 0, 1, 120, 255, 1), -- 201940 (Area: 5342) +(@OGUID+262 , 201940, 0, 1, 1, -8868.988, 637.1007, 95.78714, 0.8377575, 0, 0, 0, 1, 120, 255, 1), -- 201940 (Area: 5148) Valentine Arch (x2.00) +(@OGUID+263 , 201940, 1, 1, 1, 9870.75, 2493.63, 1315.87, 5.98648, 0, 0, 0, 1, 120, 255, 1), -- 201940 (Area: 0) +(@OGUID+264 , 201940, 530, 1, 1, -4005.649, -11844.58, 0.186079, 4.520406, 0, 0, 0, 1, 120, 255, 1), -- 201940 (Area: 0) +(@OGUID+265 , 181027, 571, 1, 1, 5768.591, 693.1081, 612.2136, 5.93412, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4739) +(@OGUID+266 , 181027, 571, 1, 1, 5740.348, 662.5662, 612.2136, 0.03490625, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4739) +(@OGUID+267 , 181027, 571, 1, 1, 5734.721, 656.9608, 612.2136, 5.166176, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4739) +(@OGUID+268 , 181027, 571, 1, 1, 5718.801, 654.3483, 612.2136, 0.8901166, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4739) +(@OGUID+269 , 181027, 571, 1, 1, 5753.042, 707.0385, 612.2136, 2.216565, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4739) +(@OGUID+270 , 181027, 571, 1, 1, 5787.936, 719.6158, 612.2136, 5.113817, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4739) +(@OGUID+271 , 181027, 571, 1, 1, 5792.599, 725.4569, 612.2136, 4.502952, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4739) +(@OGUID+272 , 181027, 571, 1, 1, 5720.552, 681.9709, 612.2136, 2.932139, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4739) +(@OGUID+273 , 181027, 571, 1, 1, 2620.68, -2024.098, 0, 5.881761, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4242) +(@OGUID+274 , 181027, 571, 1, 1, 2558.805, -1994.658, 0, 5.078908, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4242) +(@OGUID+275 , 181027, 571, 1, 1, 2530.056, -2001.654, 0, 3.508117, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4242) +(@OGUID+276 , 181027, 571, 1, 1, 2571.232, -1981.536, 0, 0.7504908, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4242) +(@OGUID+277 , 181027, 571, 1, 1, 2564.62, -1902.94, 0, 1.204277, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4242) +(@OGUID+278 , 181027, 571, 1, 1, 2578.922, -1926.984, 0, 4.729844, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4242) +(@OGUID+279 , 181027, 571, 1, 1, 2604.255, -1901.251, 0, 4.904376, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4242) +(@OGUID+280 , 181027, 571, 1, 1, 2600.202, -1864.442, 0, 0.5061446, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4242) +(@OGUID+281 , 181027, 571, 1, 1, 2600.614, -1814.094, 0, 0.03490625, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4242) +(@OGUID+282 , 181027, 571, 1, 1, 2604.877, -1833.523, 0, 1.099556, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4242) +(@OGUID+283 , 181027, 571, 1, 1, 2415.667, -1854.533, 0, 2.687807, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4242) +(@OGUID+284 , 181027, 571, 1, 1, 2407.166, -1845.278, 0, 2.268925, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4242) +(@OGUID+285 , 181027, 571, 1, 1, 2404.097, -1864.177, 0, 3.560473, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4242) +(@OGUID+286 , 181027, 571, 1, 1, 2414.991, -1875.148, 0, 4.258607, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4242) +(@OGUID+287 , 181027, 571, 1, 1, 754.5249, -2854.845, 0, 2.932139, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3988) +(@OGUID+288 , 181027, 571, 1, 1, 767.0814, -2846.513, 0, 5.358162, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3988) +(@OGUID+289 , 181027, 571, 1, 1, 793.7769, -2840.536, 0, 5.93412, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3988) +(@OGUID+290 , 181027, 571, 1, 1, 794.0623, -2848.875, 0, 1.378809, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3988) +(@OGUID+291 , 181027, 571, 1, 1, 796.1247, -2842.772, 0, 1.658062, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3988) +(@OGUID+292 , 181027, 571, 1, 1, 765.928, -2820.402, 0, 5.794494, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3988) +(@OGUID+293 , 181027, 571, 1, 1, 2455.453, -5133.994, 275.5138, 3.194002, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4003) +(@OGUID+294 , 181027, 571, 1, 1, 2459.948, -5130.551, 275.5138, 0.3141584, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4003) +(@OGUID+295 , 181027, 571, 1, 1, 2455.139, -5131.472, 275.5138, 3.769912, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4003) +(@OGUID+296 , 181027, 571, 1, 1, 2380.471, -5088.479, 248.5613, 2.617989, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4003) +(@OGUID+297 , 181027, 571, 1, 1, 2502.854, -5015.77, 275.4288, 0.5759573, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4003) +(@OGUID+298 , 181027, 571, 1, 1, 2485.411, -5004.169, 274.5456, 1.117009, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4003) +(@OGUID+299 , 181027, 571, 1, 1, 2485.646, -5000.984, 274.5577, 3.804818, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4003) +(@OGUID+300 , 181027, 571, 1, 1, 2369.498, -5004.655, 248.5613, 3.455756, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4003) +(@OGUID+301 , 181027, 571, 1, 1, 2375.392, -5002.363, 248.5613, 1.658062, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4003) +(@OGUID+302 , 181027, 571, 1, 1, 3496.388, 1977.59, 65.96105, 5.969027, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4158) +(@OGUID+303 , 181027, 571, 1, 1, 3495.364, 1981.665, 66.03764, 5.235988, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4158) +(@OGUID+304 , 181027, 571, 1, 1, 3490.632, 1980.51, 65.99807, 5.113817, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4158) +(@OGUID+305 , 181027, 571, 1, 1, 2702.725, 934.8021, 0, 1.780234, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4152) +(@OGUID+306 , 181027, 571, 1, 1, 2700.923, 919.1116, 0, 1.308995, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4152) +(@OGUID+307 , 181027, 571, 1, 1, 2717.166, 869.525, 0, 2.146753, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4152) +(@OGUID+308 , 181027, 571, 1, 1, 2717.919, 866.1157, 0, 2.251473, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4152) +(@OGUID+309 , 181027, 571, 1, 1, 2658.5, 918.8054, 0, 4.310966, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4152) +(@OGUID+310 , 181027, 571, 1, 1, 2670.15, 871.2205, 0, 1.274088, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4152) +(@OGUID+311 , 181027, 571, 1, 1, 2668.09, 872.3976, 0, 1.466076, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4152) +(@OGUID+312 , 181027, 571, 1, 1, 2666.374, 918.7291, 0, 2.513274, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4152) +(@OGUID+313 , 181027, 571, 1, 1, 2627.73, 887.0659, 0, 4.01426, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4152) +(@OGUID+314 , 181027, 571, 1, 1, 2626.058, 889.1933, 0, 3.351047, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4152) +(@OGUID+315 , 181027, 571, 1, 1, 2627.751, 895.2178, 0, 1.675514, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4152) +(@OGUID+316 , 181027, 571, 1, 1, 5500.563, 5787.042, -82.11499, 3.351047, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4285) +(@OGUID+317 , 181027, 571, 1, 1, 5509.842, 5766.954, -84.06371, 5.358162, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4285) +(@OGUID+318 , 181027, 571, 1, 1, 5513.78, 5795.364, -80.6015, 0.2792516, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4285) +(@OGUID+319 , 181027, 571, 1, 1, 5510.346, 5761.825, -84.18658, 2.426008, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4285) +(@OGUID+320 , 181027, 571, 1, 1, 5501.959, 5802.074, -79.23232, 0.5585039, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4285) +(@OGUID+321 , 181027, 571, 1, 1, 5513.074, 5766.733, -84.07557, 1.099556, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4285) +(@OGUID+322 , 181027, 571, 1, 1, 5567.791, 5826.353, -73.64291, 5.759588, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4285) +(@OGUID+323 , 181027, 571, 1, 1, 5562.381, 5829.076, -73.01419, 4.520406, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4285) +(@OGUID+324 , 181027, 571, 1, 1, 5469.105, 4760.201, -198.9201, 0.2443456, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4290) +(@OGUID+325 , 181027, 571, 1, 1, 5469.406, 4742.04, -198.9063, 4.97419, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4290) +(@OGUID+326 , 181027, 571, 1, 1, 5478.349, 4771.299, -198.9465, 3.892087, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4290) +(@OGUID+327 , 181027, 571, 1, 1, 5467.913, 4754.535, -198.9201, 4.34587, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4290) +(@OGUID+328 , 181027, 571, 1, 1, 5450.431, 4755.577, -198.9201, 0.9424766, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4290) +(@OGUID+329 , 181027, 571, 1, 1, 5445.94, 4761.356, -199.0263, 0.4537851, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4290) +(@OGUID+330 , 181027, 530, 1, 1, 1961.764, 6885.375, 162.7591, 1.082103, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3771) +(@OGUID+331 , 181027, 530, 1, 1, 1965.24, 6884.419, 162.7591, 4.206246, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3772) +(@OGUID+332 , 181027, 530, 1, 1, 1964.663, 6887.743, 162.7591, 5.358162, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3772) +(@OGUID+333 , 181027, 530, 1, 1, 2097.025, 6825.342, 174.8524, 4.380776, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3772) +(@OGUID+334 , 181027, 530, 1, 1, 2095.012, 6821.211, 174.8731, 1.431168, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3772) +(@OGUID+335 , 181027, 530, 1, 1, 2092.416, 6825.399, 174.8686, 0.3316107, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3772) +(@OGUID+336 , 181027, 530, 1, 1, 2089.096, 6768.958, 164.8599, 4.049168, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3772) +(@OGUID+337 , 181027, 530, 1, 1, 2092.187, 6765.44, 164.8475, 4.293513, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3772) +(@OGUID+338 , 181027, 530, 1, 1, 2093.987, 6769.731, 164.8697, 1.308995, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3772) +(@OGUID+339 , 181027, 530, 1, 1, 2991.37, 5483.188, 144.6114, 0.4188786, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3951) +(@OGUID+340 , 181027, 530, 1, 1, 2986.906, 5481.471, 144.5909, 1.012289, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3951) +(@OGUID+341 , 181027, 530, 1, 1, 2991.238, 5478.47, 144.5909, 5.759588, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3951) +(@OGUID+342 , 181027, 530, 1, 1, 3030.463, 5492.013, 147.1473, 1.692969, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3951) +(@OGUID+343 , 181027, 530, 1, 1, 3034.872, 5490.722, 147.1473, 0.7155849, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3951) +(@OGUID+344 , 181027, 530, 1, 1, 3011.45, 5435.751, 147.5007, 1.919862, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3951) +(@OGUID+345 , 181027, 530, 1, 1, 3008.707, 5438.396, 147.5007, 6.0912, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3951) +(@OGUID+346 , 181027, 530, 1, 1, 3012.275, 5442.078, 147.5007, 4.415683, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3951) +(@OGUID+347 , 181027, 1, 1, 1, 9880.624, 2653.088, 1313.663, 2.879789, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 0) +(@OGUID+348 , 181027, 1, 1, 1, 10019.46, 2649.182, 1313.663, 5.044002, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 0) +(@OGUID+349 , 181027, 1, 1, 1, 10017.74, 2611.615, 1313.663, 3.054327, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 0) +(@OGUID+350 , 181027, 1, 1, 1, 9854.155, 2651.854, 1313.663, 1.343901, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 0) +(@OGUID+351 , 181027, 1, 1, 1, 10020.17, 2520.957, 1313.663, 0.7155849, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 0) +(@OGUID+352 , 181027, 1, 1, 1, 9810.941, 2549.63, 1313.663, 4.642576, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 1661) +(@OGUID+353 , 181027, 1, 1, 1, 9849.217, 2418.983, 1313.663, 1.221729, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 1661) +(@OGUID+354 , 181027, 1, 1, 1, 9825.401, 2650.506, 1313.663, 4.590216, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 1661) +(@OGUID+355 , 181027, 1, 1, 1, 9784.707, 2649.149, 1313.663, 4.24115, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 1661) +(@OGUID+356 , 181027, 1, 1, 1, 9715.958, 2650.025, 1313.663, 4.450591, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 1661) +(@OGUID+357 , 181027, 1, 1, 1, 9891.688, 2416.095, 1313.663, 2.652894, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 1661) +(@OGUID+358 , 181027, 1, 1, 1, 9819.463, 2391.367, 1313.663, 3.979355, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 1662) +(@OGUID+359 , 181027, 1, 1, 1, 9928.718, 2391.573, 1313.663, 2.670348, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 0) +(@OGUID+360 , 181027, 1, 1, 1, 9949.143, 2370.309, 1313.663, 2.408554, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 0) +(@OGUID+361 , 181027, 1, 1, 1, 10056.48, 2424.052, 1313.663, 2.617989, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 1660) +(@OGUID+362 , 181025, 571, 1, 1, 5422.828, -2574.388, 314.5182, 4.729844, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4275) +(@OGUID+363 , 181025, 571, 1, 1, 5490.349, -2575.417, 313.0533, 4.729844, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4275) +(@OGUID+364 , 181025, 571, 1, 1, 4524.684, -4252.019, 177.0246, 2.687807, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4159) +(@OGUID+365 , 181025, 571, 1, 1, 4532.347, -4148.53, 182.7989, 3.106652, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4159) +(@OGUID+366 , 181025, 571, 1, 1, 3881.886, -4516.897, 223.7292, 3.211419, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4205) +(@OGUID+367 , 181025, 571, 1, 1, 3431.319, -2776.561, 215.7577, 0.6457717, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 0) +(@OGUID+368 , 181025, 571, 1, 1, 3300.602, -2378.899, 117.8947, 4.939284, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 0) +(@OGUID+369 , 181025, 571, 1, 1, 3282.833, -2368.123, 117.8988, 3.42085, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 0) +(@OGUID+370 , 181025, 571, 1, 1, 3293.471, -2350.238, 117.6907, 1.884953, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 0) +(@OGUID+371 , 181025, 571, 1, 1, 3311.093, -2361.425, 117.9167, 0.2268925, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 0) +(@OGUID+372 , 181025, 571, 1, 1, 3346.118, -2225.082, 119.375, 2.042035, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4206) +(@OGUID+373 , 181025, 571, 1, 1, 3336.534, -2207.365, 120.0341, 5.288348, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4206) +(@OGUID+374 , 181025, 571, 1, 1, 3193.161, -2253.913, 117.8538, 1.727875, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4206) +(@OGUID+375 , 181025, 571, 1, 1, 3191.496, -2233.637, 117.8115, 4.694937, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4206) +(@OGUID+376 , 181025, 571, 1, 1, 3187.294, -2198.184, 141.9457, 3.822273, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4206) +(@OGUID+377 , 181025, 571, 1, 1, 3207.165, -2204.585, 142.3003, 5.253442, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4206) +(@OGUID+378 , 181025, 571, 1, 1, 3193.716, -2178.347, 141.7413, 2.076939, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4206) +(@OGUID+379 , 181025, 571, 1, 1, 1390.88, -3366.663, 194.8545, 1.396262, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 3998) +(@OGUID+380 , 181025, 571, 1, 1, 1350.993, -3356.948, 196.8577, 1.343901, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 3998) +(@OGUID+381 , 181025, 571, 1, 1, 3232.417, -718.9236, 167.9964, 2.076939, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4232) +(@OGUID+382 , 181025, 571, 1, 1, 3557.501, -768.2603, 203.7256, 5.113817, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 0) +(@OGUID+383 , 181025, 571, 1, 1, 3599.903, -757.4666, 199.1967, 4.76475, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 0) +(@OGUID+384 , 181025, 571, 1, 1, 3628.027, -668.0167, 244.9439, 3.892087, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 0) +(@OGUID+385 , 181025, 571, 1, 1, 3647.813, -648.9062, 243.9453, 0.7679439, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+386 , 181025, 571, 1, 1, 3634.617, -644.8275, 244.1315, 1.797689, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+387 , 181025, 571, 1, 1, 3641.374, -671.6805, 245.1112, 4.939284, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+388 , 181025, 571, 1, 1, 3650.591, -754.5084, 201.8451, 4.555311, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+389 , 181025, 571, 1, 1, 3695.235, -765.3697, 202.1208, 4.415683, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+390 , 181025, 571, 1, 1, 3767.403, -747.8274, 211.6567, 4.34587, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+391 , 181025, 571, 1, 1, 3779.269, -809.5614, 209.6387, 0.802851, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+392 , 181025, 571, 1, 1, 3815.78, -754.2736, 213.8814, 4.81711, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+393 , 181025, 571, 1, 1, 3800.189, -817.2236, 208.8302, 3.455756, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+394 , 181025, 571, 1, 1, 3816.917, -800.0577, 208.6812, 1.308995, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+395 , 181025, 571, 1, 1, 3826.977, -809.4998, 208.5766, 0.2617982, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+396 , 181025, 571, 1, 1, 3809.892, -826.8338, 208.5438, 4.433136, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+397 , 181025, 571, 1, 1, 3893.759, -696.3032, 261.979, 3.909541, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+398 , 181025, 571, 1, 1, 3928.128, -732.9033, 262.2497, 3.909541, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+399 , 181025, 571, 1, 1, 3905.213, -659.3301, 257.8033, 5.602507, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+400 , 181025, 571, 1, 1, 3966.297, -733.6108, 257.4371, 1.745327, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+401 , 181025, 571, 1, 1, 3893.384, -829.6746, 205.0926, 5.218536, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+402 , 181025, 571, 1, 1, 3847.43, -835.5692, 200.8211, 5.096362, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+403 , 181025, 571, 1, 1, 3807.228, -855.2426, 203.9786, 5.201083, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+404 , 181025, 571, 1, 1, 3797.328, -852.065, 204.1598, 3.630291, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+405 , 181025, 571, 1, 1, 3465.233, 228.1736, 59.31886, 3.263772, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4161) +(@OGUID+406 , 181025, 571, 1, 1, 3635.294, 245.6354, 58.86659, 0.06981169, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4161) +(@OGUID+407 , 181025, 571, 1, 1, 3628.324, 318.184, 59.31886, 0.2617982, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4161) +(@OGUID+408 , 181025, 571, 1, 1, 3457.301, 300.75, 59.31886, 3.071766, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4161) +(@OGUID+409 , 181025, 571, 1, 1, 3665.188, 265.6042, -109.3723, 0.1745321, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4161) +(@OGUID+410 , 181025, 571, 1, 1, 3661.484, 303.9514, -109.4306, 6.265733, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4161) +(@OGUID+411 , 181022, 530, 1, 1, -1982.277, 5110.882, 7.504348, 4.590216, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 0) +(@OGUID+412 , 181022, 530, 1, 1, -1964.9, 5104.314, 7.514653, 4.049168, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 0) +(@OGUID+413 , 181022, 530, 1, 1, -1873.795, 4977.795, -22.33295, 5.096362, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 0) +(@OGUID+414 , 181022, 530, 1, 1, -1857.198, 4976.8, -22.56705, 4.188792, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 0) +(@OGUID+415 , 181022, 530, 1, 1, -1546.829, 5108.851, -20.84263, 6.073746, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 0) +(@OGUID+416 , 181022, 0, 1, 1, -8430.985, 596.3506, 94.62032, 3.455756, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 5150) +(@OGUID+417 , 181022, 0, 1, 1, -8538.67, 470.2, 104.521, 2.757613, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 5150) +(@OGUID+418 , 181022, 0, 1, 1, -8554.11, 459.615, 104.693, 1.762782, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 5150) +(@OGUID+419 , 181022, 0, 1, 1, -8732.06, 393.212, 98.2072, 1.343901, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 5149) +(@OGUID+420 , 181022, 0, 1, 1, -8434.75, 987.1312, 96.96603, 2.303831, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 0) +(@OGUID+421 , 181022, 0, 1, 1, -8509.754, 1041.872, 59.36489, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 0) +(@OGUID+422 , 181022, 0, 1, 1, -8402.518, 1059.08, 31.63022, 2.076939, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 0) +(@OGUID+423 , 181022, 0, 1, 1, -8424.703, 1075.745, 19.67526, 2.111848, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 0) +(@OGUID+424 , 181022, 0, 1, 1, -8533.77, 1066.152, 18.98668, 1.658062, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 0) +(@OGUID+425 , 181022, 0, 1, 1, -8616.668, 1038.597, 97.02485, 5.724681, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 0) +(@OGUID+426 , 181022, 0, 1, 1, -8519.527, 1122.33, 18.91462, 1.466076, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 4411) +(@OGUID+427 , 181022, 0, 1, 1, -8466.509, 1156.274, 18.6443, 3.124123, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 0) +(@OGUID+428 , 181022, 0, 1, 1, -8307.936, 1071.653, 57.26217, 1.954769, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 4411) +(@OGUID+429 , 181022, 0, 1, 1, -8408.185, 1193.769, 5.698709, 1.780234, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 4411) +(@OGUID+430 , 181022, 0, 1, 1, -8373.63, 1192.8, 5.891318, 1.413715, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 4411) +(@OGUID+431 , 181022, 0, 1, 1, -8468.239, 1192.766, 6.125231, 1.640607, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 4411) +(@OGUID+432 , 181022, 0, 1, 1, -8518.73, 1207.85, 5.42902, 1.239183, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 4411) +(@OGUID+433 , 181022, 0, 1, 1, -8535.98, 1207.91, 5.46386, 1.850049, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 4411) +(@OGUID+434 , 181022, 0, 1, 1, -8562.929, 1194.916, 5.592021, 2.007128, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 4411) +(@OGUID+435 , 181022, 0, 1, 1, -8550.538, 1159.076, 18.65301, 1.500983, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 4411) +(@OGUID+436 , 181022, 0, 1, 1, -8605.79, 1213.77, 5.11101, 6.178466, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 4411) +(@OGUID+437 , 181022, 0, 1, 1, -8614.11, 1303.04, 5.750293, 3.543024, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 4411) +(@OGUID+438 , 181022, 0, 1, 1, -8641.774, 1288.231, 5.232253, 0.383971, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 4411) +(@OGUID+439 , 181022, 0, 1, 1, -8281.283, 1156.497, 18.09047, 2.042035, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 4411) +(@OGUID+440 , 181022, 0, 1, 1, -8306.66, 1301.68, 8.51337, 0.05235888, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 4411) +(@OGUID+441 , 181022, 0, 1, 1, -8219.573, 1191.089, 5.684546, 1.553341, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 4411) +(@OGUID+442 , 181022, 0, 1, 1, -8274.7, 1300.65, 8.51445, 3.106652, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 4411) +(@OGUID+443 , 181021, 1, 1, 1, 7889.62, -2516.01, 494.46, 4.81711, 0, 0, 0, 1, 120, 255, 1), -- 181021 (Area: 656) +(@OGUID+444 , 181020, 1, 1, 1, 7889.29, -2513.85, 492.001, 1.710422, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 656) +(@OGUID+445 , 181020, 1, 1, 1, 7902.82, -2485, 492.101, 4.677484, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 2361) +(@OGUID+446 , 181020, 1, 1, 1, 7870.19, -2488.41, 492.335, 4.921829, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 2361) +(@OGUID+447 , 181020, 571, 1, 1, 3281.508, -2289.553, 109.7592, 1.06465, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 4248) +(@OGUID+448 , 181020, 571, 1, 1, 3264.85, -2273.001, 109.3768, 4.799657, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 4248) +(@OGUID+449 , 181020, 571, 1, 1, 3194.855, -2292.016, 108.0624, 0.1745321, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 4248) +(@OGUID+450 , 181020, 571, 1, 1, 3272.445, -2284.55, 109.6323, 1.134463, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 4248) +(@OGUID+451 , 181020, 571, 1, 1, 2309.714, 5207.694, 20.94551, 1.117009, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 0) +(@OGUID+452 , 181020, 571, 1, 1, 2282.703, 5218.596, 20.9829, 1.221729, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 0) +(@OGUID+453 , 181020, 571, 1, 1, 2264.359, 5199.473, 21.16698, 2.792518, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 0) +(@OGUID+454 , 181020, 571, 1, 1, 2296.557, 5212.993, 20.75707, 1.169369, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 0) +(@OGUID+455 , 181020, 530, 1, 1, -4063.597, 2172.937, 112.3214, 0.1047193, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 3745) +(@OGUID+456 , 181020, 530, 1, 1, -3006.309, 859.5955, -5.977011, 3.612838, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 3754) +(@OGUID+457 , 181020, 530, 1, 1, 244.1061, 7939.502, 31.13577, 3.735006, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 3645) +(@OGUID+458 , 181020, 530, 1, 1, 237.0487, 7913.604, 30.74815, 1.97222, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 3645) +(@OGUID+459 , 181020, 530, 1, 1, 213.9386, 7927.577, 30.98103, 0.4188786, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 3645) +(@OGUID+460 , 181020, 0, 1, 1, -8408.65, 635.033, 101.409, 5.462882, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 5150) +(@OGUID+461 , 181020, 0, 1, 1, -8511.38, 527.79, 109.868, 0.6632232, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 5150) +(@OGUID+462 , 181020, 0, 1, 1, -8612.712, 504.6371, 115.3036, 0.5759573, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 5150) +(@OGUID+463 , 181020, 0, 1, 1, -8633.32, 421.481, 104.761, 2.216565, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 5390) +(@OGUID+464 , 181020, 0, 1, 1, -8640.89, 415.503, 104.791, 2.216565, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 5390) +(@OGUID+465 , 181020, 0, 1, 1, -8680.8, 461.089, 105.228, 5.375615, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 5390) +(@OGUID+466 , 181020, 0, 1, 1, -8719.567, 507.9125, 107.5373, 2.18166, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 5390) +(@OGUID+467 , 181020, 0, 1, 1, -8588.407, 706.8125, 108.9887, 2.18166, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 5390) +(@OGUID+468 , 181020, 0, 1, 1, -8665.82, 741.175, 108.709, 0.7330382, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 5390) +(@OGUID+469 , 181019, 571, 1, 1, 5177.153, -2180.084, 236.5424, 4.555311, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+470 , 181019, 571, 1, 1, 5192.435, -2209.911, 239.3982, 3.804818, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+471 , 181019, 571, 1, 1, 5157.259, -2201.744, 237.5309, 6.073746, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+472 , 181019, 571, 1, 1, 5137.096, -2201.546, 237.8019, 4.485497, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+473 , 181019, 571, 1, 1, 5157.712, -2215.265, 238.4418, 1.553341, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+474 , 181019, 571, 1, 1, 5141.539, -2211.604, 238.1585, 0.2967052, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+475 , 181019, 571, 1, 1, 3877.073, -4546.678, 210.972, 0.4537851, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+476 , 181019, 571, 1, 1, 3874.093, -4541.467, 210.1389, 3.33359, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+477 , 181019, 571, 1, 1, 3838.456, -4544.684, 209.2909, 2.530723, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+478 , 181019, 571, 1, 1, 3407.589, -2786.686, 202.9973, 5.637414, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+479 , 181019, 571, 1, 1, 3412.483, -2783.082, 202.9972, 3.57793, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+480 , 181019, 571, 1, 1, 3424.167, -2769.674, 201.4191, 0.9424766, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+481 , 181019, 571, 1, 1, 1432.413, -3253.822, 166.571, 5.288348, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 3998) +(@OGUID+482 , 181019, 571, 1, 1, 1425.667, -3261.837, 165.5927, 1.710422, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 3998) +(@OGUID+483 , 181019, 571, 1, 1, 1422.948, -3265.153, 165.6199, 4.32842, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 3998) +(@OGUID+484 , 181019, 571, 1, 1, 701.3621, -2933.383, -3.068485, 0.5235979, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 3987) +(@OGUID+485 , 181019, 571, 1, 1, 701.6729, -2935.085, -3.068489, 1.623156, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 3987) +(@OGUID+486 , 181019, 571, 1, 1, 3630.212, -709.9004, 215.4509, 4.66003, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+487 , 181019, 571, 1, 1, 3630.091, -711.7509, 215.451, 3.944446, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+488 , 181019, 571, 1, 1, 3629.777, -714.9827, 215.4509, 3.281239, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+489 , 181019, 571, 1, 1, 3629.591, -716.7711, 215.4509, 2.111848, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+490 , 181019, 571, 1, 1, 3658.893, -693.3231, 223.6275, 1.413715, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4177) +(@OGUID+491 , 181019, 571, 1, 1, 3660.452, -698.0406, 223.6275, 2.809975, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4177) +(@OGUID+492 , 181019, 571, 1, 1, 3653.071, -692.7104, 223.6275, 0.6457717, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4177) +(@OGUID+493 , 181019, 571, 1, 1, 3655.911, -710.7966, 227.4318, 3.525572, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4177) +(@OGUID+494 , 181019, 571, 1, 1, 3650.309, -697.8465, 223.6275, 3.194002, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4177) +(@OGUID+495 , 181019, 571, 1, 1, 3658.077, -721.1656, 216.2393, 5.358162, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4177) +(@OGUID+496 , 181019, 571, 1, 1, 3653.49, -720.2332, 216.2393, 2.809975, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4177) +(@OGUID+497 , 181019, 571, 1, 1, 3655.506, -720.5035, 216.2393, 1.448622, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4177) +(@OGUID+498 , 181019, 571, 1, 1, 3652.148, -720.3037, 216.2393, 0.03490625, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4177) +(@OGUID+499 , 181019, 571, 1, 1, 3560.058, 249.0957, 45.70548, 0.9773831, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4161) +(@OGUID+500 , 181019, 571, 1, 1, 3529.886, 252.3539, 45.7051, 3.316144, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4161) +(@OGUID+501 , 181019, 571, 1, 1, 3573.747, 275.6775, 45.70752, 5.061456, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4161) +(@OGUID+502 , 181019, 571, 1, 1, 3521.046, 280.9596, 45.70491, 0.5585039, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4161) +(@OGUID+503 , 181019, 571, 1, 1, 3555.038, 299.0926, 45.70468, 3.141593, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4161) +(@OGUID+504 , 181019, 571, 1, 1, 3497.954, 1962.59, 67.00489, 5.148723, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4158) +(@OGUID+505 , 181019, 571, 1, 1, 3489.518, 1973.308, 66.71261, 4.171338, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4158) +(@OGUID+506 , 181019, 571, 1, 1, 3515.049, 1995.76, 66.57986, 5.515242, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4158) +(@OGUID+507 , 181019, 571, 1, 1, 3498.045, 1985.921, 66.4942, 1.466076, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4158) +(@OGUID+508 , 181019, 571, 1, 1, 3472.785, 1978.688, 66.46651, 1.274088, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4158) +(@OGUID+509 , 181019, 571, 1, 1, 2292.771, 5195.491, 16.54581, 1.692969, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+510 , 181019, 571, 1, 1, 2295.146, 5194.604, 16.54581, 3.752462, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+511 , 181019, 571, 1, 1, 4502.473, 5716.374, 83.2963, 5.742135, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+512 , 181019, 571, 1, 1, 5546.444, 5741.974, -75.40535, 3.560473, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4285) +(@OGUID+513 , 181019, 571, 1, 1, 5565.401, 5770.03, -74.08703, 5.689774, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4285) +(@OGUID+514 , 181019, 571, 1, 1, 5558.145, 5760.761, -76.66797, 2.286379, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4285) +(@OGUID+515 , 181019, 571, 1, 1, 5543.533, 5732.819, -75.00607, 4.450591, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4285) +(@OGUID+516 , 181019, 571, 1, 1, 5564.951, 5763.742, -74.10497, 4.293513, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4285) +(@OGUID+517 , 181019, 571, 1, 1, 5592.455, 5748.157, -70.19862, 0.4537851, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4284) +(@OGUID+518 , 181019, 530, 1, 1, -1746.561, 5164.543, -35.90803, 5.201083, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 3899) +(@OGUID+519 , 181019, 530, 1, 1, -1722.684, 5148.509, -34.71685, 5.98648, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 3899) +(@OGUID+520 , 181019, 530, 1, 1, -1719.891, 5141.935, -34.7064, 4.363324, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 3899) +(@OGUID+521 , 181019, 530, 1, 1, -1720.093, 5141.122, -34.81209, 5.166176, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 3899) +(@OGUID+522 , 181019, 530, 1, 1, -1721.997, 5148.342, -34.72364, 2.199115, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 3899) +(@OGUID+523 , 181019, 530, 1, 1, -1742.537, 5152.636, -35.90804, 2.164206, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 3899) +(@OGUID+524 , 181019, 530, 1, 1, -1750.601, 5150.047, -36.30908, 4.468043, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 3899) +(@OGUID+525 , 181019, 530, 1, 1, -1753.868, 5159.522, -36.26046, 1.134463, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 3899) +(@OGUID+526 , 181019, 530, 1, 1, -1759.773, 5151.993, -36.28824, 1.466076, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 3899) +(@OGUID+527 , 181019, 530, 1, 1, -1778.798, 5125.128, -34.73267, 4.188792, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 3899) +(@OGUID+528 , 181019, 530, 1, 1, -1779.195, 5124.315, -34.74682, 5.951575, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 3899) +(@OGUID+529 , 181019, 530, 1, 1, -1780.604, 5132.849, -34.73998, 1.832595, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 3899) +(@OGUID+530 , 181019, 530, 1, 1, -1781.082, 5132.91, -34.72391, 4.625124, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 3899) +(@OGUID+531 , 181018, 571, 1, 1, 5815.427, 553.2634, 653.1058, 0.1745321, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4395) +(@OGUID+532 , 181018, 571, 1, 1, 5823.227, 554.9146, 653.1237, 6.178466, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4395) +(@OGUID+533 , 181018, 571, 1, 1, 5812.321, 551.391, 653.0699, 3.979355, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4395) +(@OGUID+534 , 181018, 571, 1, 1, 5819.637, 554.3771, 653.1036, 3.438303, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4395) +(@OGUID+535 , 181018, 571, 1, 1, 5827.601, 553.8232, 653.1969, 3.019413, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4395) +(@OGUID+536 , 181018, 571, 1, 1, 5808.787, 548.7609, 653.1042, 1.029743, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4395) +(@OGUID+537 , 181018, 571, 1, 1, 5855.679, 631.2502, 649.3745, 5.619962, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4395) +(@OGUID+538 , 181018, 571, 1, 1, 5853.158, 644.6632, 660.192, 0.087266, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4395) +(@OGUID+539 , 181018, 571, 1, 1, 5861.551, 637.7972, 649.4493, 5.759588, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4395) +(@OGUID+540 , 181018, 571, 1, 1, 5852.249, 653.2101, 660.2052, 0.2268925, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4395) +(@OGUID+541 , 181018, 571, 1, 1, 5834.877, 510.3333, 659.3004, 3.57793, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4395) +(@OGUID+542 , 181018, 571, 1, 1, 5828.073, 508.0534, 659.3159, 0.2268925, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4395) +(@OGUID+543 , 181018, 571, 1, 1, 5852.142, 667.3889, 649.5994, 0.802851, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4395) +(@OGUID+544 , 181018, 571, 1, 1, 5859.842, 660.3542, 649.3377, 0.5759573, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4395) +(@OGUID+545 , 181018, 571, 1, 1, 5879.179, 527.6025, 643.5471, 1.780234, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4395) +(@OGUID+546 , 181018, 571, 1, 1, 5733.871, 670.8108, 646.9722, 5.67232, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4739) +(@OGUID+547 , 181018, 571, 1, 1, 5739.494, 677.6687, 646.9604, 5.619962, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4739) +(@OGUID+548 , 181018, 571, 1, 1, 5761.328, 717.7375, 642.4337, 4.206246, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4739) +(@OGUID+549 , 181018, 571, 1, 1, 5756.841, 712.12, 642.4337, 0.7853968, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4739) +(@OGUID+550 , 181018, 571, 1, 1, 5888.802, 529.829, 643.4706, 1.797689, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4613) +(@OGUID+551 , 181018, 571, 1, 1, 5910.6, 572.0917, 642.006, 4.34587, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4613) +(@OGUID+552 , 181018, 571, 1, 1, 5920.077, 557.5112, 641.9263, 2.757613, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4613) +(@OGUID+553 , 181018, 571, 1, 1, 5668.451, 683.9045, 655.4852, 5.881761, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4568) +(@OGUID+554 , 181018, 571, 1, 1, 5662.25, 669.692, 655.4854, 5.777041, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4568) +(@OGUID+555 , 181018, 571, 1, 1, 5944.854, 630.399, 654.0372, 2.792518, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4613) +(@OGUID+556 , 181018, 571, 1, 1, 5939.464, 615.9524, 654.1125, 2.670348, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4613) +(@OGUID+557 , 181018, 571, 1, 1, 6127.377, -1046.22, 405.7823, 3.124123, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4419) +(@OGUID+558 , 181018, 571, 1, 1, 6113.523, -1046.297, 406.5891, 0.05235888, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4419) +(@OGUID+559 , 181018, 571, 1, 1, 5745.579, -3534.724, 396.685, 5.026549, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 0) +(@OGUID+560 , 181018, 571, 1, 1, 5769.655, -3530.542, 396.8302, 4.904376, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4324) +(@OGUID+561 , 181018, 571, 1, 1, 3854.253, -4497.099, 208.4463, 2.635444, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4205) +(@OGUID+562 , 181018, 571, 1, 1, 3845.263, -4506.483, 208.0879, 2.33874, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 0) +(@OGUID+563 , 181018, 571, 1, 1, 3865.145, -4556.175, 211.0864, 3.159062, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 0) +(@OGUID+564 , 181018, 571, 1, 1, 3876.38, -4541.031, 209.7021, 4.520406, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 0) +(@OGUID+565 , 181018, 571, 1, 1, 3858.301, -4564.549, 210.1741, 1.396262, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 0) +(@OGUID+566 , 181018, 571, 1, 1, 1421.958, -3261.318, 175.9854, 2.478367, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 3998) +(@OGUID+567 , 181018, 571, 1, 1, 724.0819, -2929.729, 7.998729, 0.1396245, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 3987) +(@OGUID+568 , 181018, 571, 1, 1, 437.3842, -4539.971, 252.3735, 3.054327, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 3991) +(@OGUID+569 , 181018, 571, 1, 1, 438.4343, -4546.447, 249.3452, 3.001947, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 3991) +(@OGUID+570 , 181018, 571, 1, 1, 442.4383, -4552.802, 249.542, 4.415683, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 3991) +(@OGUID+571 , 181018, 571, 1, 1, 447.4662, -4556.945, 252.1781, 4.398232, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 3991) +(@OGUID+572 , 181018, 571, 1, 1, 481.2321, -4523.523, 260.9968, 3.700105, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 3991) +(@OGUID+573 , 181018, 571, 1, 1, 572.9479, -4943.799, 27.1676, 3.47321, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 3981) +(@OGUID+574 , 181018, 571, 1, 1, 585.9739, -4954.365, 22.9537, 4.310966, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 3981) +(@OGUID+575 , 181018, 571, 1, 1, 592.2986, -4952.793, 23.01477, 5.567601, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 3981) +(@OGUID+576 , 181018, 571, 1, 1, 1896.369, -6177.458, 28.25126, 0.2792516, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4000) +(@OGUID+577 , 181018, 571, 1, 1, 1886.857, -6181.003, 26.00835, 4.32842, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4000) +(@OGUID+578 , 181018, 571, 1, 1, 1883.005, -6173.481, 30.73777, 1.867502, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4000) +(@OGUID+579 , 181018, 571, 1, 1, 1889.537, -6174.26, 27.78375, 1.675514, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4000) +(@OGUID+580 , 181017, 571, 1, 1, 5809.249, 576.0026, 657.8462, 4.799657, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4395) +(@OGUID+581 , 181017, 571, 1, 1, 5783.142, 561.5955, 655.6302, 0.9250238, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4395) +(@OGUID+582 , 181017, 571, 1, 1, 5843.796, 569.7678, 656.4412, 2.460913, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4395) +(@OGUID+583 , 181017, 571, 1, 1, 5753.474, 616.6545, 656.3826, 4.01426, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4395) +(@OGUID+584 , 181017, 571, 1, 1, 5755.206, 632.1685, 667.4127, 3.281239, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4395) +(@OGUID+585 , 181017, 571, 1, 1, 5859.036, 634.3795, 653.5594, 5.567601, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4395) +(@OGUID+586 , 181017, 571, 1, 1, 5730.578, 607.2695, 652.4564, 0.9075702, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4395) +(@OGUID+587 , 181017, 571, 1, 1, 5881.26, 611.1509, 654.602, 2.408554, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4395) +(@OGUID+588 , 181017, 571, 1, 1, 5750.088, 646.9669, 655.8947, 2.460913, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4395) +(@OGUID+589 , 181017, 571, 1, 1, 5886.485, 624.7205, 653.5937, 2.44346, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4395) +(@OGUID+590 , 181017, 571, 1, 1, 5855.724, 664.5695, 653.6199, 0.8726639, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4395) +(@OGUID+591 , 181017, 571, 1, 1, 5802.563, 689.8659, 664.4053, 1.675514, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4395) +(@OGUID+592 , 181017, 571, 1, 1, 5786.861, 691.6611, 652.8747, 2.408554, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4739) +(@OGUID+593 , 181017, 571, 1, 1, 5817.452, 694.9246, 652.8608, 0.8726639, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4739) +(@OGUID+594 , 181017, 571, 1, 1, 5733.013, 677.092, 652.2612, 5.585054, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4739) +(@OGUID+595 , 181017, 571, 1, 1, 5872.592, 687.6406, 650.2322, 3.979355, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4739) +(@OGUID+596 , 181017, 571, 1, 1, 5858.502, 699.9028, 647.2755, 4.01426, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4739) +(@OGUID+597 , 181017, 571, 1, 1, 5768.054, 709.3629, 623.4171, 5.602507, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4739) +(@OGUID+598 , 181017, 571, 1, 1, 5835.142, 720.0156, 646.1909, 3.996807, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4613) +(@OGUID+599 , 181017, 571, 1, 1, 5760.299, 713.8768, 652.3187, 5.67232, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4739) +(@OGUID+600 , 181017, 571, 1, 1, 5901.187, 684.3663, 647.5936, 2.391098, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4739) +(@OGUID+601 , 181017, 571, 1, 1, 5873.009, 725.3192, 647.5492, 1.797689, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4739) +(@OGUID+602 , 181017, 571, 1, 1, 5768.548, 732.4496, 646.0042, 5.759588, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4739) +(@OGUID+603 , 181017, 571, 1, 1, 5893.215, 706.2971, 646.8101, 0.9075702, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4739) +(@OGUID+604 , 181017, 571, 1, 1, 5864.956, 738.7273, 644.807, 5.078908, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4739) +(@OGUID+605 , 181017, 571, 1, 1, 5909.327, 661.7327, 649.2336, 3.944446, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4739) +(@OGUID+606 , 181017, 571, 1, 1, 5883.444, 741.7843, 644.4044, 4.921829, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4739) +(@OGUID+607 , 181017, 571, 1, 1, 5885.01, 524.2327, 648.1631, 1.850049, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4613) +(@OGUID+608 , 181017, 571, 1, 1, 5687.88, 620.0889, 652.0167, 0.5585039, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4613) +(@OGUID+609 , 181017, 571, 1, 1, 5675.364, 631.4016, 652.0096, 0.5235979, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4567) +(@OGUID+610 , 181017, 571, 1, 1, 5671.868, 646.4288, 651.8803, 0.2792516, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4613) +(@OGUID+611 , 181017, 571, 1, 1, 5668.864, 712.5075, 647.7338, 4.01426, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4568) +(@OGUID+612 , 181017, 571, 1, 1, 5679.624, 720.0261, 647.5791, 2.478367, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4568) +(@OGUID+613 , 181017, 571, 1, 1, 5679.613, 720.0153, 659.1891, 2.426008, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4568) +(@OGUID+614 , 181017, 571, 1, 1, 5665.726, 718.7106, 647.9514, 3.368496, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4568) +(@OGUID+615 , 181017, 571, 1, 1, 5670.651, 730.9137, 647.9866, 2.234018, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4568) +(@OGUID+616 , 181017, 571, 1, 1, 5677.255, 732.9352, 647.86, 1.623156, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4568) +(@OGUID+617 , 181017, 571, 1, 1, 5666.311, 725.6754, 647.9023, 2.687807, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4568) +(@OGUID+618 , 181017, 571, 1, 1, 5915.079, 710.2083, 646.6064, 3.036838, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4613) +(@OGUID+619 , 181017, 571, 1, 1, 5915.948, 728.4288, 646.2543, 3.071766, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4613) +(@OGUID+620 , 181017, 571, 1, 1, 5901.741, 746.0184, 645.2678, 4.468043, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4613) +(@OGUID+621 , 181017, 571, 1, 1, 6654.499, -190.9763, 956.8075, 0.4188786, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4428) +(@OGUID+622 , 181017, 571, 1, 1, 6676.616, -199.1265, 954.8306, 3.33359, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4428) +(@OGUID+623 , 181017, 571, 1, 1, 6653.604, -203.6228, 954.6893, 5.759588, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4428) +(@OGUID+624 , 181017, 571, 1, 1, 6663.807, -184.6699, 958.2155, 3.944446, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4428) +(@OGUID+625 , 181017, 571, 1, 1, 6685.919, -206.6383, 953.6956, 3.874631, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4428) +(@OGUID+626 , 181017, 571, 1, 1, 6122.517, -1074.911, 407.3852, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4419) +(@OGUID+627 , 181017, 571, 1, 1, 4596.626, -4237.616, 181.8922, 2.303831, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4159) +(@OGUID+628 , 181017, 571, 1, 1, 4551.28, -4238.457, 173.6895, 2.408554, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4159) +(@OGUID+629 , 181017, 571, 1, 1, 3403.195, -2797.129, 217.5549, 0.6806767, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+630 , 181017, 571, 1, 1, 3407.778, -2803.883, 205.8443, 4.520406, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+631 , 181017, 571, 1, 1, 3388.071, -2808.053, 207.0942, 3.717554, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+632 , 181017, 571, 1, 1, 3389.364, -2800.435, 207.4506, 2.18166, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+633 , 181017, 571, 1, 1, 3396.49, -2809.565, 207.4137, 5.323256, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+634 , 181017, 571, 1, 1, 3422.459, -2783.034, 207.0113, 3.804818, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+635 , 181017, 571, 1, 1, 3431.648, -2776.44, 207.109, 0.6108634, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+636 , 181017, 571, 1, 1, 3270.23, -2299.017, 105.3505, 1.047198, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+637 , 181017, 571, 1, 1, 3280.345, -2211.232, 127.4082, 2.705255, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4206) +(@OGUID+638 , 181017, 571, 1, 1, 3272.255, -2192.748, 127.4287, 4.293513, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4206) +(@OGUID+639 , 181017, 571, 1, 1, 3253.434, -2199.932, 127.3124, 5.93412, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4206) +(@OGUID+640 , 181017, 571, 1, 1, 2129.331, -2957.729, 155.2842, 0.3665176, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4070) +(@OGUID+641 , 181017, 571, 1, 1, 2122.887, -2959.943, 155.2807, 3.47321, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4070) +(@OGUID+642 , 181017, 571, 1, 1, 2127.25, -2962.019, 155.3076, 4.991644, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4070) +(@OGUID+643 , 181017, 571, 1, 1, 2124.927, -2955.563, 154.9684, 1.850049, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4070) +(@OGUID+644 , 181017, 571, 1, 1, 2128.509, -2993.269, 155.7663, 1.710422, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+645 , 181017, 571, 1, 1, 2129.307, -3000.026, 155.8247, 4.852017, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+646 , 181017, 571, 1, 1, 2125.529, -2997.12, 155.7463, 3.33359, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+647 , 181017, 571, 1, 1, 2132.394, -2996.245, 155.8432, 0.122173, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+648 , 181017, 571, 1, 1, 1474.518, -3279.563, 178.9401, 0.8203033, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4071) +(@OGUID+649 , 181017, 571, 1, 1, 1465.599, -3290.57, 178.7285, 3.961899, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4071) +(@OGUID+650 , 181017, 571, 1, 1, 1425.031, -3316.349, 173.5113, 2.094393, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4071) +(@OGUID+651 , 181017, 571, 1, 1, 1461.297, -3264.238, 183.4601, 0.8377575, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4071) +(@OGUID+652 , 181017, 571, 1, 1, 1428.773, -3274.498, 181.0417, 4.01426, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3998) +(@OGUID+653 , 181017, 571, 1, 1, 1426.495, -3265.443, 172.1592, 2.426008, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3998) +(@OGUID+654 , 181017, 571, 1, 1, 1431.548, -3252.894, 183.7873, 2.44346, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3998) +(@OGUID+655 , 181017, 571, 1, 1, 1449.89, -3254.639, 183.1299, 0.9075702, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3998) +(@OGUID+656 , 181017, 571, 1, 1, 713.499, -2931.399, 2.876178, 0.1396245, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3987) +(@OGUID+657 , 181017, 571, 1, 1, 454.9619, -4528.652, 251.8441, 5.270896, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3991) +(@OGUID+658 , 181017, 571, 1, 1, 463.7049, -4534.563, 254.9479, 3.717554, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3991) +(@OGUID+659 , 181017, 571, 1, 1, 465.882, -4545.663, 251.8806, 2.076939, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3991) +(@OGUID+660 , 181017, 571, 1, 1, 445.4201, -4640.561, 253.3178, 2.076939, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3991) +(@OGUID+661 , 181017, 571, 1, 1, 486.4948, -4520.141, 239.7659, 3.735006, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3991) +(@OGUID+662 , 181017, 571, 1, 1, 587.5087, -4945.893, 32.49911, 4.886924, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3981) +(@OGUID+663 , 181017, 571, 1, 1, 578.7986, -4942.297, 23.31465, 3.403396, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3981) +(@OGUID+664 , 181017, 571, 1, 1, 597.412, -5011.138, 9.712256, 6.003934, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3981) +(@OGUID+665 , 181017, 571, 1, 1, 548.7562, -5021.973, 17.47475, 1.745327, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3981) +(@OGUID+666 , 181017, 571, 1, 1, 639.2745, -5012.341, 11.1266, 3.38594, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3981) +(@OGUID+667 , 181017, 571, 1, 1, 1881.401, -6201.038, 33.84504, 1.169369, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4000) +(@OGUID+668 , 181017, 571, 1, 1, 1872.579, -6219.774, 42.40208, 1.099556, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4000) +(@OGUID+669 , 181017, 571, 1, 1, 1949.33, -6147.306, 31.00299, 2.862335, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4000) +(@OGUID+670 , 181017, 571, 1, 1, 1933.835, -6188.439, 30.40494, 1.710422, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4000) +(@OGUID+671 , 181017, 571, 1, 1, 1966.471, -6119.723, 41.52581, 4.06662, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4000) +(@OGUID+672 , 181017, 571, 1, 1, 1955.997, -6111.83, 41.53107, 4.084071, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4000) +(@OGUID+673 , 181017, 571, 1, 1, 1960.26, -6117.287, 41.52031, 3.996807, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4000) +(@OGUID+674 , 181017, 571, 1, 1, 1971.802, -6102.198, 73.7106, 0.9250238, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4000) +(@OGUID+675 , 181017, 571, 1, 1, 2469.7, -5056.41, 296.0691, 3.019413, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4003) +(@OGUID+676 , 181017, 571, 1, 1, 2496.864, -5066.933, 302.6931, 6.161013, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4003) +(@OGUID+677 , 181017, 571, 1, 1, 2477.306, -5073.561, 291.6375, 3.036838, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4003) +(@OGUID+678 , 181017, 571, 1, 1, 2475.982, -5063.151, 289.1608, 4.607672, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4003) +(@OGUID+679 , 181017, 571, 1, 1, 2483.536, -5065.366, 301.6975, 3.071766, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4003) +(@OGUID+680 , 181017, 571, 1, 1, 2501.505, -5059.525, 285.9003, 6.161013, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4003) +(@OGUID+681 , 181017, 571, 1, 1, 2485.302, -5048.401, 296.4124, 1.466076, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4003) +(@OGUID+682 , 181017, 571, 1, 1, 2673.549, -4383.29, 290.4919, 2.600535, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+683 , 181017, 571, 1, 1, 3243.007, -716.868, 174.0614, 1.151916, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4232) +(@OGUID+684 , 181017, 571, 1, 1, 3230.017, -756.3438, 174.0186, 5.288348, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4232) +(@OGUID+685 , 181017, 571, 1, 1, 3215.221, -748.2292, 173.9813, 3.106652, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4232) +(@OGUID+686 , 181017, 571, 1, 1, 3226.663, -687.4913, 176.1088, 5.794494, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4232) +(@OGUID+687 , 181017, 571, 1, 1, 3221.048, -666.5087, 175.2865, 0.9948372, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4232) +(@OGUID+688 , 181017, 571, 1, 1, 3212.471, -667.382, 175.2803, 2.617989, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4232) +(@OGUID+689 , 181017, 571, 1, 1, 3203.728, -675.9549, 175.5281, 2.635444, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4186) +(@OGUID+690 , 181017, 571, 1, 1, 3654.854, -700.4598, 228.6396, 1.396262, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4177) +(@OGUID+691 , 181017, 571, 1, 1, 3663.722, -720.0434, 224.0076, 6.230826, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4177) +(@OGUID+692 , 181017, 571, 1, 1, 3668.486, -717.066, 218.9095, 6.230826, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4177) +(@OGUID+693 , 181017, 571, 1, 1, 3667.354, -727.1337, 218.3601, 6.126106, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4177) +(@OGUID+694 , 181017, 571, 1, 1, 3668.153, -722.3611, 218.7, 6.108654, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4177) +(@OGUID+695 , 181017, 571, 1, 1, 3665.362, -707.243, 221.1085, 6.126106, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4177) +(@OGUID+696 , 181017, 571, 1, 1, 3521.09, 240.6755, 53.60065, 0.8901166, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4161) +(@OGUID+697 , 181017, 571, 1, 1, 3577.127, 249.5916, 53.55267, 2.460913, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4161) +(@OGUID+698 , 181017, 571, 1, 1, 3515.238, 299.4315, 53.53123, 5.585054, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4161) +(@OGUID+699 , 181017, 571, 1, 1, 3570.422, 301.9106, 53.45552, 4.031712, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4161) +(@OGUID+700 , 181017, 571, 1, 1, 4986.635, 1237.804, 232.5177, 4.293513, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4170) +(@OGUID+701 , 181017, 571, 1, 1, 5013.381, 1244.962, 238.3039, 5.969027, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4170) +(@OGUID+702 , 181017, 571, 1, 1, 5006.911, 1195.97, 235.5182, 2.44346, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4170) +(@OGUID+703 , 181017, 571, 1, 1, 5027.013, 1209.431, 233.9405, 0.9773831, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4170) +(@OGUID+704 , 181017, 571, 1, 1, 5027.053, 1209.406, 240.235, 1.082103, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4170) +(@OGUID+705 , 181017, 571, 1, 1, 3464.886, 4177.207, 24.38719, 4.642576, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4037) +(@OGUID+706 , 181017, 571, 1, 1, 2314.894, 5185.276, 23.48018, 4.363324, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+707 , 181017, 571, 1, 1, 2274.934, 5189.169, 26.13615, 4.258607, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+708 , 181017, 571, 1, 1, 2303.014, 5208.549, 27.68204, 1.186823, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+709 , 181017, 571, 1, 1, 2320.047, 5198.47, 23.71446, 1.151916, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+710 , 181017, 571, 1, 1, 2270.002, 5197.174, 17.32868, 2.740162, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+711 , 181017, 571, 1, 1, 2288.641, 5214.336, 27.50825, 1.169369, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+712 , 181017, 571, 1, 1, 2270.879, 5210.542, 28.94806, 2.757613, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+713 , 181017, 571, 1, 1, 2769.89, 6123.314, 96.68723, 3.822273, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4020) +(@OGUID+714 , 181017, 571, 1, 1, 2815.303, 6165.526, 90.96311, 3.944446, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4129) +(@OGUID+715 , 181017, 571, 1, 1, 3624.583, 5913.436, 144.8049, 2.094393, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4023) +(@OGUID+716 , 181017, 571, 1, 1, 4172.988, 5271.836, 40.90479, 2.565632, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4108) +(@OGUID+717 , 181017, 571, 1, 1, 4173.983, 5280.55, 30.62882, 6.213374, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4108) +(@OGUID+718 , 181017, 571, 1, 1, 4165.883, 5280.938, 31.36931, 3.089183, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4108) +(@OGUID+719 , 181017, 571, 1, 1, 4174.368, 5270.975, 41.0957, 5.637414, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4108) +(@OGUID+720 , 181017, 571, 1, 1, 5543.419, 5736.716, -72.88883, 2.583081, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4285) +(@OGUID+721 , 181017, 571, 1, 1, 5562.838, 5767.768, -69.31071, 3.036838, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4285) +(@OGUID+722 , 181017, 571, 1, 1, 5549.516, 5738.056, -72.93507, 0.9948372, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4285) +(@OGUID+723 , 181017, 571, 1, 1, 5577.761, 5766.71, -69.34008, 6.230826, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4285) +(@OGUID+724 , 181017, 571, 1, 1, 5544.886, 5730.654, -72.89562, 4.153885, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4285) +(@OGUID+725 , 181017, 571, 1, 1, 5550.921, 5732.03, -72.89473, 5.742135, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4285) +(@OGUID+726 , 181017, 571, 1, 1, 5569.917, 5759.858, -69.32285, 4.677484, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4285) +(@OGUID+727 , 181017, 571, 1, 1, 5570.901, 5774.635, -69.3968, 1.448622, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4285) +(@OGUID+728 , 181017, 571, 1, 1, 5584.953, 5748.914, -68.31659, 3.281239, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4284) +(@OGUID+729 , 181017, 530, 1, 1, -2176.667, 5405.86, 58.44925, 0.5235979, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3898) +(@OGUID+730 , 181017, 530, 1, 1, -1905.432, 5771.346, 137.7419, 5.288348, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+731 , 181017, 530, 1, 1, -1892.362, 5766.126, 137.6966, 6.161013, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+732 , 181017, 530, 1, 1, -2659.457, 4386.914, 39.52228, 0.8203033, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3683) +(@OGUID+733 , 181017, 530, 1, 1, -2587.3, 4469.175, 40.08729, 3.281239, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3683) +(@OGUID+734 , 181017, 530, 1, 1, -2671.876, 4457.92, 42.83185, 5.270896, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3683) +(@OGUID+735 , 181017, 530, 1, 1, -2648.931, 4478.227, 39.93041, 2.652894, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3683) +(@OGUID+736 , 181017, 530, 1, 1, -2967.964, 4020.805, 7.264894, 5.67232, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3684) +(@OGUID+737 , 181017, 530, 1, 1, -2987.704, 4030.75, 7.28573, 2.478367, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3684) +(@OGUID+738 , 181017, 530, 1, 1, -2923.89, 4017.942, 8.344274, 3.665196, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3684) +(@OGUID+739 , 181017, 530, 1, 1, -2982.132, 3981.363, 8.745137, 6.230826, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3684) +(@OGUID+740 , 181017, 530, 1, 1, -2931.291, 3931.274, 8.816035, 1.902409, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3684) +(@OGUID+741 , 181017, 530, 1, 1, -3022.694, 2624.565, 85.78185, 3.909541, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3744) +(@OGUID+742 , 181017, 530, 1, 1, -2972.565, 2562.675, 83.66947, 5.829401, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3744) +(@OGUID+743 , 181017, 530, 1, 1, -2955.605, 2554.495, 110.3285, 5.846854, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3744) +(@OGUID+744 , 181017, 530, 1, 1, -2927.35, 2650.861, 100.1286, 3.822273, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3744) +(@OGUID+745 , 181017, 530, 1, 1, -4010.367, 2155.552, 109.9921, 1.06465, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3745) +(@OGUID+746 , 181017, 530, 1, 1, -4058.762, 2175.685, 117.8552, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3745) +(@OGUID+747 , 181017, 530, 1, 1, -709.4097, 2704.609, 99.62894, 4.694937, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3538) +(@OGUID+748 , 181017, 530, 1, 1, -717.0001, 2714.823, 100.4722, 3.124123, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3538) +(@OGUID+749 , 181017, 530, 1, 1, -716.9244, 2718.473, 100.4844, 3.106652, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3538) +(@OGUID+750 , 181017, 530, 1, 1, -716.8802, 2742.702, 100.7903, 3.176533, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3538) +(@OGUID+751 , 181017, 530, 1, 1, -690.7932, 2724.943, 100.9289, 6.265733, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3538) +(@OGUID+752 , 181017, 530, 1, 1, 181.4262, 2624.335, 98.51126, 2.18166, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3536) +(@OGUID+753 , 181017, 530, 1, 1, -249.9205, 5495.466, 36.7147, 5.323256, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3565) +(@OGUID+754 , 181017, 530, 1, 1, 282.6363, 6085.975, 137.649, 4.747296, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3644) +(@OGUID+755 , 181017, 530, 1, 1, 237.8501, 7911.491, 30.4785, 5.113817, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3645) +(@OGUID+756 , 181017, 530, 1, 1, 236.9491, 7913.625, 30.50175, 1.97222, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3645) +(@OGUID+757 , 181017, 530, 1, 1, 223.4775, 7943.311, 30.76142, 5.131269, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3645) +(@OGUID+758 , 181017, 530, 1, 1, 244.0695, 7939.386, 30.92426, 3.438303, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3645) +(@OGUID+759 , 181017, 530, 1, 1, 214.1629, 7927.679, 30.72031, 0.4014249, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3645) +(@OGUID+760 , 181017, 530, 1, 1, 195.0323, 8490.546, 35.5514, 0.6632232, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3656) +(@OGUID+761 , 181017, 530, 1, 1, 264.8356, 8492.754, 34.60779, 2.129301, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3656) +(@OGUID+762 , 181017, 530, 1, 1, 272.1655, 8509.436, 32.72204, 3.700105, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3656) +(@OGUID+763 , 181017, 530, 1, 1, 219.5999, 8569.107, 33.13798, 4.677484, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3649) +(@OGUID+764 , 181017, 530, 1, 1, -2713.36, 7298.445, 51.91501, 5.846854, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3626) +(@OGUID+765 , 181017, 530, 1, 1, -2698.241, 7291.552, 49.91637, 5.969027, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3626) +(@OGUID+766 , 181017, 530, 1, 1, -2730.689, 7306.021, 51.7765, 2.740162, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3626) +(@OGUID+767 , 181017, 530, 1, 1, -2677.658, 7203.919, 32.99669, 1.204277, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3626) +(@OGUID+768 , 181017, 530, 1, 1, -2775.226, 7326.033, 51.77103, 5.829401, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3626) +(@OGUID+769 , 181017, 530, 1, 1, 1955.625, 6885.821, 167.1296, 4.468043, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3771) +(@OGUID+770 , 181017, 530, 1, 1, 2009.813, 6871.413, 188.1808, 4.24115, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3772) +(@OGUID+771 , 181017, 530, 1, 1, 2032.214, 6819.37, 181.5125, 3.874631, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3772) +(@OGUID+772 , 181017, 530, 1, 1, 2031.963, 6825.553, 181.5333, 2.426008, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3772) +(@OGUID+773 , 181017, 530, 1, 1, 2038.027, 6826.094, 181.4816, 0.8377575, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3772) +(@OGUID+774 , 181017, 530, 1, 1, 2038.565, 6819.838, 181.4885, 5.550147, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3772) +(@OGUID+775 , 181017, 530, 1, 1, 2062.016, 6825.854, 184.7832, 4.729844, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3772) +(@OGUID+776 , 181017, 530, 1, 1, 2063.305, 6759.898, 173.2681, 4.694937, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3772) +(@OGUID+777 , 181017, 530, 1, 1, 2163.694, 6745.077, 172.4085, 4.049168, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3772) +(@OGUID+778 , 181017, 530, 1, 1, 2162.737, 6751.214, 172.4385, 2.495818, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3772) +(@OGUID+779 , 181017, 530, 1, 1, 2168.956, 6752.182, 172.4387, 0.9250238, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3772) +(@OGUID+780 , 181017, 530, 1, 1, 2169.925, 6745.97, 172.4366, 5.67232, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3772) +(@OGUID+781 , 181017, 530, 1, 1, 3026.51, 5497.439, 151.5307, 3.700105, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3951) +(@OGUID+782 , 181017, 530, 1, 1, 3016.612, 5445.069, 151.877, 2.146753, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3951) +(@OGUID+783 , 181017, 530, 1, 1, 2155.25, 4720.381, 160.9449, 3.036838, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3844) +(@OGUID+784 , 181017, 530, 1, 1, 2154.756, 4716.656, 160.9547, 3.001947, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3844) +(@OGUID+785 , 181017, 530, 1, 1, 2035.05, 4693.116, 154.7217, 1.850049, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3844) +(@OGUID+786 , 181017, 530, 1, 1, 2031.468, 4692.11, 154.7591, 1.884953, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3844) +(@OGUID+787 , 181017, 530, 1, 1, 2962.525, 3697.009, 150.2677, 1.466076, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3712) +(@OGUID+788 , 181017, 530, 1, 1, 3061.875, 3647.259, 149.6342, 2.373644, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3712) +(@OGUID+789 , 181017, 530, 1, 1, 4103.79, 3058.691, 345.6179, 3.525572, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3738) +(@OGUID+790 , 181017, 530, 1, 1, 4125.446, 3068.064, 345.6248, 3.525572, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3738) +(@OGUID+791 , 181016, 1, 1, 1, 7867.43, -2562.63, 486.946, 6.003934, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 656) +(@OGUID+792 , 181016, 1, 1, 1, 7942.2, -2640.05, 492.378, 1.919862, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 656) +(@OGUID+793 , 181016, 1, 1, 1, 7925.89, -2636.76, 492.584, 1.047198, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 656) +(@OGUID+794 , 181016, 1, 1, 1, 7942.56, -2571.39, 488.843, 4.939284, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 656) +(@OGUID+795 , 181016, 1, 1, 1, 7938.42, -2585.05, 488.907, 0.5934101, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 656) +(@OGUID+796 , 181016, 1, 1, 1, 7910.97, -2575.69, 488.582, 1.989672, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 656) +(@OGUID+797 , 181016, 1, 1, 1, 7915.88, -2561.99, 488.201, 2.949595, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 656) +(@OGUID+798 , 181016, 1, 1, 1, 7912.61, -2504.64, 489.276, 2.705255, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 656) +(@OGUID+799 , 181016, 1, 1, 1, 7862.59, -2495.27, 489.275, 5.550147, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 2361) +(@OGUID+800 , 181016, 1, 1, 1, 7910.7, -2488.95, 489.272, 3.769912, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 2361) +(@OGUID+801 , 181016, 1, 1, 1, 7864, -2510.33, 489.275, 0.9250238, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 2361) +(@OGUID+802 , 181016, 1, 1, 1, 7821.1, -2479.85, 486.84, 6.248279, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 2361) +(@OGUID+803 , 181016, 1, 1, 1, 7790.67, -2422.31, 488.341, 5.358162, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 2361) +(@OGUID+804 , 181016, 1, 1, 1, 7477.78, -2130.38, 492.102, 2.321287, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+805 , 181016, 571, 1, 1, 5843.04, 581.1298, 651.76, 2.775069, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+806 , 181016, 571, 1, 1, 5797.108, 551.8475, 661.095, 0.5759573, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+807 , 181016, 571, 1, 1, 5763.885, 572.2188, 649.8002, 0.9424766, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+808 , 181016, 571, 1, 1, 5803.461, 547.2244, 660.9998, 1.308995, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+809 , 181016, 571, 1, 1, 5789.479, 641.6511, 647.4436, 0.6283169, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+810 , 181016, 571, 1, 1, 5864.823, 610.4653, 650.7043, 1.745327, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+811 , 181016, 571, 1, 1, 5745.615, 586.7101, 649.3102, 0.9250238, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+812 , 181016, 571, 1, 1, 5839.251, 641.2769, 647.5121, 0.2792516, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+813 , 181016, 571, 1, 1, 5761.894, 592.8934, 613.7905, 0.8901166, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+814 , 181016, 571, 1, 1, 5776.402, 530.3011, 641.5594, 0.7504908, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+815 , 181016, 571, 1, 1, 5807.717, 654.8577, 647.4246, 5.427975, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+816 , 181016, 571, 1, 1, 5846.925, 644.6152, 658.404, 2.722713, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+817 , 181016, 571, 1, 1, 5748.025, 626.0618, 660.9924, 0.7155849, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+818 , 181016, 571, 1, 1, 5825.186, 655.9732, 647.5557, 4.223697, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+819 , 181016, 571, 1, 1, 5735.165, 606.0434, 647.9391, 1.518436, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+820 , 181016, 571, 1, 1, 5743.978, 624.6772, 648.4809, 3.543024, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+821 , 181016, 571, 1, 1, 5845.924, 652.1758, 658.404, 3.560473, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+822 , 181016, 571, 1, 1, 5746.787, 636.5056, 660.9924, 5.916668, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+823 , 181016, 571, 1, 1, 5833.373, 645.4617, 609.1575, 2.530723, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+824 , 181016, 571, 1, 1, 5822.227, 502.8376, 657.378, 4.66003, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+825 , 181016, 571, 1, 1, 5840.909, 508.295, 657.4862, 4.694937, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+826 , 181016, 571, 1, 1, 5898.554, 629.4965, 646.7423, 0.8552105, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+827 , 181016, 571, 1, 1, 5796.696, 707.4605, 641.7041, 1.762782, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4739) +(@OGUID+828 , 181016, 571, 1, 1, 5805.41, 708.4702, 641.4802, 1.675514, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4739) +(@OGUID+829 , 181016, 571, 1, 1, 5751.683, 681.7147, 613.2468, 5.567601, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4739) +(@OGUID+830 , 181016, 571, 1, 1, 5750.272, 691.2866, 618.5539, 5.375615, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4739) +(@OGUID+831 , 181016, 571, 1, 1, 5845.667, 696.0077, 610.6929, 4.153885, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4739) +(@OGUID+832 , 181016, 571, 1, 1, 5867.476, 689.2825, 643.1117, 4.049168, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4739) +(@OGUID+833 , 181016, 571, 1, 1, 5734.079, 690.025, 646.5366, 3.176533, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4739) +(@OGUID+834 , 181016, 571, 1, 1, 5826.764, 723.2586, 641.2166, 3.979355, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4613) +(@OGUID+835 , 181016, 571, 1, 1, 5904.524, 663.1807, 643.8438, 4.06662, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4739) +(@OGUID+836 , 181016, 571, 1, 1, 5773.907, 718.0335, 618.5657, 5.67232, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4739) +(@OGUID+837 , 181016, 571, 1, 1, 5756.162, 712.4989, 618.5643, 5.585054, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4739) +(@OGUID+838 , 181016, 571, 1, 1, 5771.891, 737.5848, 641.4211, 5.567601, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4739) +(@OGUID+839 , 181016, 571, 1, 1, 5914.837, 700.7205, 641.8951, 2.879789, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4739) +(@OGUID+840 , 181016, 571, 1, 1, 5823.329, 760.0555, 640.327, 4.258607, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4739) +(@OGUID+841 , 181016, 571, 1, 1, 5882.65, 517.4098, 641.9064, 5.427975, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4613) +(@OGUID+842 , 181016, 571, 1, 1, 5886.956, 526.6721, 642.1017, 2.146753, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4613) +(@OGUID+843 , 181016, 571, 1, 1, 5921.778, 619.2034, 645.9958, 1.937312, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4613) +(@OGUID+844 , 181016, 571, 1, 1, 5890.065, 519.4915, 641.9147, 4.188792, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4613) +(@OGUID+845 , 181016, 571, 1, 1, 5694.438, 614.2162, 646.6755, 0.5235979, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4613) +(@OGUID+846 , 181016, 571, 1, 1, 5676.881, 659.645, 647.1504, 0.157079, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4613) +(@OGUID+847 , 181016, 571, 1, 1, 5648.303, 675.3729, 651.9927, 2.670348, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4568) +(@OGUID+848 , 181016, 571, 1, 1, 5663.514, 682.673, 651.9452, 4.991644, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4568) +(@OGUID+849 , 181016, 571, 1, 1, 5663.002, 663.5723, 654.331, 0.3316107, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4568) +(@OGUID+850 , 181016, 571, 1, 1, 5673.695, 687.83, 654.3299, 4.834563, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4568) +(@OGUID+851 , 181016, 571, 1, 1, 5685.707, 679.8306, 646.3728, 5.393069, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4568) +(@OGUID+852 , 181016, 571, 1, 1, 5659.298, 673.91, 651.942, 0.1919852, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4568) +(@OGUID+853 , 181016, 571, 1, 1, 5654.433, 690.0082, 651.9927, 2.757613, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4568) +(@OGUID+854 , 181016, 571, 1, 1, 5668.66, 718.72, 653.374, 0.3665176, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4568) +(@OGUID+855 , 181016, 571, 1, 1, 5677.676, 730.4684, 653.3763, 4.380776, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4568) +(@OGUID+856 , 181016, 571, 1, 1, 5630.848, 705.8953, 651.9803, 5.096362, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4568) +(@OGUID+857 , 181016, 571, 1, 1, 5620.479, 681.7556, 651.9917, 0.03490625, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4568) +(@OGUID+858 , 181016, 571, 1, 1, 5704.065, 734.105, 641.7964, 0.8377575, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4568) +(@OGUID+859 , 181016, 571, 1, 1, 5716.991, 723.6447, 641.6827, 0.9075702, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4568) +(@OGUID+860 , 181016, 571, 1, 1, 5710.433, 728.6938, 641.7766, 0.8552105, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4568) +(@OGUID+861 , 181016, 571, 1, 1, 5739.42, 737.81, 656.8243, 3.874631, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4568) +(@OGUID+862 , 181016, 571, 1, 1, 5642.215, 754.7111, 641.5667, 3.961899, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4568) +(@OGUID+863 , 181016, 571, 1, 1, 5740.807, 738.6092, 641.7399, 3.159062, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4568) +(@OGUID+864 , 181016, 571, 1, 1, 5726.913, 764.369, 644.1921, 4.782203, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4568) +(@OGUID+865 , 181016, 571, 1, 1, 5787.012, 774.6193, 661.2783, 4.380776, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4740) +(@OGUID+866 , 181016, 571, 1, 1, 5803.736, 772.4315, 661.2783, 4.468043, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4740) +(@OGUID+867 , 181016, 571, 1, 1, 5808.237, 791.7759, 632.587, 5.515242, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4740) +(@OGUID+868 , 181016, 571, 1, 1, 5892.815, 743.408, 639.8414, 4.729844, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4613) +(@OGUID+869 , 181016, 571, 1, 1, 5929.599, 639.7736, 645.5601, 3.647741, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4613) +(@OGUID+870 , 181016, 571, 1, 1, 5943.547, 636.654, 652.9702, 3.246347, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4613) +(@OGUID+871 , 181016, 571, 1, 1, 5947.679, 626.1014, 650.5775, 3.438303, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4613) +(@OGUID+872 , 181016, 571, 1, 1, 5934.438, 611.9415, 652.9656, 2.007128, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4613) +(@OGUID+873 , 181016, 571, 1, 1, 5944.347, 617.7059, 650.5828, 2.111848, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4613) +(@OGUID+874 , 181016, 571, 1, 1, 5958.763, 626.1614, 650.6269, 5.98648, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4613) +(@OGUID+875 , 181016, 571, 1, 1, 5953.268, 610.4814, 650.6269, 5.951575, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4613) +(@OGUID+876 , 181016, 571, 1, 1, 5978.208, 595.1833, 650.6149, 2.076939, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4618) +(@OGUID+877 , 181016, 571, 1, 1, 5988.101, 621.1797, 650.6269, 3.490667, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4618) +(@OGUID+878 , 181016, 571, 1, 1, 5845.724, 435.9962, 657.6264, 2.740162, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4616) +(@OGUID+879 , 181016, 571, 1, 1, 5788.177, 425.141, 657.5775, 0.7504908, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4564) +(@OGUID+880 , 181016, 571, 1, 1, 6675.403, -194.668, 951.2613, 3.787367, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4428) +(@OGUID+881 , 181016, 571, 1, 1, 6677.512, -203.657, 951.2575, 2.722713, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4428) +(@OGUID+882 , 181016, 571, 1, 1, 6664.053, -252.1919, 962.2114, 4.433136, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4428) +(@OGUID+883 , 181016, 571, 1, 1, 6195.851, -1050.231, 410.5798, 2.757613, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4419) +(@OGUID+884 , 181016, 571, 1, 1, 6128.463, -1071.167, 402.915, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4419) +(@OGUID+885 , 181016, 571, 1, 1, 6143.565, -1062.889, 402.4637, 3.909541, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4419) +(@OGUID+886 , 181016, 571, 1, 1, 6181.414, -1060.371, 410.6938, 1.343901, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4419) +(@OGUID+887 , 181016, 571, 1, 1, 6132.971, -1080.292, 402.5479, 3.211419, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4419) +(@OGUID+888 , 181016, 571, 1, 1, 6105.885, -1064.441, 403.3065, 5.759588, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4419) +(@OGUID+889 , 181016, 571, 1, 1, 6104.259, -1076.63, 403.506, 1.53589, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4419) +(@OGUID+890 , 181016, 571, 1, 1, 5221.921, -1337.251, 241.8586, 5.253442, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+891 , 181016, 571, 1, 1, 5235.554, -1320.319, 242.1471, 6.073746, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+892 , 181016, 571, 1, 1, 5233.944, -1309.333, 242.7248, 0.2617982, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+893 , 181016, 571, 1, 1, 5209.904, -1336.67, 242.6071, 4.572764, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+894 , 181016, 571, 1, 1, 5228.022, -1298.785, 242.8026, 0.7504908, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+895 , 181016, 571, 1, 1, 5197.744, -1301.545, 244.1698, 5.602507, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+896 , 181016, 571, 1, 1, 5170.655, -2175.094, 236.524, 3.979355, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+897 , 181016, 571, 1, 1, 5174.28, -2190.904, 236.5399, 3.159062, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+898 , 181016, 571, 1, 1, 5196.799, -2208.144, 239.3988, 2.932139, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+899 , 181016, 571, 1, 1, 5135.955, -2183.239, 236.8366, 5.689774, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+900 , 181016, 571, 1, 1, 5135.756, -2204.338, 236.5436, 0.383971, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+901 , 181016, 571, 1, 1, 5153.606, -2216.569, 236.805, 1.919862, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+902 , 181016, 571, 1, 1, 5190.787, -2215.081, 239.3982, 2.495818, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+903 , 181016, 571, 1, 1, 5382.32, -2632.782, 303.9539, 0.087266, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+904 , 181016, 571, 1, 1, 5408.356, -2679.761, 303.9539, 1.012289, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+905 , 181016, 571, 1, 1, 5406.375, -2612.042, 303.9539, 3.194002, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+906 , 181016, 571, 1, 1, 5436.389, -2618.382, 306.5511, 5.567601, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+907 , 181016, 571, 1, 1, 5464.559, -2619.046, 306.5511, 3.717554, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4275) +(@OGUID+908 , 181016, 571, 1, 1, 5500.086, -2657.195, 303.9539, 6.126106, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4275) +(@OGUID+909 , 181016, 571, 1, 1, 5526.226, -2674.84, 303.9539, 2.513274, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4275) +(@OGUID+910 , 181016, 571, 1, 1, 5528.214, -2651.125, 303.9539, 2.775069, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4275) +(@OGUID+911 , 181016, 571, 1, 1, 5527.774, -2637.863, 303.9539, 3.106652, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4275) +(@OGUID+912 , 181016, 571, 1, 1, 5750.8, -3535.454, 389.0267, 5.532695, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4324) +(@OGUID+913 , 181016, 571, 1, 1, 5764.8, -3532.155, 388.3556, 4.450591, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4324) +(@OGUID+914 , 181016, 571, 1, 1, 5789.338, -3595.79, 388.8241, 2.967041, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4324) +(@OGUID+915 , 181016, 571, 1, 1, 5783.694, -3600.81, 387.7156, 2.35619, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4324) +(@OGUID+916 , 181016, 571, 1, 1, 5758.551, -3620.203, 385.8352, 0.6632232, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4324) +(@OGUID+917 , 181016, 571, 1, 1, 5774.17, -3614.33, 387.6901, 3.316144, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4324) +(@OGUID+918 , 181016, 571, 1, 1, 5794.01, -3586.305, 388.6537, 2.495818, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4324) +(@OGUID+919 , 181016, 571, 1, 1, 5790.555, -3548.062, 387.1112, 3.735006, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4323) +(@OGUID+920 , 181016, 571, 1, 1, 4604.299, -4216.11, 178.7165, 3.909541, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+921 , 181016, 571, 1, 1, 4578.913, -4263.682, 182.0264, 1.221729, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4159) +(@OGUID+922 , 181016, 571, 1, 1, 4585.377, -4225.431, 178.0588, 2.548179, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4159) +(@OGUID+923 , 181016, 571, 1, 1, 4574.175, -4252.902, 182.2079, 0.1919852, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4159) +(@OGUID+924 , 181016, 571, 1, 1, 4544.073, -4208.386, 170.6733, 4.694937, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4159) +(@OGUID+925 , 181016, 571, 1, 1, 4554.03, -4232.887, 170.6884, 2.740162, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4159) +(@OGUID+926 , 181016, 571, 1, 1, 4550.191, -4182.836, 173.4989, 1.518436, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4159) +(@OGUID+927 , 181016, 571, 1, 1, 4549.178, -4253.708, 170.7494, 2.076939, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4159) +(@OGUID+928 , 181016, 571, 1, 1, 4531.979, -4176.561, 173.4836, 6.178466, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4159) +(@OGUID+929 , 181016, 571, 1, 1, 3854.53, -4499.983, 208.0386, 2.82743, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4205) +(@OGUID+930 , 181016, 571, 1, 1, 3883.566, -4522.057, 217.378, 2.635444, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4205) +(@OGUID+931 , 181016, 571, 1, 1, 3848.002, -4506.846, 207.7856, 1.867502, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+932 , 181016, 571, 1, 1, 3844.868, -4517.594, 210.5048, 5.323256, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+933 , 181016, 571, 1, 1, 3866.024, -4531.325, 209.7259, 3.33359, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+934 , 181016, 571, 1, 1, 3835.15, -4527.149, 210.6371, 5.742135, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+935 , 181016, 571, 1, 1, 3871.145, -4567.245, 207.5447, 5.619962, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+936 , 181016, 571, 1, 1, 3847.246, -4556.365, 210.1268, 0.8377575, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+937 , 181016, 571, 1, 1, 3413.37, -2812.231, 200.4576, 5.078908, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+938 , 181016, 571, 1, 1, 3432.563, -2829.036, 201.7036, 1.97222, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+939 , 181016, 571, 1, 1, 3414.616, -2778.184, 201.5204, 5.201083, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+940 , 181016, 571, 1, 1, 3428.656, -2766.984, 200.3678, 2.251473, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+941 , 181016, 571, 1, 1, 3457.128, -2785.357, 201.2523, 0.1745321, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+942 , 181016, 571, 1, 1, 3452.198, -2755.466, 199.3946, 3.298687, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4204) +(@OGUID+943 , 181016, 571, 1, 1, 3441.72, -2747.261, 199.3887, 4.799657, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4204) +(@OGUID+944 , 181016, 571, 1, 1, 3302.054, -2350.771, 108.8892, 2.076939, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+945 , 181016, 571, 1, 1, 3316.353, -2328.825, 111.0914, 2.565632, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+946 , 181016, 571, 1, 1, 3225.829, -2298.399, 107.2934, 0.8377575, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+947 , 181016, 571, 1, 1, 3267.523, -2271.925, 114.2197, 2.199115, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4248) +(@OGUID+948 , 181016, 571, 1, 1, 3237.112, -2271.502, 113.9172, 1.605702, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4248) +(@OGUID+949 , 181016, 571, 1, 1, 3344.212, -2203.41, 119.4523, 0.3316107, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4206) +(@OGUID+950 , 181016, 571, 1, 1, 3294.673, -2261.47, 111.9283, 3.926996, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4206) +(@OGUID+951 , 181016, 571, 1, 1, 3323.304, -2296.872, 110.1093, 2.460913, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4206) +(@OGUID+952 , 181016, 571, 1, 1, 3308.395, -2221.642, 115.808, 5.550147, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4206) +(@OGUID+953 , 181016, 571, 1, 1, 3352.523, -2221.079, 119.4523, 0.4014249, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4206) +(@OGUID+954 , 181016, 571, 1, 1, 3268.585, -2230.661, 116.8297, 3.804818, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4206) +(@OGUID+955 , 181016, 571, 1, 1, 3286.429, -2201.523, 117.3726, 3.839725, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4206) +(@OGUID+956 , 181016, 571, 1, 1, 3248.892, -2223.04, 116.8297, 4.799657, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4206) +(@OGUID+957 , 181016, 571, 1, 1, 3184.458, -2253.973, 114.8628, 2.408554, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4206) +(@OGUID+958 , 181016, 571, 1, 1, 3183.712, -2235.236, 114.8628, 3.926996, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4206) +(@OGUID+959 , 181016, 571, 1, 1, 3093.765, -2252.836, 97.05368, 3.490667, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+960 , 181016, 571, 1, 1, 2549.787, -1992.145, 8.439572, 4.66003, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4242) +(@OGUID+961 , 181016, 571, 1, 1, 2538.165, -1999.59, 8.439572, 5.742135, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4242) +(@OGUID+962 , 181016, 571, 1, 1, 2554.446, -1931.769, 3.000129, 2.565632, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4242) +(@OGUID+963 , 181016, 571, 1, 1, 2493.727, -1921.882, 10.72953, 0.1919852, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4242) +(@OGUID+964 , 181016, 571, 1, 1, 2503.962, -1936.449, 10.39561, 1.012289, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4242) +(@OGUID+965 , 181016, 571, 1, 1, 2553.7, -1912.366, 2.313859, 3.804818, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4242) +(@OGUID+966 , 181016, 571, 1, 1, 2485.413, -1882.31, 9.955285, 5.881761, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4242) +(@OGUID+967 , 181016, 571, 1, 1, 2485.737, -1895.543, 10.02251, 0.5061446, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4242) +(@OGUID+968 , 181016, 571, 1, 1, 2559.23, -1828.403, 10.51216, 2.321287, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4242) +(@OGUID+969 , 181016, 571, 1, 1, 2546.487, -1837.444, 10.57294, 1.954769, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4242) +(@OGUID+970 , 181016, 571, 1, 1, 2600.053, -1802.445, 10.64246, 1.134463, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4242) +(@OGUID+971 , 181016, 571, 1, 1, 2595.78, -1789.134, 10.64246, 5.585054, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4242) +(@OGUID+972 , 181016, 571, 1, 1, 2491.829, -1845.16, 10.7064, 5.654869, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4242) +(@OGUID+973 , 181016, 571, 1, 1, 2497.92, -1838.303, 10.55219, 5.323256, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4242) +(@OGUID+974 , 181016, 571, 1, 1, 2438.875, -1853.441, 1.204814, 0.2443456, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4242) +(@OGUID+975 , 181016, 571, 1, 1, 2444.651, -1838.691, 1.022343, 5.131269, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4242) +(@OGUID+976 , 181016, 571, 1, 1, 2117.118, -2965.382, 148.6169, 4.031712, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4070) +(@OGUID+977 , 181016, 571, 1, 1, 2109.816, -2988.45, 148.3804, 2.18166, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4070) +(@OGUID+978 , 181016, 571, 1, 1, 2140.401, -2968.399, 148.3356, 4.433136, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+979 , 181016, 571, 1, 1, 2142.096, -2984.892, 148.9165, 1.937312, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+980 , 181016, 571, 1, 1, 1435.889, -3265.063, 178.2813, 0.1396245, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3998) +(@OGUID+981 , 181016, 571, 1, 1, 1394.399, -3307.07, 166.7923, 1.902409, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3998) +(@OGUID+982 , 181016, 571, 1, 1, 1428.256, -3256.8, 165.615, 2.199115, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3998) +(@OGUID+983 , 181016, 571, 1, 1, 1408.13, -3251.247, 162.0143, 3.787367, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3998) +(@OGUID+984 , 181016, 571, 1, 1, 1401.351, -3262.329, 163.0069, 2.251473, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3998) +(@OGUID+985 , 181016, 571, 1, 1, 1370.036, -3334.958, 173.685, 4.852017, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3998) +(@OGUID+986 , 181016, 571, 1, 1, 1458.753, -3200.1, 165.5917, 3.054327, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4380) +(@OGUID+987 , 181016, 571, 1, 1, 1341.442, -3276.221, 174.6177, 4.537859, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4380) +(@OGUID+988 , 181016, 571, 1, 1, 1352.596, -3284.401, 174.7101, 3.508117, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4380) +(@OGUID+989 , 181016, 571, 1, 1, 1349.468, -3297.907, 174.7129, 2.460913, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4380) +(@OGUID+990 , 181016, 571, 1, 1, 1371.299, -3185.653, 162.8225, 2.111848, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4380) +(@OGUID+991 , 181016, 571, 1, 1, 1355.771, -3193.905, 162.8225, 2.024579, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3998) +(@OGUID+992 , 181016, 571, 1, 1, 1400.156, -3458.59, 174.5718, 2.234018, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3998) +(@OGUID+993 , 181016, 571, 1, 1, 1351.665, -3457.366, 175.9246, 1.675514, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3998) +(@OGUID+994 , 181016, 571, 1, 1, 1431.132, -3152.292, 164.8159, 3.560473, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4071) +(@OGUID+995 , 181016, 571, 1, 1, 1429.037, -3131.07, 167.7346, 3.543024, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3998) +(@OGUID+996 , 181016, 571, 1, 1, 1416.06, -3120.286, 167.5702, 4.34587, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3998) +(@OGUID+997 , 181016, 571, 1, 1, 1389.093, -3096.109, 167.4995, 3.700105, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3998) +(@OGUID+998 , 181016, 571, 1, 1, 765.1684, -2962.793, 9.955372, 6.021387, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3987) +(@OGUID+999 , 181016, 571, 1, 1, 784.9827, -2956.3, 8.627842, 4.171338, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3987) +(@OGUID+1000, 181016, 571, 1, 1, 731.5729, -2945.844, 9.658432, 0.5585039, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3987) +(@OGUID+1001, 181016, 571, 1, 1, 807.6268, -2945.674, 6.90544, 1.675514, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3987) +(@OGUID+1002, 181016, 571, 1, 1, 728.2534, -2936.78, 8.08532, 0.9773831, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3987) +(@OGUID+1003, 181016, 571, 1, 1, 726.3077, -2921.696, 7.548036, 6.073746, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3987) +(@OGUID+1004, 181016, 571, 1, 1, 811.6979, -2925.72, 7.491168, 3.47321, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3987) +(@OGUID+1005, 181016, 571, 1, 1, 738.8159, -2917.706, 7.83575, 5.777041, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3987) +(@OGUID+1006, 181016, 571, 1, 1, 708.9809, -2939.207, -3.255977, 2.722713, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3987) +(@OGUID+1007, 181016, 571, 1, 1, 733.0174, -2896.646, 7.161568, 5.742135, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3987) +(@OGUID+1008, 181016, 571, 1, 1, 786.5696, -2895.316, 7.331877, 2.652894, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3987) +(@OGUID+1009, 181016, 571, 1, 1, 706.6024, -2924.741, -3.165701, 3.996807, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3987) +(@OGUID+1010, 181016, 571, 1, 1, 785.3965, -2856.019, 4.484005, 4.415683, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3988) +(@OGUID+1011, 181016, 571, 1, 1, 775.6638, -2854.298, 4.683801, 4.607672, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3988) +(@OGUID+1012, 181016, 571, 1, 1, 785.8663, -2882.146, 4.527083, 3.979355, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3988) +(@OGUID+1013, 181016, 571, 1, 1, 400.0066, -4535.086, 246.1532, 4.258607, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3991) +(@OGUID+1014, 181016, 571, 1, 1, 404.2422, -4538.7, 245.8211, 3.769912, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3991) +(@OGUID+1015, 181016, 571, 1, 1, 434.1599, -4539.468, 245.8032, 2.967041, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3991) +(@OGUID+1016, 181016, 571, 1, 1, 446.3067, -4559.884, 245.5032, 4.363324, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3991) +(@OGUID+1017, 181016, 571, 1, 1, 403.795, -4652.395, 243.9677, 2.18166, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3991) +(@OGUID+1018, 181016, 571, 1, 1, 412.7631, -4658.49, 246.6353, 0.3490652, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3991) +(@OGUID+1019, 181016, 571, 1, 1, 493.6993, -4605.006, 243.6478, 3.316144, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3991) +(@OGUID+1020, 181016, 571, 1, 1, 584.0461, -4934.744, 29.65519, 1.029743, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3981) +(@OGUID+1021, 181016, 571, 1, 1, 577.2066, -4954.415, 18.2157, 3.106652, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3981) +(@OGUID+1022, 181016, 571, 1, 1, 569.7136, -4931.643, 17.79272, 3.33359, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3981) +(@OGUID+1023, 181016, 571, 1, 1, 569.194, -5003.27, 11.0998, 2.949595, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3981) +(@OGUID+1024, 181016, 571, 1, 1, 540.1192, -4999.92, 10.53384, 4.782203, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4379) +(@OGUID+1025, 181016, 571, 1, 1, 563.828, -5017.783, 11.59005, 2.076939, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4379) +(@OGUID+1026, 181016, 571, 1, 1, 575.377, -5101.069, 5.191134, 0.6981314, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3981) +(@OGUID+1027, 181016, 571, 1, 1, 641.0491, -5019.355, 4.459393, 3.211419, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3981) +(@OGUID+1028, 181016, 571, 1, 1, 604.1622, -5108.14, 4.842274, 1.623156, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3981) +(@OGUID+1029, 181016, 571, 1, 1, 1882.581, -6170.531, 23.82956, 0.8377575, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4000) +(@OGUID+1030, 181016, 571, 1, 1, 1899.31, -6178.332, 24.02914, 1.151916, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4000) +(@OGUID+1031, 181016, 571, 1, 1, 1919.915, -6182.599, 24.47692, 1.727875, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4000) +(@OGUID+1032, 181016, 571, 1, 1, 1927.329, -6186.836, 24.11248, 1.727875, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4000) +(@OGUID+1033, 181016, 571, 1, 1, 2021.995, -6214.678, 7.750907, 2.094393, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4000) +(@OGUID+1034, 181016, 571, 1, 1, 2429.847, -5168.776, 277.1109, 1.291542, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4003) +(@OGUID+1035, 181016, 571, 1, 1, 2429.503, -5159.25, 277.0016, 5.061456, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4003) +(@OGUID+1036, 181016, 571, 1, 1, 2417.962, -5122.142, 276.594, 5.270896, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4003) +(@OGUID+1037, 181016, 571, 1, 1, 2438.945, -5120.976, 275.9086, 2.408554, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4003) +(@OGUID+1038, 181016, 571, 1, 1, 2476.26, -5072.812, 283.0372, 3.804818, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4003) +(@OGUID+1039, 181016, 571, 1, 1, 2422.845, -5074.851, 272.2427, 0, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4003) +(@OGUID+1040, 181016, 571, 1, 1, 2462.827, -5023.975, 283.7139, 5.410522, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4003) +(@OGUID+1041, 181016, 571, 1, 1, 2464.117, -5036.913, 283.7561, 0.7330382, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4003) +(@OGUID+1042, 181016, 571, 1, 1, 2657.285, -4403.338, 283.9217, 1.500983, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1043, 181016, 571, 1, 1, 2681.398, -4378.912, 282.9612, 1.989672, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1044, 181016, 571, 1, 1, 2642.45, -4384.394, 283.2693, 6.03884, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1045, 181016, 571, 1, 1, 2654.31, -4365.038, 277.5075, 2.495818, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1046, 181016, 571, 1, 1, 2681.611, -4385.324, 284.4337, 4.555311, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1047, 181016, 571, 1, 1, 2675.206, -4331.749, 289.7764, 0.8203033, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1048, 181016, 571, 1, 1, 2620.654, -4361.461, 276.4902, 5.602507, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1049, 181016, 571, 1, 1, 3296.599, -736.467, 176.1194, 4.031712, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1050, 181016, 571, 1, 1, 3260.281, -749.4948, 168.42, 1.117009, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1051, 181016, 571, 1, 1, 3309.448, -746.7072, 179.006, 3.892087, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1052, 181016, 571, 1, 1, 3274.188, -755.2222, 168.0432, 2.286379, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1053, 181016, 571, 1, 1, 3261.053, -755.9268, 174.2897, 1.117009, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1054, 181016, 571, 1, 1, 3266.31, -712.2863, 172.5281, 4.450591, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4232) +(@OGUID+1055, 181016, 571, 1, 1, 3270.005, -719.1215, 168.8549, 3.68265, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4232) +(@OGUID+1056, 181016, 571, 1, 1, 3281.076, -720.5919, 175.8908, 3.68265, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4232) +(@OGUID+1057, 181016, 571, 1, 1, 3257.232, -695.9045, 167.3684, 3.036838, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4232) +(@OGUID+1058, 181016, 571, 1, 1, 3216.764, -730.0927, 173.64, 3.700105, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4232) +(@OGUID+1059, 181016, 571, 1, 1, 3267.798, -689.1566, 173.7582, 3.141593, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4232) +(@OGUID+1060, 181016, 571, 1, 1, 3254.467, -668.7876, 174.1768, 3.787367, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4232) +(@OGUID+1061, 181016, 571, 1, 1, 3235.794, -713.0104, 167.6716, 1.117009, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4232) +(@OGUID+1062, 181016, 571, 1, 1, 3249.678, -674.059, 167.3249, 3.194002, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4232) +(@OGUID+1063, 181016, 571, 1, 1, 3209.856, -708.0291, 173.0501, 0.2792516, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4232) +(@OGUID+1064, 181016, 571, 1, 1, 3215.154, -685.1657, 174.8388, 2.513274, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4232) +(@OGUID+1065, 181016, 571, 1, 1, 3216.414, -654.4945, 173.1659, 0.8203033, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4232) +(@OGUID+1066, 181016, 571, 1, 1, 3201.649, -673.1436, 172.2877, 2.565632, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4186) +(@OGUID+1067, 181016, 571, 1, 1, 3202.44, -689.5214, 171.9362, 0.8901166, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4186) +(@OGUID+1068, 181016, 571, 1, 1, 3632.087, -711.0179, 214.2405, 4.293513, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1069, 181016, 571, 1, 1, 3658.59, -706.5002, 224.446, 3.490667, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1070, 181016, 571, 1, 1, 3674.527, -739.8177, 213.8958, 0.9948372, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1071, 181016, 571, 1, 1, 3649.295, -702.2972, 215.0318, 6.19592, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1072, 181016, 571, 1, 1, 3676.882, -702.1511, 214.3667, 5.427975, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1073, 181016, 571, 1, 1, 3704.834, -687.1371, 215.5728, 5.148723, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1074, 181016, 571, 1, 1, 3698.531, -714.2257, 214.151, 3.141593, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1075, 181016, 571, 1, 1, 3697.376, -742.7101, 213.797, 2.111848, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1076, 181016, 571, 1, 1, 3716.316, -708.1945, 215.473, 2.268925, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1077, 181016, 571, 1, 1, 3749.342, -769.8768, 197.4349, 0.7504908, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1078, 181016, 571, 1, 1, 3781.028, -803.4545, 197.2077, 0.9424766, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1079, 181016, 571, 1, 1, 3794.07, -804.0314, 197.3381, 2.146753, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1080, 181016, 571, 1, 1, 3826.776, -685.0971, 223.0013, 5.235988, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1081, 181016, 571, 1, 1, 3803.82, -793.8429, 197.2356, 2.251473, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1082, 181016, 571, 1, 1, 3843.911, -763.369, 219.3806, 1.466076, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1083, 181016, 571, 1, 1, 3822.775, -695.2535, 223.0013, 0.1919852, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1084, 181016, 571, 1, 1, 3858.99, -724.03, 221.2304, 3.752462, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1085, 181016, 571, 1, 1, 3862.428, -745.8948, 221.1198, 3.874631, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1086, 181016, 571, 1, 1, 3866.354, -771.1376, 220.3779, 1.169369, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1087, 181016, 571, 1, 1, 3951.355, -780.9128, 244.63, 4.118979, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1088, 181016, 571, 1, 1, 3548.806, 191.4957, 52.29362, 0.1047193, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4254) +(@OGUID+1089, 181016, 571, 1, 1, 3562.132, 193.3676, 52.28502, 3.298687, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4254) +(@OGUID+1090, 181016, 571, 1, 1, 3563.86, 208.5335, 52.2564, 3.106652, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4254) +(@OGUID+1091, 181016, 571, 1, 1, 3604.824, 221.3126, -120.0548, 2.199115, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4254) +(@OGUID+1092, 181016, 571, 1, 1, 3543.596, 229.0154, 116.7898, 0.157079, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4254) +(@OGUID+1093, 181016, 571, 1, 1, 3539.345, 210.2894, 116.8406, 4.834563, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4254) +(@OGUID+1094, 181016, 571, 1, 1, 3576.012, 201.1324, -120.133, 2.286379, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4254) +(@OGUID+1095, 181016, 571, 1, 1, 3542.329, 206.0333, 52.2564, 0.2617982, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4254) +(@OGUID+1096, 181016, 571, 1, 1, 3532.222, 198.4992, -120.1445, 1.500983, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4254) +(@OGUID+1097, 181016, 571, 1, 1, 3565.379, 213.0888, 116.8406, 4.607672, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4254) +(@OGUID+1098, 181016, 571, 1, 1, 3557.755, 230.3309, 116.7897, 3.228859, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4254) +(@OGUID+1099, 181016, 571, 1, 1, 3501.747, 212.1927, -120.1452, 0.5585039, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4254) +(@OGUID+1100, 181016, 571, 1, 1, 3579.191, 264.8907, 117.1309, 2.897245, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1101, 181016, 571, 1, 1, 3520.52, 258.9779, 47.3175, 0.4886912, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1102, 181016, 571, 1, 1, 3535.776, 241.7472, 117.1205, 1.256636, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1103, 181016, 571, 1, 1, 3538.464, 244.5366, 47.31742, 1.291542, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1104, 181016, 571, 1, 1, 3575.862, 264.2621, 47.31741, 2.844883, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1105, 181016, 571, 1, 1, 3565.646, 245.8031, 117.1294, 2.18166, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1106, 181016, 571, 1, 1, 3561.06, 247.0676, 47.31746, 2.076939, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1107, 181016, 571, 1, 1, 3517.434, 257.0187, 117.1313, 0.5061446, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1108, 181016, 571, 1, 1, 3597.307, 271.0546, -120.1526, 0.3490652, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1109, 181016, 571, 1, 1, 3573.319, 287.2054, 47.31745, 3.630291, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1110, 181016, 571, 1, 1, 3477.063, 249.0635, -120.1415, 0.4363316, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1111, 181016, 571, 1, 1, 3613.162, 267.1122, 52.27297, 1.815142, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1112, 181016, 571, 1, 1, 3518.373, 281.8263, 47.31754, 5.98648, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1113, 181016, 571, 1, 1, 3483.588, 254.1247, 52.26856, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1114, 181016, 571, 1, 1, 3480.771, 279.4473, 52.26998, 4.939284, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1115, 181016, 571, 1, 1, 3463.682, 274.7737, 52.29326, 4.886924, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1116, 181016, 571, 1, 1, 3559.003, 305.3416, 117.1257, 4.32842, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1117, 181016, 571, 1, 1, 3576.934, 290.0081, 117.1281, 3.647741, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1118, 181016, 571, 1, 1, 3610.144, 292.3628, 52.27081, 4.694937, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1119, 181016, 571, 1, 1, 3532.95, 299.9154, 47.31733, 5.183629, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1120, 181016, 571, 1, 1, 3514.207, 282.3757, 117.1297, 6.003934, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1121, 181016, 571, 1, 1, 3527.995, 301.947, 117.1261, 5.288348, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1122, 181016, 571, 1, 1, 3628.7, 289.4008, 52.28633, 4.81711, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1123, 181016, 571, 1, 1, 3555.46, 301.8236, 47.3174, 4.415683, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1124, 181016, 571, 1, 1, 3466.395, 254.6163, 52.29464, 1.675514, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1125, 181016, 571, 1, 1, 3630.185, 272.4107, 52.28997, 1.797689, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1126, 181016, 571, 1, 1, 3595.918, 285.1813, -120.1526, 5.916668, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1127, 181016, 571, 1, 1, 3535.763, 316.0141, 116.7898, 0.03490625, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1128, 181016, 571, 1, 1, 3646.115, 260.8871, 52.25636, 0.6806767, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1129, 181016, 571, 1, 1, 3471.14, 281.1834, -120.1448, 5.881761, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1130, 181016, 571, 1, 1, 3549.406, 317.3907, 116.7898, 3.281239, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1131, 181016, 571, 1, 1, 3592.655, 332.8689, -120.1448, 4.310966, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1132, 181016, 571, 1, 1, 3546.336, 351.4997, 52.27733, 3.368496, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1133, 181016, 571, 1, 1, 3551.697, 340.1284, 52.2564, 3.403396, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1134, 181016, 571, 1, 1, 3562.234, 345.9385, -120.1445, 4.01426, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1135, 181016, 571, 1, 1, 3515.109, 342.4366, -120.1445, 5.375615, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1136, 181016, 571, 1, 1, 3527.488, 332.789, 116.7998, 1.675514, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1137, 181016, 571, 1, 1, 3531.985, 349.9049, 52.27657, 0.01745246, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1138, 181016, 571, 1, 1, 3492.134, 322.4423, -120.1445, 5.270896, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1139, 181016, 571, 1, 1, 3530.838, 337.9557, 52.25639, 6.19592, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1140, 181016, 571, 1, 1, 3553.869, 335.9773, 116.7962, 1.710422, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1141, 181016, 571, 1, 1, 3656.756, 292.7126, -120.1445, 5.98648, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1142, 181016, 571, 1, 1, 3639.994, 308.4146, 52.25637, 5.724681, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1143, 181016, 571, 1, 1, 3658.891, 275.3087, -120.1445, 0.9075702, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1144, 181016, 571, 1, 1, 3675.714, 259.1941, 52.25635, 6.126106, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1145, 181016, 571, 1, 1, 3833.705, 1420.332, 90.87871, 4.904376, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1146, 181016, 571, 1, 1, 3838.928, 1434.694, 90.64106, 5.375615, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1147, 181016, 571, 1, 1, 3847.046, 1434.552, 90.64103, 4.450591, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1148, 181016, 571, 1, 1, 3852.562, 1420.469, 90.91337, 4.24115, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1149, 181016, 571, 1, 1, 3826.221, 1467.968, 91.71698, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4165) +(@OGUID+1150, 181016, 571, 1, 1, 3847.981, 1459.16, 91.84016, 0.05235888, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4165) +(@OGUID+1151, 181016, 571, 1, 1, 3856.728, 1468.202, 92.05556, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4165) +(@OGUID+1152, 181016, 571, 1, 1, 3837.253, 1460.372, 91.84299, 3.001947, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4165) +(@OGUID+1153, 181016, 571, 1, 1, 3827.208, 1483.951, 92.06059, 0.05235888, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4165) +(@OGUID+1154, 181016, 571, 1, 1, 3772.201, 1518.562, 87.60015, 3.036838, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1155, 181016, 571, 1, 1, 3826.889, 1531.865, 95.81321, 0.9773831, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1156, 181016, 571, 1, 1, 3805.442, 1540.334, 89.73431, 6.161013, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1157, 181016, 571, 1, 1, 3842.612, 1551.831, 89.72446, 2.199115, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4165) +(@OGUID+1158, 181016, 571, 1, 1, 3869.433, 1563.036, 89.7524, 2.687807, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4165) +(@OGUID+1159, 181016, 571, 1, 1, 3828.599, 1550.87, 89.65501, 1.448622, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4165) +(@OGUID+1160, 181016, 571, 1, 1, 3857.379, 1532.047, 95.73104, 2.007128, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4165) +(@OGUID+1161, 181016, 571, 1, 1, 3856.719, 1587.243, 89.60239, 0.5934101, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4165) +(@OGUID+1162, 181016, 571, 1, 1, 3799.489, 1569.15, 89.72446, 3.612838, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4165) +(@OGUID+1163, 181016, 571, 1, 1, 3763.406, 1539.296, 87.04375, 3.647741, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4165) +(@OGUID+1164, 181016, 571, 1, 1, 3807.621, 1601.288, 89.72446, 2.286379, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4165) +(@OGUID+1165, 181016, 571, 1, 1, 3825.676, 1611.223, 89.72446, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4165) +(@OGUID+1166, 181016, 571, 1, 1, 3873.578, 1603.196, 90.13206, 3.159062, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4165) +(@OGUID+1167, 181016, 571, 1, 1, 3853.099, 1601.293, 89.72446, 0.157079, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4165) +(@OGUID+1168, 181016, 571, 1, 1, 3804.344, 1618.123, 89.31889, 5.131269, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4165) +(@OGUID+1169, 181016, 571, 1, 1, 3781.226, 1617.937, 87.15925, 5.288348, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4165) +(@OGUID+1170, 181016, 571, 1, 1, 3515.828, 1981.839, 64.86245, 2.548179, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4158) +(@OGUID+1171, 181016, 571, 1, 1, 3533.275, 2028.212, 67.83712, 0.2967052, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4158) +(@OGUID+1172, 181016, 571, 1, 1, 3487.095, 1996.391, 64.86275, 3.228859, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4158) +(@OGUID+1173, 181016, 571, 1, 1, 3503.747, 2013.127, 64.86234, 3.403396, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4158) +(@OGUID+1174, 181016, 571, 1, 1, 3463.338, 1991.168, 64.61589, 0.1919852, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4158) +(@OGUID+1175, 181016, 571, 1, 1, 2795.232, 971.2288, 22.84727, 3.787367, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4154) +(@OGUID+1176, 181016, 571, 1, 1, 2784.236, 959.4688, 22.49838, 5.462882, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4154) +(@OGUID+1177, 181016, 571, 1, 1, 2793.773, 931.6573, 22.35705, 5.742135, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1178, 181016, 571, 1, 1, 2772.131, 928.7278, 22.78977, 0.7330382, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1179, 181016, 571, 1, 1, 2781.197, 933.6979, 22.78251, 3.543024, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1180, 181016, 571, 1, 1, 2731.755, 930.2222, 0.360353, 3.33359, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1181, 181016, 571, 1, 1, 2815.472, 918.7995, 20.88776, 3.857183, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1182, 181016, 571, 1, 1, 2801.712, 908.5086, 22.29059, 1.745327, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1183, 181016, 571, 1, 1, 2754.224, 894.7058, 5.906912, 4.76475, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1184, 181016, 571, 1, 1, 2771.326, 914.0045, 22.36399, 5.619962, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1185, 181016, 571, 1, 1, 2787.118, 905.9583, 22.15631, 1.308995, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1186, 181016, 571, 1, 1, 2802.756, 890.1584, 12.88576, 4.97419, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1187, 181016, 571, 1, 1, 2837.893, 884.1483, 15.9367, 2.164206, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1188, 181016, 571, 1, 1, 2720.492, 904.6319, 5.697, 5.93412, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1189, 181016, 571, 1, 1, 2763.372, 862.8993, 6.277842, 5.777041, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1190, 181016, 571, 1, 1, 2722.365, 888.5219, 5.181851, 0.4014249, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1191, 181016, 571, 1, 1, 2743.732, 851.4514, 6.691175, 4.293513, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1192, 181016, 571, 1, 1, 2645.363, 884.6476, 4.748452, 0.5061446, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1193, 181016, 571, 1, 1, 2659.202, 906.3993, 4.293646, 4.852017, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1194, 181016, 571, 1, 1, 2643.082, 897.5799, 4.501051, 6.021387, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1195, 181016, 571, 1, 1, 2663.845, 880.2552, 4.281791, 1.850049, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1196, 181016, 571, 1, 1, 4462.361, 1266.483, 142.2847, 5.009095, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1197, 181016, 571, 1, 1, 4469.088, 1267.642, 141.8956, 4.520406, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1198, 181016, 571, 1, 1, 4528.026, 1252.006, 139.5977, 3.33359, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1199, 181016, 571, 1, 1, 4515.189, 1271.205, 137.7116, 3.909541, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1200, 181016, 571, 1, 1, 4866.249, 1289.011, 222.6894, 3.735006, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4171) +(@OGUID+1201, 181016, 571, 1, 1, 4908.99, 1241.123, 226.8822, 1.431168, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4171) +(@OGUID+1202, 181016, 571, 1, 1, 4896.076, 1252.84, 227.6416, 0.2443456, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4171) +(@OGUID+1203, 181016, 571, 1, 1, 4925.459, 1257.523, 226.8904, 1.326448, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4171) +(@OGUID+1204, 181016, 571, 1, 1, 4919.086, 1318.598, 229.563, 4.188792, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4171) +(@OGUID+1205, 181016, 571, 1, 1, 4950.565, 1309.806, 235.062, 3.368496, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4170) +(@OGUID+1206, 181016, 571, 1, 1, 4948.565, 1174.379, 239.7921, 4.485497, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4170) +(@OGUID+1207, 181016, 571, 1, 1, 4956.751, 1164.542, 239.6501, 4.258607, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4170) +(@OGUID+1208, 181016, 571, 1, 1, 4967.222, 1205.661, 227.3895, 2.548179, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4170) +(@OGUID+1209, 181016, 571, 1, 1, 4958.919, 1196.348, 226.8051, 1.797689, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4170) +(@OGUID+1210, 181016, 571, 1, 1, 4978.83, 1243.004, 227.4904, 2.949595, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4170) +(@OGUID+1211, 181016, 571, 1, 1, 4980.446, 1205.421, 227.7068, 1.117009, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4170) +(@OGUID+1212, 181016, 571, 1, 1, 4986.674, 1189.043, 227.4761, 5.98648, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4170) +(@OGUID+1213, 181016, 571, 1, 1, 5003.663, 1190.19, 227.3823, 2.792518, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4170) +(@OGUID+1214, 181016, 571, 1, 1, 4985.378, 1269.712, 229.3461, 3.246347, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4170) +(@OGUID+1215, 181016, 571, 1, 1, 5019.801, 1236.83, 230.0975, 3.961899, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4170) +(@OGUID+1216, 181016, 571, 1, 1, 4692.931, 1529.158, 261.0022, 5.689774, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4171) +(@OGUID+1217, 181016, 571, 1, 1, 4690.823, 1517.44, 261.1075, 0.03490625, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4171) +(@OGUID+1218, 181016, 571, 1, 1, 3437.819, 4086.14, 17.09811, 1.518436, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4042) +(@OGUID+1219, 181016, 571, 1, 1, 3426.033, 4071.888, 18.0825, 4.01426, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4042) +(@OGUID+1220, 181016, 571, 1, 1, 3409.352, 4091.084, 18.57693, 4.468043, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4042) +(@OGUID+1221, 181016, 571, 1, 1, 3473.787, 4089.247, 17.13011, 3.961899, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4042) +(@OGUID+1222, 181016, 571, 1, 1, 3458.691, 4082.395, 17.32234, 0.4537851, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4042) +(@OGUID+1223, 181016, 571, 1, 1, 3469.884, 4115.7, 16.70656, 3.68265, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4043) +(@OGUID+1224, 181016, 571, 1, 1, 3429.658, 4124.901, 16.82856, 5.253442, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4043) +(@OGUID+1225, 181016, 571, 1, 1, 3419, 4110.042, 17.55773, 6.021387, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4043) +(@OGUID+1226, 181016, 571, 1, 1, 3455.853, 4140.363, 15.27709, 5.235988, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4037) +(@OGUID+1227, 181016, 571, 1, 1, 3468.707, 4138.945, 15.28419, 4.276057, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4037) +(@OGUID+1228, 181016, 571, 1, 1, 3484.245, 4164.788, 17.17531, 1.483528, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4037) +(@OGUID+1229, 181016, 571, 1, 1, 3472.248, 4185.592, 18.24646, 2.775069, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4037) +(@OGUID+1230, 181016, 571, 1, 1, 3460.45, 4186.23, 18.21275, 6.143561, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4037) +(@OGUID+1231, 181016, 571, 1, 1, 3484.917, 4176.376, 17.19302, 4.694937, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4037) +(@OGUID+1232, 181016, 571, 1, 1, 3445, 4178.582, 17.15816, 4.729844, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4037) +(@OGUID+1233, 181016, 571, 1, 1, 3444.581, 4167.645, 17.16287, 1.466076, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4037) +(@OGUID+1234, 181016, 571, 1, 1, 2998.711, 4070.604, 26.91523, 1.047198, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4113) +(@OGUID+1235, 181016, 571, 1, 1, 2997.857, 4049.579, 26.61824, 6.213374, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4113) +(@OGUID+1236, 181016, 571, 1, 1, 3008.427, 4048.363, 26.36823, 2.722713, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4113) +(@OGUID+1237, 181016, 571, 1, 1, 3017.189, 4065.652, 26.77533, 1.710422, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4113) +(@OGUID+1238, 181016, 571, 1, 1, 2910.194, 4046.256, 1.670829, 0.122173, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4113) +(@OGUID+1239, 181016, 571, 1, 1, 2899.832, 4067.156, 1.7923, 6.0912, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4113) +(@OGUID+1240, 181016, 571, 1, 1, 2922.883, 4037.388, 1.768461, 1.483528, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4113) +(@OGUID+1241, 181016, 571, 1, 1, 2904.64, 4073.7, 1.964231, 4.904376, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4113) +(@OGUID+1242, 181016, 571, 1, 1, 2927.117, 4077.872, 2.141783, 5.881761, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4113) +(@OGUID+1243, 181016, 571, 1, 1, 2238.36, 5132.744, 5.344914, 2.757613, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1244, 181016, 571, 1, 1, 2226.791, 5136.915, 5.344575, 5.93412, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1245, 181016, 571, 1, 1, 2352.742, 5196.42, 7.632045, 2.757613, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1246, 181016, 571, 1, 1, 2248.404, 5206.861, 14.71353, 0.5235979, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1247, 181016, 571, 1, 1, 2238.517, 5180.176, 14.71353, 5.93412, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1248, 181016, 571, 1, 1, 2207.053, 5222.542, 14.10005, 2.705255, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4032) +(@OGUID+1249, 181016, 571, 1, 1, 2255.31, 5225.856, 14.71353, 5.93412, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4032) +(@OGUID+1250, 181016, 571, 1, 1, 2302.698, 5237.8, 11.3397, 2.775069, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4032) +(@OGUID+1251, 181016, 571, 1, 1, 2366.833, 5211.396, 7.632044, 2.705255, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4032) +(@OGUID+1252, 181016, 571, 1, 1, 2214.695, 5241.333, 14.10005, 2.775069, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4032) +(@OGUID+1253, 181016, 571, 1, 1, 2276.32, 5282.166, 15.66975, 5.811947, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4032) +(@OGUID+1254, 181016, 571, 1, 1, 2234.987, 5298.379, 15.05626, 2.687807, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4032) +(@OGUID+1255, 181016, 571, 1, 1, 2187.269, 5257.097, 23.37515, 2.932139, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4032) +(@OGUID+1256, 181016, 571, 1, 1, 2192.255, 5270.982, 24.45937, 2.722713, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4032) +(@OGUID+1257, 181016, 571, 1, 1, 2288.013, 5313.147, 14.71353, 5.044002, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4032) +(@OGUID+1258, 181016, 571, 1, 1, 2213.95, 5333.778, 23.37515, 3.455756, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4032) +(@OGUID+1259, 181016, 571, 1, 1, 2197.986, 5288.558, 24.45936, 2.722713, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4032) +(@OGUID+1260, 181016, 571, 1, 1, 2202.939, 5302.733, 23.37515, 2.82743, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4032) +(@OGUID+1261, 181016, 571, 1, 1, 2208.51, 5319.641, 23.37515, 2.897245, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4032) +(@OGUID+1262, 181016, 571, 1, 1, 2151.343, 5284.071, 24.66521, 2.757613, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4032) +(@OGUID+1263, 181016, 571, 1, 1, 2157.476, 5301.414, 24.66485, 2.809975, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4032) +(@OGUID+1264, 181016, 571, 1, 1, 2122.561, 5320.263, 32.77589, 4.398232, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4032) +(@OGUID+1265, 181016, 571, 1, 1, 2112.85, 5291.524, 32.77574, 1.239183, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4032) +(@OGUID+1266, 181016, 571, 1, 1, 2805.134, 6135.274, 84.65132, 1.134463, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4129) +(@OGUID+1267, 181016, 571, 1, 1, 2788.66, 6162.68, 84.8553, 5.515242, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4129) +(@OGUID+1268, 181016, 571, 1, 1, 2823.609, 6165.092, 121.9373, 2.251473, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4129) +(@OGUID+1269, 181016, 571, 1, 1, 2815.305, 6174.101, 121.9518, 5.497789, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4129) +(@OGUID+1270, 181016, 571, 1, 1, 2799.835, 6186.328, 84.08407, 2.809975, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4129) +(@OGUID+1271, 181016, 571, 1, 1, 2876.308, 6204.336, 208.7393, 0.9773831, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4129) +(@OGUID+1272, 181016, 571, 1, 1, 2860.569, 6221.081, 208.7375, 0.5410506, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4129) +(@OGUID+1273, 181016, 571, 1, 1, 2861.186, 6199.252, 208.7366, 2.234018, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4129) +(@OGUID+1274, 181016, 571, 1, 1, 2853.404, 6207.334, 208.7359, 5.462882, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4129) +(@OGUID+1275, 181016, 571, 1, 1, 2888.891, 6247.602, 208.8507, 4.276057, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4129) +(@OGUID+1276, 181016, 571, 1, 1, 2902.97, 6231.561, 208.8656, 3.455756, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4129) +(@OGUID+1277, 181016, 571, 1, 1, 2899.378, 6242.913, 208.8885, 3.839725, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4129) +(@OGUID+1278, 181016, 571, 1, 1, 2892.682, 6263.139, 209.0361, 5.201083, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4129) +(@OGUID+1279, 181016, 571, 1, 1, 2922.968, 6238.53, 208.9055, 2.478367, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4129) +(@OGUID+1280, 181016, 571, 1, 1, 3521.802, 5957.627, 134.0744, 5.462882, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4023) +(@OGUID+1281, 181016, 571, 1, 1, 3519.409, 5943.527, 134.4016, 0.1396245, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4023) +(@OGUID+1282, 181016, 571, 1, 1, 3584.385, 5975.644, 136.2158, 6.248279, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4023) +(@OGUID+1283, 181016, 571, 1, 1, 3624.637, 5926.569, 136.2162, 2.617989, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4023) +(@OGUID+1284, 181016, 571, 1, 1, 3623.188, 5947.213, 136.2162, 3.368496, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4023) +(@OGUID+1285, 181016, 571, 1, 1, 3612.38, 5919.877, 136.0995, 1.954769, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4023) +(@OGUID+1286, 181016, 571, 1, 1, 3605.886, 5989.136, 136.2162, 4.084071, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4023) +(@OGUID+1287, 181016, 571, 1, 1, 3633.385, 5887.483, 140.0765, 0.9948372, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4023) +(@OGUID+1288, 181016, 571, 1, 1, 3647.803, 5882.226, 174.4943, 0.9773831, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4023) +(@OGUID+1289, 181016, 571, 1, 1, 4047.685, 5298.593, 24.65438, 2.408554, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1290, 181016, 571, 1, 1, 4079.892, 5272.371, 27.84729, 1.134463, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1291, 181016, 571, 1, 1, 4174.55, 5310.481, 25.4746, 2.809975, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1292, 181016, 571, 1, 1, 4124.854, 5302.798, 29.50037, 1.623156, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1293, 181016, 571, 1, 1, 4166.071, 5288.284, 26.37672, 2.82743, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1294, 181016, 571, 1, 1, 4064.177, 5287.178, 28.33383, 0.4886912, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1295, 181016, 571, 1, 1, 4038.373, 5295.928, 24.80445, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1296, 181016, 571, 1, 1, 4133.651, 5261.081, 25.0436, 1.431168, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4108) +(@OGUID+1297, 181016, 571, 1, 1, 4116.859, 5260.454, 24.72842, 1.658062, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4108) +(@OGUID+1298, 181016, 571, 1, 1, 4188.307, 5253.252, 26.37672, 3.298687, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4108) +(@OGUID+1299, 181016, 571, 1, 1, 4203.514, 5258.505, 32.30191, 3.106652, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4108) +(@OGUID+1300, 181016, 571, 1, 1, 4245.934, 5261.749, 70.84612, 2.670348, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4108) +(@OGUID+1301, 181016, 571, 1, 1, 4464.801, 5710.149, 81.19541, 0.4886912, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1302, 181016, 571, 1, 1, 4474.953, 5701.296, 81.26831, 0.2967052, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1303, 181016, 571, 1, 1, 4504.061, 5681.631, 81.48656, 3.543024, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1304, 181016, 571, 1, 1, 4496.206, 5716.174, 81.43398, 1.221729, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1305, 181016, 571, 1, 1, 4503.089, 5725.708, 81.28325, 2.460913, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1306, 181016, 571, 1, 1, 4518.926, 5710.135, 81.47955, 2.775069, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1307, 181016, 571, 1, 1, 4509.733, 5758.892, 81.67448, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4122) +(@OGUID+1308, 181016, 571, 1, 1, 5533.617, 5764.573, -78.64155, 0.802851, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4285) +(@OGUID+1309, 181016, 571, 1, 1, 5538.608, 5734.042, -76.70612, 3.316144, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4285) +(@OGUID+1310, 181016, 571, 1, 1, 5581.773, 5765.792, -74.64859, 5.061456, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4285) +(@OGUID+1311, 181016, 571, 1, 1, 5565.491, 5758.583, -75.22591, 5.794494, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4285) +(@OGUID+1312, 181016, 571, 1, 1, 5590.33, 5779.955, -71.88873, 5.67232, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4285) +(@OGUID+1313, 181016, 571, 1, 1, 5591.747, 5812.308, -69.85215, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4285) +(@OGUID+1314, 181016, 571, 1, 1, 5547.863, 5726.392, -76.03914, 4.502952, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4285) +(@OGUID+1315, 181016, 571, 1, 1, 5594.934, 5715.648, -72.77393, 4.084071, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4284) +(@OGUID+1316, 181016, 571, 1, 1, 5575.626, 5710.971, -76.69463, 5.358162, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4284) +(@OGUID+1317, 181016, 571, 1, 1, 5584.725, 5752.109, -72.06274, 3.612838, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4284) +(@OGUID+1318, 181016, 571, 1, 1, 5609.327, 5807.859, -70.49896, 0.6457717, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4284) +(@OGUID+1319, 181016, 571, 1, 1, 5623.018, 5797.692, -71.15307, 1.605702, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4284) +(@OGUID+1320, 181016, 571, 1, 1, 5480.522, 4749.844, -197.1695, 5.654869, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4290) +(@OGUID+1321, 181016, 571, 1, 1, 5499.655, 4733.096, -194.545, 2.460913, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4290) +(@OGUID+1322, 181016, 571, 1, 1, 5480.355, 4744.158, -196.4283, 0.087266, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4290) +(@OGUID+1323, 181016, 571, 1, 1, 5489.249, 4730.626, -194.7575, 1.186823, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4290) +(@OGUID+1324, 181016, 571, 1, 1, 5478.019, 4730.707, -195.1084, 0.7853968, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4290) +(@OGUID+1325, 181016, 571, 1, 1, 8436.615, -338.5281, 906.6075, 5.567601, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4436) +(@OGUID+1326, 181016, 571, 1, 1, 8477.151, -325.8229, 905.8746, 4.01426, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4436) +(@OGUID+1327, 181016, 571, 1, 1, 8442.052, -343.1962, 906.6075, 2.33874, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4436) +(@OGUID+1328, 181016, 571, 1, 1, 8471.394, -348.3333, 906.9317, 1.815142, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4436) +(@OGUID+1329, 181016, 571, 1, 1, 7856.442, -742.1389, 1177.688, 6.108654, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1330, 181016, 571, 1, 1, 7879.499, -759.5701, 1175.366, 2.460913, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1331, 181016, 571, 1, 1, 7850.471, -793.3299, 1183.955, 3.106652, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1332, 181016, 530, 1, 1, -1907.199, 5450.696, -12.42813, 5.480334, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3703) +(@OGUID+1333, 181016, 530, 1, 1, -1917.352, 5455.052, -12.55365, 5.096362, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3703) +(@OGUID+1334, 181016, 530, 1, 1, -1911.368, 5439.292, -12.42818, 0.122173, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3703) +(@OGUID+1335, 181016, 530, 1, 1, -1885.166, 5386.202, -12.42817, 0.7679439, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3703) +(@OGUID+1336, 181016, 530, 1, 1, -1873.54, 5382.65, -12.42811, 1.727875, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3703) +(@OGUID+1337, 181016, 530, 1, 1, -1815.917, 5420.624, -12.42818, 3.211419, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3703) +(@OGUID+1338, 181016, 530, 1, 1, -1819.924, 5409.16, -12.42813, 2.391098, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3703) +(@OGUID+1339, 181016, 530, 1, 1, -1727.312, 5487.572, -8.355326, 0.9599299, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3703) +(@OGUID+1340, 181016, 530, 1, 1, -1735.256, 5502.995, -8.428672, 6.19592, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3703) +(@OGUID+1341, 181016, 530, 1, 1, -1695.612, 5498.583, -9.799444, 2.757613, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3703) +(@OGUID+1342, 181016, 530, 1, 1, -1706.805, 5522.744, -9.799464, 4.06662, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3703) +(@OGUID+1343, 181016, 530, 1, 1, -1745.647, 5142.983, -37.22771, 1.047198, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3899) +(@OGUID+1344, 181016, 530, 1, 1, -1758.525, 5138.586, -37.21199, 2.809975, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3899) +(@OGUID+1345, 181016, 530, 1, 1, -1775.782, 5170.78, -40.20916, 2.216565, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3899) +(@OGUID+1346, 181016, 530, 1, 1, -2042.056, 5233.834, -38.8555, 3.141593, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1347, 181016, 530, 1, 1, -2050.452, 5241.551, -38.85723, 4.76475, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1348, 181016, 530, 1, 1, -2061.054, 5250.36, -38.46526, 6.056293, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1349, 181016, 530, 1, 1, -2021.757, 5336.417, -9.350949, 0.9599299, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1350, 181016, 530, 1, 1, -2034.004, 5359.76, -9.350951, 6.003934, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1351, 181016, 530, 1, 1, -2001.405, 5370.284, -8.034398, 3.961899, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1352, 181016, 530, 1, 1, -2171.618, 5399.994, 50.22791, 0.6283169, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1353, 181016, 530, 1, 1, -1994.435, 5356.163, -8.067644, 3.351047, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1354, 181016, 530, 1, 1, -2024.566, 5470.972, 3.928363, 5.98648, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1355, 181016, 530, 1, 1, -2032.695, 5481.466, 54.53995, 1.308995, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1356, 181016, 530, 1, 1, -2029.916, 5490.481, 54.53994, 4.363324, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1357, 181016, 530, 1, 1, -2016.837, 5494.008, 3.808645, 5.846854, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1358, 181016, 530, 1, 1, -2145.284, 5497.773, 51.2669, 1.692969, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1359, 181016, 530, 1, 1, -2176.784, 5413.221, 50.22791, 0.4188786, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3898) +(@OGUID+1360, 181016, 530, 1, 1, -2167.578, 5441.844, 51.2669, 3.316144, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3898) +(@OGUID+1361, 181016, 530, 1, 1, -2185.163, 5454.922, 51.2669, 5.811947, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1362, 181016, 530, 1, 1, -1802.705, 5597.75, 130.8119, 2.652894, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1363, 181016, 530, 1, 1, -1811.717, 5600.768, 130.8119, 5.811947, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1364, 181016, 530, 1, 1, -1798.486, 5585.74, 3.878141, 4.293513, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1365, 181016, 530, 1, 1, -1822.766, 5593.826, 3.894919, 4.555311, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1366, 181016, 530, 1, 1, -1791.788, 5726.31, 129.1411, 5.689774, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1367, 181016, 530, 1, 1, -1780.283, 5739.229, 128.7909, 5.061456, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1368, 181016, 530, 1, 1, -1745.379, 5726.958, 128.7801, 3.647741, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1369, 181016, 530, 1, 1, -1743.729, 5710.51, 129.1411, 3.019413, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1370, 181016, 530, 1, 1, -1864.92, 5715.607, 132.2513, 2.199115, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1371, 181016, 530, 1, 1, -1844.504, 5746.667, 130.7976, 2.33874, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1372, 181016, 530, 1, 1, -1886.932, 5771.139, 129.5579, 5.881761, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1373, 181016, 530, 1, 1, -1846.261, 5773.022, 131.2068, 3.857183, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1374, 181016, 530, 1, 1, -1917.616, 5746.094, 131.1787, 0.5061446, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1375, 181016, 530, 1, 1, -1893.715, 5757.046, 129.482, 0.3665176, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1376, 181016, 530, 1, 1, -1888.447, 5716.592, 132.1732, 1.117009, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1377, 181016, 530, 1, 1, -1904.28, 5729.601, 131.1909, 1.029743, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1378, 181016, 530, 1, 1, -1993.964, 5686.367, 117.6628, 5.829401, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1379, 181016, 530, 1, 1, -1990.117, 5678.112, 117.6628, 1.291542, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1380, 181016, 530, 1, 1, -2545.219, 4312.679, 20.62585, 4.747296, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1381, 181016, 530, 1, 1, -2558.318, 4305.626, 20.76239, 5.759588, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1382, 181016, 530, 1, 1, -2623.644, 4378.721, 35.27359, 4.01426, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1383, 181016, 530, 1, 1, -2611.685, 4383.334, 32.93204, 2.583081, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1384, 181016, 530, 1, 1, -2569.438, 4420.438, 39.15441, 0.9424766, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3683) +(@OGUID+1385, 181016, 530, 1, 1, -2617.922, 4427.623, 36.09334, 4.171338, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3683) +(@OGUID+1386, 181016, 530, 1, 1, -2631.962, 4428.709, 36.10242, 4.81711, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3683) +(@OGUID+1387, 181016, 530, 1, 1, -2614.487, 4456.502, 36.09352, 5.009095, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3683) +(@OGUID+1388, 181016, 530, 1, 1, -2624.518, 4467.333, 36.14123, 2.44346, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3683) +(@OGUID+1389, 181016, 530, 1, 1, -2666.818, 4443.57, 36.34382, 5.166176, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3683) +(@OGUID+1390, 181016, 530, 1, 1, -2667.306, 4424.93, 37.06041, 6.230826, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3683) +(@OGUID+1391, 181016, 530, 1, 1, -2966.667, 4073.203, 2.960989, 1.745327, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3684) +(@OGUID+1392, 181016, 530, 1, 1, -2924.175, 4014.802, 0.424108, 3.368496, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3684) +(@OGUID+1393, 181016, 530, 1, 1, -2904.558, 4017.979, 0.378337, 2.82743, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3684) +(@OGUID+1394, 181016, 530, 1, 1, -2926.811, 4019.083, 0.413682, 4.01426, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3684) +(@OGUID+1395, 181016, 530, 1, 1, -2942.975, 3949.947, 0.906697, 4.66003, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3684) +(@OGUID+1396, 181016, 530, 1, 1, -2987.699, 3860.738, 8.660349, 1.308995, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3684) +(@OGUID+1397, 181016, 530, 1, 1, -2956.34, 3907.056, 3.423482, 0.7504908, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3684) +(@OGUID+1398, 181016, 530, 1, 1, -2943.432, 3903.176, 3.423485, 1.692969, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3684) +(@OGUID+1399, 181016, 530, 1, 1, -2975.988, 3877.033, 9.545059, 3.769912, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3684) +(@OGUID+1400, 181016, 530, 1, 1, -3031.269, 2631.006, 76.54335, 4.485497, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3744) +(@OGUID+1401, 181016, 530, 1, 1, -3081.042, 2598.579, 61.74963, 3.38594, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3744) +(@OGUID+1402, 181016, 530, 1, 1, -2932.842, 2657.233, 94.24632, 4.502952, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3744) +(@OGUID+1403, 181016, 530, 1, 1, -3065.579, 2555.547, 65.75816, 3.752462, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3744) +(@OGUID+1404, 181016, 530, 1, 1, -3104.677, 2582.695, 61.977, 4.642576, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3744) +(@OGUID+1405, 181016, 530, 1, 1, -3107.003, 2545.114, 62.05597, 1.029743, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3744) +(@OGUID+1406, 181016, 530, 1, 1, -3006.598, 2549.313, 78.11643, 2.129301, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3744) +(@OGUID+1407, 181016, 530, 1, 1, -3052.811, 2481.651, 66.65688, 2.565632, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3744) +(@OGUID+1408, 181016, 530, 1, 1, -2979.335, 2554.049, 76.54335, 3.926996, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3744) +(@OGUID+1409, 181016, 530, 1, 1, -2986.574, 2565.178, 76.54335, 2.600535, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3744) +(@OGUID+1410, 181016, 530, 1, 1, -2956.544, 2554.592, 126.6191, 2.740162, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3744) +(@OGUID+1411, 181016, 530, 1, 1, -2970.731, 2573.003, 76.54335, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3744) +(@OGUID+1412, 181016, 530, 1, 1, -2921.617, 2644.625, 94.40192, 3.351047, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3744) +(@OGUID+1413, 181016, 530, 1, 1, -3930.809, 2115.148, 96.81004, 3.508117, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3745) +(@OGUID+1414, 181016, 530, 1, 1, -3984.704, 2162.162, 105.4418, 4.380776, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3745) +(@OGUID+1415, 181016, 530, 1, 1, -3948.719, 2165.375, 100.8409, 2.775069, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3745) +(@OGUID+1416, 181016, 530, 1, 1, -3981.395, 2150.587, 105.0282, 2.600535, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3745) +(@OGUID+1417, 181016, 530, 1, 1, -3966.465, 2185.426, 101.8951, 1.692969, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3745) +(@OGUID+1418, 181016, 530, 1, 1, -4008.345, 2172.325, 105.0965, 0.2792516, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3745) +(@OGUID+1419, 181016, 530, 1, 1, -4026.63, 2188.58, 109.1173, 2.251473, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3745) +(@OGUID+1420, 181016, 530, 1, 1, -4035.944, 2238.973, 112.2723, 5.270896, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3745) +(@OGUID+1421, 181016, 530, 1, 1, -4047.156, 2228.053, 112.0462, 5.951575, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3745) +(@OGUID+1422, 181016, 530, 1, 1, -4062.359, 2190.83, 109.8543, 5.602507, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3745) +(@OGUID+1423, 181016, 530, 1, 1, -4130.572, 1173.389, 49.58154, 5.777041, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3929) +(@OGUID+1424, 181016, 530, 1, 1, -4084.195, 1138.926, 44.43298, 4.537859, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3929) +(@OGUID+1425, 181016, 530, 1, 1, -4065.08, 1138.295, 43.1756, 3.909541, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3929) +(@OGUID+1426, 181016, 530, 1, 1, -4088.488, 1139.846, 44.42666, 4.572764, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3929) +(@OGUID+1427, 181016, 530, 1, 1, -4135.374, 1128.675, 54.58289, 4.223697, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3929) +(@OGUID+1428, 181016, 530, 1, 1, -4112.096, 1121.578, 44.54679, 5.288348, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3929) +(@OGUID+1429, 181016, 530, 1, 1, -4062.444, 1135.474, 43.18277, 3.804818, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3929) +(@OGUID+1430, 181016, 530, 1, 1, -4114.819, 1116.677, 44.53127, 0.1745321, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3929) +(@OGUID+1431, 181016, 530, 1, 1, -3080.772, 825.7006, -11.35703, 1.029743, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1432, 181016, 530, 1, 1, -3055.614, 812.4755, -9.506436, 0.4363316, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1433, 181016, 530, 1, 1, -3075.424, 858.7751, -20.02081, 3.298687, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1434, 181016, 530, 1, 1, -3079.415, 748.1234, -10.33996, 6.248279, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1435, 181016, 530, 1, 1, -3089.802, 837.7723, -19.92381, 1.867502, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1436, 181016, 530, 1, 1, -3061.827, 853.1981, -11.37245, 4.06662, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1437, 181016, 530, 1, 1, -3040.775, 806.6836, -9.706291, 1.692969, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3754) +(@OGUID+1438, 181016, 530, 1, 1, -3012.275, 861.4301, -10.48986, 4.01426, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3754) +(@OGUID+1439, 181016, 530, 1, 1, -3007.626, 853.5888, -10.48604, 3.33359, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3754) +(@OGUID+1440, 181016, 530, 1, 1, -3016.658, 795.0476, -9.916844, 2.129301, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3754) +(@OGUID+1441, 181016, 530, 1, 1, -3028.215, 823.3273, -9.546359, 3.455756, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3754) +(@OGUID+1442, 181016, 530, 1, 1, -3009.987, 803.8392, -10.3957, 2.722713, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3754) +(@OGUID+1443, 181016, 530, 1, 1, -3041.075, 832.1203, -9.484895, 4.607672, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3754) +(@OGUID+1444, 181016, 530, 1, 1, -2983.705, 809.1548, -6.9079, 4.06662, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3754) +(@OGUID+1445, 181016, 530, 1, 1, -3010.563, 770.086, -6.933084, 0.8901166, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3754) +(@OGUID+1446, 181016, 530, 1, 1, -2983.507, 869.4686, -7.479865, 4.66003, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3754) +(@OGUID+1447, 181016, 530, 1, 1, -717.8087, 2647.749, 93.05632, 3.787367, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3538) +(@OGUID+1448, 181016, 530, 1, 1, -720.9301, 2658.757, 93.7806, 3.106652, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3538) +(@OGUID+1449, 181016, 530, 1, 1, -695.8323, 2638.751, 90.97626, 4.81711, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3538) +(@OGUID+1450, 181016, 530, 1, 1, -708.6624, 2640.041, 91.84985, 4.136433, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3538) +(@OGUID+1451, 181016, 530, 1, 1, -702.0106, 2676.552, 93.48396, 1.727875, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3538) +(@OGUID+1452, 181016, 530, 1, 1, -714.3968, 2671.541, 93.92791, 2.234018, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3538) +(@OGUID+1453, 181016, 530, 1, 1, -690.535, 2673.585, 92.20389, 0.9424766, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3538) +(@OGUID+1454, 181016, 530, 1, 1, -684.1902, 2664.04, 90.97864, 0.5061446, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3538) +(@OGUID+1455, 181016, 530, 1, 1, -685.2488, 2644.338, 90.4667, 5.462882, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3538) +(@OGUID+1456, 181016, 530, 1, 1, -681.7703, 2653.848, 90.5937, 6.108654, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3538) +(@OGUID+1457, 181016, 530, 1, 1, -699.3879, 2717.673, 94.73693, 3.822273, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3538) +(@OGUID+1458, 181016, 530, 1, 1, 41.7532, 2675.019, 78.98357, 0.157079, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3536) +(@OGUID+1459, 181016, 530, 1, 1, 49.26655, 2658.362, 78.4103, 0.4712385, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3536) +(@OGUID+1460, 181016, 530, 1, 1, 168.2221, 2632.726, 86.68047, 2.600535, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3536) +(@OGUID+1461, 181016, 530, 1, 1, 177.3938, 2641.12, 87.18604, 2.199115, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3536) +(@OGUID+1462, 181016, 530, 1, 1, 184.4233, 2683.703, 88.28799, 3.001947, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3536) +(@OGUID+1463, 181016, 530, 1, 1, 182.2488, 2695.313, 88.79645, 3.47321, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3536) +(@OGUID+1464, 181016, 530, 1, 1, 202.2809, 2606.497, 87.28353, 2.670348, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3536) +(@OGUID+1465, 181016, 530, 1, 1, 193.15, 2600.053, 87.28353, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3536) +(@OGUID+1466, 181016, 530, 1, 1, 293.5556, 2757.308, 85.24716, 0.9773831, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3536) +(@OGUID+1467, 181016, 530, 1, 1, 277.2957, 2769.554, 84.67036, 0.9948372, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3536) +(@OGUID+1468, 181016, 530, 1, 1, 123.4488, 2766.59, 102.234, 3.804818, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3536) +(@OGUID+1469, 181016, 530, 1, 1, 211.9928, 2818.017, 129.8682, 2.91469, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3536) +(@OGUID+1470, 181016, 530, 1, 1, 215.5181, 2828.05, 130.0014, 2.635444, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3536) +(@OGUID+1471, 181016, 530, 1, 1, 223.0891, 2810.249, 129.6152, 4.747296, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3536) +(@OGUID+1472, 181016, 530, 1, 1, 140.73, 4269.448, 107.4208, 2.024579, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1473, 181016, 530, 1, 1, 82.60951, 4318.784, 102.0311, 0.383971, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1474, 181016, 530, 1, 1, 147.9486, 4275.235, 107.2797, 2.426008, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1475, 181016, 530, 1, 1, 136.032, 4345.664, 106.6182, 4.799657, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3552) +(@OGUID+1476, 181016, 530, 1, 1, 152.2135, 4318.471, 106.2541, 2.949595, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3552) +(@OGUID+1477, 181016, 530, 1, 1, 80.49339, 4347.601, 102.071, 5.183629, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3552) +(@OGUID+1478, 181016, 530, 1, 1, 134.9947, 4319.371, 106.7541, 1.500983, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3552) +(@OGUID+1479, 181016, 530, 1, 1, 151.8665, 4348.405, 107.2158, 3.071766, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3552) +(@OGUID+1480, 181016, 530, 1, 1, 181.2025, 4317.459, 119.9638, 1.675514, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3552) +(@OGUID+1481, 181016, 530, 1, 1, 181.4662, 4350.056, 119.962, 4.782203, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3552) +(@OGUID+1482, 181016, 530, 1, 1, 196.4538, 4339.529, 116.9748, 3.787367, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3552) +(@OGUID+1483, 181016, 530, 1, 1, 196.2876, 4328.141, 116.8841, 2.548179, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3552) +(@OGUID+1484, 181016, 530, 1, 1, -208.6328, 5388.645, 22.92735, 4.555311, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3521) +(@OGUID+1485, 181016, 530, 1, 1, -236.2242, 5387.014, 24.6395, 5.410522, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3521) +(@OGUID+1486, 181016, 530, 1, 1, -210.9873, 5433.489, 21.37882, 3.822273, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3521) +(@OGUID+1487, 181016, 530, 1, 1, -212.93, 5473.045, 22.87997, 2.146753, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3565) +(@OGUID+1488, 181016, 530, 1, 1, -324.4565, 5466.785, 22.66969, 1.326448, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3565) +(@OGUID+1489, 181016, 530, 1, 1, -306.1548, 5479.317, 22.28877, 2.35619, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3565) +(@OGUID+1490, 181016, 530, 1, 1, -253.026, 5481.032, 24.94352, 5.480334, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3565) +(@OGUID+1491, 181016, 530, 1, 1, -344.9888, 5492.374, 22.00702, 3.57793, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3565) +(@OGUID+1492, 181016, 530, 1, 1, -196.088, 5525.092, 22.81344, 3.612838, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3565) +(@OGUID+1493, 181016, 530, 1, 1, -213.9051, 5547.442, 24.07233, 3.57793, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3565) +(@OGUID+1494, 181016, 530, 1, 1, -192.6228, 5531.502, 29.45192, 3.769912, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3565) +(@OGUID+1495, 181016, 530, 1, 1, -184.6291, 5506.406, 29.47097, 3.141593, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3565) +(@OGUID+1496, 181016, 530, 1, 1, -192.4105, 5510.174, 22.67085, 3.33359, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3565) +(@OGUID+1497, 181016, 530, 1, 1, -87.59586, 5535.549, 22.80703, 0.5759573, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3565) +(@OGUID+1498, 181016, 530, 1, 1, -87.05946, 5555.918, 22.68842, 5.689774, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3565) +(@OGUID+1499, 181016, 530, 1, 1, -149.7903, 5567.248, 23.00511, 5.689774, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3565) +(@OGUID+1500, 181016, 530, 1, 1, -145.6747, 5545.872, 22.66767, 0.6457717, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3565) +(@OGUID+1501, 181016, 530, 1, 1, 278.5881, 5966.778, 150.1677, 5.375615, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1502, 181016, 530, 1, 1, 272.3167, 5944.75, 26.52184, 5.270896, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1503, 181016, 530, 1, 1, 298.2953, 5957.52, 26.42815, 1.745327, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1504, 181016, 530, 1, 1, 269.9623, 5956.735, 26.43292, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1505, 181016, 530, 1, 1, 296.5285, 5941.624, 26.55748, 3.68265, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1506, 181016, 530, 1, 1, 280.785, 6008.137, 144.7295, 4.729844, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1507, 181016, 530, 1, 1, 261.4174, 5980.111, 132.9563, 4.118979, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1508, 181016, 530, 1, 1, 301.7136, 5979.073, 132.4598, 4.782203, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1509, 181016, 530, 1, 1, 222.1361, 6049.518, 148.3132, 2.33874, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3644) +(@OGUID+1510, 181016, 530, 1, 1, 307.1656, 6055.835, 131.5718, 3.33359, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3644) +(@OGUID+1511, 181016, 530, 1, 1, 208.3886, 6049.729, 148.32, 3.909541, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3644) +(@OGUID+1512, 181016, 530, 1, 1, 290.4184, 6083.181, 131.5468, 4.590216, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3644) +(@OGUID+1513, 181016, 530, 1, 1, 227.5588, 6070.599, 148.3118, 3.176533, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3644) +(@OGUID+1514, 181016, 530, 1, 1, 275.337, 6082.517, 131.545, 4.886924, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3644) +(@OGUID+1515, 181016, 530, 1, 1, 217.2829, 6078.526, 148.3125, 1.710422, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3644) +(@OGUID+1516, 181016, 530, 1, 1, 276.2028, 6122.649, 142.509, 5.323256, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1517, 181016, 530, 1, 1, 210.443, 7810.77, 23.8272, 1.099556, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1518, 181016, 530, 1, 1, 229.981, 7821.426, 21.9932, 3.001947, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1519, 181016, 530, 1, 1, 253.7596, 7836.7, 22.96672, 5.078908, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1520, 181016, 530, 1, 1, 293.3064, 7831.16, 24.93296, 4.415683, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1521, 181016, 530, 1, 1, 287.7669, 7842.643, 22.58914, 2.44346, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1522, 181016, 530, 1, 1, 238.5979, 7893.07, 21.80824, 5.393069, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3645) +(@OGUID+1523, 181016, 530, 1, 1, 334.9908, 7839.56, 22.29418, 1.658062, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3645) +(@OGUID+1524, 181016, 530, 1, 1, 250.3989, 7896.925, 21.68546, 4.590216, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3645) +(@OGUID+1525, 181016, 530, 1, 1, 261.7739, 7872.234, 23.73318, 5.113817, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3645) +(@OGUID+1526, 181016, 530, 1, 1, 210.8226, 7926.406, 25.6933, 0.3316107, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3645) +(@OGUID+1527, 181016, 530, 1, 1, 247.4571, 7941.143, 25.69258, 3.612838, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3645) +(@OGUID+1528, 181016, 530, 1, 1, 285.1593, 7952.144, 21.52511, 3.804818, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3645) +(@OGUID+1529, 181016, 530, 1, 1, 276.1272, 7957.609, 21.57661, 4.32842, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3645) +(@OGUID+1530, 181016, 530, 1, 1, 201.9845, 8489.734, 24.44587, 0.6457717, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3656) +(@OGUID+1531, 181016, 530, 1, 1, 253.3038, 8489.067, 23.37944, 1.431168, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3656) +(@OGUID+1532, 181016, 530, 1, 1, 265.287, 8514.346, 23.52993, 3.68265, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3656) +(@OGUID+1533, 181016, 530, 1, 1, 223.5183, 8562.453, 23.26412, 4.293513, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3649) +(@OGUID+1534, 181016, 530, 1, 1, -1207.967, 7386.663, 31.42567, 2.321287, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1535, 181016, 530, 1, 1, -1220.264, 7388.16, 30.78928, 0.6108634, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1536, 181016, 530, 1, 1, -1265.508, 7313.129, 34.21532, 1.047198, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1537, 181016, 530, 1, 1, -1184.679, 7246.92, 35.14313, 2.82743, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1538, 181016, 530, 1, 1, -1198.807, 7250.11, 35.15434, 6.108654, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1539, 181016, 530, 1, 1, -1273.831, 7316.673, 33.7791, 1.169369, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1540, 181016, 530, 1, 1, -1221.305, 7222.463, 59.25886, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1541, 181016, 530, 1, 1, -1176.216, 7200.084, 58.21382, 0.5759573, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1542, 181016, 530, 1, 1, -1184.833, 7207.807, 57.92133, 0.5410506, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1543, 181016, 530, 1, 1, -1201.722, 7206.649, 58.55188, 0.9948372, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1544, 181016, 530, 1, 1, -1296.44, 7267.444, 34.61653, 4.049168, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1545, 181016, 530, 1, 1, -1302.753, 7271.99, 34.41439, 4.101525, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1546, 181016, 530, 1, 1, -1271.883, 7197.997, 57.89819, 2.35619, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1547, 181016, 530, 1, 1, -1282.837, 7187.43, 58.00641, 2.391098, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1548, 181016, 530, 1, 1, -1249.806, 7217.763, 58.32962, 2.146753, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1549, 181016, 530, 1, 1, -1454.16, 7165.046, 44.56573, 5.166176, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1550, 181016, 530, 1, 1, -1387.221, 7134.828, 34.03579, 3.874631, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1551, 181016, 530, 1, 1, -1392.476, 7140.168, 33.73893, 3.944446, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1552, 181016, 530, 1, 1, -1371.671, 7162.804, 33.254, 0.8203033, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1553, 181016, 530, 1, 1, -1364.813, 7156.565, 34.00505, 0.8901166, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1554, 181016, 530, 1, 1, -1283.426, 7130.822, 59.73568, 3.38594, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1555, 181016, 530, 1, 1, -1254.381, 7007.266, 36.623, 4.537859, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1556, 181016, 530, 1, 1, -1296.558, 6953.973, 33.24513, 4.118979, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1557, 181016, 530, 1, 1, -1307.797, 6960.474, 32.26982, 4.223697, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1558, 181016, 530, 1, 1, -1241.754, 7003.594, 36.79386, 4.537859, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1559, 181016, 530, 1, 1, -1262.076, 7107.592, 58.88747, 3.944446, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1560, 181016, 530, 1, 1, -1209.608, 7103.708, 57.44921, 5.410522, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1561, 181016, 530, 1, 1, -1194.752, 7110.279, 58.0645, 5.044002, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1562, 181016, 530, 1, 1, -1247.801, 7101.981, 58.06834, 4.171338, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1563, 181016, 530, 1, 1, -1173.556, 7134.231, 58.11499, 5.951575, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1564, 181016, 530, 1, 1, -2571.461, 7378.03, 11.05957, 0.2617982, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1565, 181016, 530, 1, 1, -2561.666, 7378.96, 10.5709, 2.967041, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1566, 181016, 530, 1, 1, -2573.72, 7300.305, 13.90452, 6.003934, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1567, 181016, 530, 1, 1, -2602.271, 7282.346, 19.39945, 3.38594, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1568, 181016, 530, 1, 1, -2528.435, 7266.286, 16.27025, 2.478367, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1569, 181016, 530, 1, 1, -2611.334, 7343.457, 23.60636, 5.393069, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1570, 181016, 530, 1, 1, -2605.266, 7291.263, 19.8158, 3.647741, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1571, 181016, 530, 1, 1, -2624.408, 7331.686, 24.46344, 1.396262, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1572, 181016, 530, 1, 1, -2534.468, 7256.75, 16.26636, 2.530723, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1573, 181016, 530, 1, 1, -2614.572, 7330.876, 24.21089, 1.500983, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1574, 181016, 530, 1, 1, -2570.705, 7291.29, 14.81433, 0.5410506, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1575, 181016, 530, 1, 1, -2618.061, 7338.908, 23.65936, 4.956738, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1576, 181016, 530, 1, 1, -2614.92, 7297.726, 20.7448, 4.398232, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1577, 181016, 530, 1, 1, -2625.71, 7298.209, 21.14083, 4.799657, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1578, 181016, 530, 1, 1, -2720.994, 7355.896, 39.75894, 6.03884, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1579, 181016, 530, 1, 1, -2596.802, 7228.939, 13.47051, 0.2792516, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1580, 181016, 530, 1, 1, -2697.95, 7284.061, 42.72089, 6.108654, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1581, 181016, 530, 1, 1, -2692.656, 7296.979, 42.78501, 5.427975, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1582, 181016, 530, 1, 1, -2600.806, 7237.711, 12.91722, 0.3490652, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1583, 181016, 530, 1, 1, -2630.099, 7224.425, 19.74051, 3.717554, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1584, 181016, 530, 1, 1, -2702.841, 7293.721, 88.63655, 2.82743, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1585, 181016, 530, 1, 1, -2626.202, 7216.55, 20.35766, 3.560473, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1586, 181016, 530, 1, 1, -2670.031, 7211.863, 23.66941, 0.9948372, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1587, 181016, 530, 1, 1, -2678.989, 7214.03, 23.95701, 1.396262, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1588, 181016, 530, 1, 1, -2721.762, 7343.454, 39.44633, 6.161013, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1589, 181016, 530, 1, 1, -2755.534, 7275.691, 40.27126, 5.515242, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1590, 181016, 530, 1, 1, -2752.121, 7315.08, 43.48479, 5.689774, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1591, 181016, 530, 1, 1, -2762.166, 7267.401, 40.26734, 5.724681, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1592, 181016, 530, 1, 1, -2755.324, 7317.081, 56.35859, 2.617989, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1593, 181016, 530, 1, 1, 937.6202, 7360.125, 26.74729, 1.378809, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1594, 181016, 530, 1, 1, 1006.334, 7322.549, 41.04741, 5.131269, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1595, 181016, 530, 1, 1, 957.7293, 7355.671, 29.15186, 0.4363316, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1596, 181016, 530, 1, 1, 993.2974, 7345.906, 35.77085, 1.431168, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1597, 181016, 530, 1, 1, 964.8279, 7387.548, 28.52687, 5.393069, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1598, 181016, 530, 1, 1, 945.5008, 7392.224, 26.72158, 4.380776, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1599, 181016, 530, 1, 1, 1033.736, 7322.608, 40.50263, 4.049168, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1600, 181016, 530, 1, 1, 971.3665, 7408.698, 29.54321, 5.026549, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3766) +(@OGUID+1601, 181016, 530, 1, 1, 1003.335, 7429.998, 28.07676, 5.358162, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3766) +(@OGUID+1602, 181016, 530, 1, 1, 1052.856, 7384.014, 39.65503, 4.468043, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3766) +(@OGUID+1603, 181016, 530, 1, 1, 1058.58, 7386.76, 39.58334, 4.276057, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3766) +(@OGUID+1604, 181016, 530, 1, 1, 1036.931, 7385.866, 40.72616, 5.201083, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3766) +(@OGUID+1605, 181016, 530, 1, 1, 1021.34, 7392.521, 36.32355, 3.490667, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3766) +(@OGUID+1606, 181016, 530, 1, 1, 1072.741, 7372.522, 39.58335, 3.455756, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3766) +(@OGUID+1607, 181016, 530, 1, 1, 1069.436, 7366.63, 39.64074, 3.246347, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3766) +(@OGUID+1608, 181016, 530, 1, 1, 1042.453, 7348.262, 36.65906, 2.565632, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3766) +(@OGUID+1609, 181016, 530, 1, 1, 1068.558, 7349.528, 40.72983, 2.495818, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3766) +(@OGUID+1610, 181016, 530, 1, 1, 2007.013, 6878.822, 178.9834, 4.24115, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3772) +(@OGUID+1611, 181016, 530, 1, 1, 2017.319, 6873.481, 178.983, 4.24115, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3772) +(@OGUID+1612, 181016, 530, 1, 1, 2161.682, 6783.048, 183.4536, 0.8901166, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3772) +(@OGUID+1613, 181016, 530, 1, 1, 2950.829, 5486.531, 144.1427, 5.497789, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3951) +(@OGUID+1614, 181016, 530, 1, 1, 2969.01, 5459.725, 144.6972, 4.06662, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3951) +(@OGUID+1615, 181016, 530, 1, 1, 3011.185, 5493.75, 145.0009, 0.6806767, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3951) +(@OGUID+1616, 181016, 530, 1, 1, 2087.611, 4782.989, 157.7814, 0.2268925, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3827) +(@OGUID+1617, 181016, 530, 1, 1, 2019.061, 4700.482, 150.2378, 0.4363316, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3844) +(@OGUID+1618, 181016, 530, 1, 1, 2945.531, 3714.857, 143.1773, 3.159062, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3712) +(@OGUID+1619, 181016, 530, 1, 1, 3014.989, 3753.323, 144.3842, 1.256636, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3712) +(@OGUID+1620, 181016, 530, 1, 1, 2984.193, 3711.066, 142.8784, 2.932139, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3712) +(@OGUID+1621, 181016, 530, 1, 1, 3025.728, 3750.257, 144.7281, 1.326448, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3712) +(@OGUID+1622, 181016, 530, 1, 1, 2946.058, 3725.089, 143.1839, 3.089183, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3712) +(@OGUID+1623, 181016, 530, 1, 1, 3004.393, 3656.724, 143.8046, 4.694937, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3712) +(@OGUID+1624, 181016, 530, 1, 1, 3058.527, 3663.685, 143.0369, 2.042035, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3712) +(@OGUID+1625, 181016, 530, 1, 1, 2972.385, 3659.229, 144.8418, 0, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3712) +(@OGUID+1626, 181016, 530, 1, 1, 2972.166, 3648.618, 144.8469, 0.03490625, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3712) +(@OGUID+1627, 181016, 530, 1, 1, 2947.035, 3659.529, 132.5782, 3.298687, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3712) +(@OGUID+1628, 181016, 530, 1, 1, 2947.682, 3649.331, 132.5782, 2.949595, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3712) +(@OGUID+1629, 181016, 530, 1, 1, 3003.333, 3637.782, 143.8042, 1.500983, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3712) +(@OGUID+1630, 181016, 530, 1, 1, 3037.129, 3606.581, 144.4336, 4.729844, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3712) +(@OGUID+1631, 181016, 530, 1, 1, 3115.857, 3694.574, 144.0382, 0.5061446, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3712) +(@OGUID+1632, 181016, 530, 1, 1, 3120.857, 3684.906, 143.2626, 0.5759573, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3712) +(@OGUID+1633, 181016, 530, 1, 1, 4083.412, 3091.455, 339.3883, 2.879789, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3738) +(@OGUID+1634, 181016, 530, 1, 1, 4082.152, 3077.441, 339.3883, 3.159062, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3738) +(@OGUID+1635, 181016, 530, 1, 1, 4122.787, 2967.157, 352.2287, 1.605702, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3738) +(@OGUID+1636, 181016, 530, 1, 1, 4092.646, 3104.921, 339.3883, 2.234018, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3738) +(@OGUID+1637, 181016, 530, 1, 1, 4087.922, 3100.24, 339.3883, 2.530723, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3738) +(@OGUID+1638, 181016, 530, 1, 1, 4099.208, 3107.681, 339.3884, 1.692969, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3738) +(@OGUID+1639, 181016, 530, 1, 1, 4114.772, 2967.272, 352.1837, 1.500983, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3738) +(@OGUID+1640, 181016, 530, 1, 1, 4113.936, 3050.741, 339.3003, 5.899214, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3738) +(@OGUID+1641, 181016, 530, 1, 1, 4123.493, 3055.268, 339.3098, 4.520406, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3738) +(@OGUID+1642, 181016, 530, 1, 1, 4105.933, 3108.072, 339.3884, 1.431168, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3738) +(@OGUID+1643, 181016, 530, 1, 1, 4114.827, 3105.379, 339.3884, 1.169369, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3738) +(@OGUID+1644, 181016, 530, 1, 1, 4126.727, 3096.481, 339.3884, 0.7155849, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3738) +(@OGUID+1645, 181016, 530, 1, 1, 4177.695, 3093.462, 335.8202, 5.445428, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3738) +(@OGUID+1646, 181016, 530, 1, 1, 4200.194, 3075.751, 335.8202, 2.565632, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3738) +(@OGUID+1647, 181016, 530, 1, 1, 4177.452, 3004.381, 339.1197, 2.495818, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3738) +(@OGUID+1648, 181016, 530, 1, 1, 4178.088, 3015.381, 339.1293, 3.804818, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3738) +(@OGUID+1649, 181016, 530, 1, 1, 9987.122, -7093.597, 47.70498, 5.253442, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3487) +(@OGUID+1650, 181016, 530, 1, 1, 9982.972, -7098.827, 47.70499, 6.056293, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3487) +(@OGUID+1651, 181016, 0, 1, 1, -4618.024, -925.1197, 501.0621, 0.7853968, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 5344) +(@OGUID+1652, 181016, 0, 1, 1, -4623.986, -917.6334, 501.063, 0.6981314, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 5344) +(@OGUID+1653, 181016, 0, 1, 1, -8657.15, 500.306, 101.605, 3.769912, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 5390) +(@OGUID+1654, 181016, 0, 1, 1, -8673.01, 442.396, 100.031, 1.658062, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 5390) +(@OGUID+1655, 181016, 0, 1, 1, -8711.88, 463.47, 97.4507, 5.201083, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 5390) +(@OGUID+1656, 181016, 0, 1, 1, -8746.15, 410.78, 98.2072, 6.056293, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 5149) +(@OGUID+1657, 181016, 0, 1, 1, -9021.94, 883.635, 29.6565, 5.864307, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 5154) +(@OGUID+1658, 181016, 0, 1, 1, -9013.6, 889.642, 29.6736, 4.886924, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 5154) +(@OGUID+1659, 181016, 0, 1, 1, -9010.44, 847.085, 105.864, 5.829401, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 5154) +(@OGUID+1660, 181016, 0, 1, 1, -9004.8, 854.139, 105.594, 5.218536, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 5154) +(@OGUID+1661, 181016, 0, 1, 1, -8984.32, 852.349, 29.6207, 2.652894, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 5154) +(@OGUID+1662, 181016, 0, 1, 1, -8992.8, 846.523, 29.6207, 1.675514, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 5154) +(@OGUID+1663, 181016, 0, 1, 1, -8611.958, 774.5919, 97.13689, 3.979355, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 5390) +(@OGUID+1664, 181016, 0, 1, 1, -8621.187, 786.2004, 97.13911, 3.68265, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 5390) +(@OGUID+1665, 181016, 0, 1, 1, -8586.704, 962.4266, 98.45146, 3.019413, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 5151) +(@OGUID+1666, 181016, 0, 1, 1, -8605.82, 983.8307, 98.57872, 4.834563, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 5151) +(@OGUID+1667, 181016, 0, 1, 1, -8548.039, 997.2659, 89.73065, 1.047198, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 5151) +(@OGUID+1668, 181016, 0, 1, 1, -8412.685, 1042.276, 68.38379, 2.33874, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 5346) +(@OGUID+1669, 181016, 0, 1, 1, -8562.563, 1016.086, 89.73065, 0.3490652, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1670, 181016, 0, 1, 1, -8350.607, 1093.494, 57.26217, 0.6806767, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1671, 181016, 0, 1, 1, -8336.738, 1109.575, 57.26216, 4.747296, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1672, 181016, 0, 1, 1, -8451.66, 1220.867, 5.646727, 3.036838, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4411) +(@OGUID+1673, 181016, 0, 1, 1, -8439.422, 1221.072, 5.661162, 0.122173, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4411) +(@OGUID+1674, 181016, 0, 1, 1, -8328.427, 1192.425, 5.818892, 1.832595, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4411) +(@OGUID+1675, 181016, 0, 1, 1, -8396.861, 1314.031, 5.981066, 6.143561, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4411) +(@OGUID+1676, 181016, 0, 1, 1, -8367.763, 1314.994, 6.094531, 3.211419, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4411) +(@OGUID+1677, 181016, 0, 1, 1, -8232.368, 1236.465, 5.230234, 2.879789, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4411) +(@OGUID+1678, 181016, 0, 1, 1, -8489.128, 1323.822, 5.894643, 0.087266, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4411) +(@OGUID+1679, 181016, 0, 1, 1, -8459.286, 1323.448, 5.861743, 3.159062, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4411) +(@OGUID+1680, 181016, 530, 1, 1, -4025.329, -11590.4, -138.3277, 1.762782, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1681, 181016, 530, 1, 1, -4040.372, -11581.41, -138.4519, 0.6806767, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1682, 181016, 530, 1, 1, -4006.567, -11572.73, -138.0419, 2.670348, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1683, 181016, 530, 1, 1, -4214.633, -12476, 45.07409, 5.497789, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1684, 181016, 530, 1, 1, -4212.527, -12510.34, 45.44406, 0.2268925, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1685, 181016, 530, 1, 1, -4209.379, -12517.65, 45.81722, 0.3316107, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1686, 181016, 530, 1, 1, -4185.712, -12504.83, 44.36132, 3.560473, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3576) +(@OGUID+1687, 181016, 530, 1, 1, -4176.958, -12493.97, 44.361, 1.361356, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3576) +(@OGUID+1688, 181016, 530, 1, 1, -4171.624, -12506.62, 44.36132, 5.550147, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3576) +(@OGUID+1689, 181016, 530, 1, 1, -4158.644, -12533.33, 45.45204, 2.129301, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3576) +(@OGUID+1690, 181016, 530, 1, 1, -4158.139, -12463.08, 45.08138, 3.717554, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3576) +(@OGUID+1691, 181016, 530, 1, 1, -4153.742, -12484.6, 44.51342, 3.909541, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3576) +(@OGUID+1692, 181016, 530, 1, 1, -4048.503, -13778.93, 75.01585, 0.2967052, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3527) +(@OGUID+1693, 181015, 530, 1, 1, -1742.215, 5135.275, -36.2613, 1.169369, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 3899) +(@OGUID+1694, 181015, 530, 1, 1, -1757.831, 5131.28, -36.26131, 0.9075702, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 3899) +(@OGUID+1695, 181015, 530, 1, 1, -2037.28, 5275.622, -39.58699, 0.5410506, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 0) +(@OGUID+1696, 181015, 530, 1, 1, -2059.588, 5316.215, -37.32355, 5.235988, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 3899) +(@OGUID+1697, 181015, 530, 1, 1, 9612.646, -7184.878, 14.28442, 3.316144, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 3487) +(@OGUID+1698, 181015, 530, 1, 1, 9611.202, -7185.08, 14.28158, 0, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 3487) +(@OGUID+1699, 181015, 530, 1, 1, 9610.517, -7182.689, 14.28269, 1.797689, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 3487) +(@OGUID+1700, 181015, 530, 1, 1, 9612.523, -7182.323, 14.28678, 1.675514, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 3487) +(@OGUID+1701, 181015, 530, 1, 1, 9611.927, -7184.979, 15.52289, 4.502952, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 3487) +(@OGUID+1702, 181015, 0, 1, 1, -4916.252, -984.5313, 501.4471, 2.879789, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 5342) +(@OGUID+1703, 181015, 0, 1, 1, -4917.014, -984.7448, 502.6873, 2.617989, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 5342) +(@OGUID+1704, 181015, 0, 1, 1, -4918.153, -982.1979, 501.4553, 2.199115, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 5342) +(@OGUID+1705, 181015, 0, 1, 1, -4917.79, -985.2344, 501.4486, 0, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 5342) +(@OGUID+1706, 181015, 0, 1, 1, -4919.722, -983.6129, 501.4555, 2.460913, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 5342) +(@OGUID+1707, 181015, 0, 1, 1, -8867.429, 637.0868, 95.78714, 0.6981314, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 5148) +(@OGUID+1708, 181015, 0, 1, 1, -8868.944, 638.5764, 95.78714, 4.136433, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 5148) +(@OGUID+1709, 181015, 0, 1, 1, -8870.591, 636.8524, 95.78714, 4.625124, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 5148) +(@OGUID+1710, 181015, 0, 1, 1, -8869.873, 636.4618, 97.00977, 0, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 5148) +(@OGUID+1711, 181015, 0, 1, 1, -8869.328, 635.8524, 95.78714, 4.625124, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 5148) +(@OGUID+1712, 181015, 0, 1, 1, -8973.23, 491.104, 97.0423, 2.076939, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 5148) +(@OGUID+1713, 181015, 0, 1, 1, -8987.81, 509.179, 97.0711, 5.480334, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 5148) +(@OGUID+1714, 181015, 1, 1, 1, 9871.61, 2494.44, 1315.87, 6.003934, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 0) +(@OGUID+1715, 181015, 1, 1, 1, 9868.24, 2493.52, 1315.87, 0, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 0) +(@OGUID+1716, 181015, 1, 1, 1, 9868.4, 2494.36, 1317.11, 5.707228, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 0) +(@OGUID+1717, 181015, 1, 1, 1, 9868.74, 2495.04, 1315.87, 5.916668, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 0) +(@OGUID+1718, 181015, 1, 1, 1, 9870.92, 2492.5, 1315.87, 5.916668, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 0) +(@OGUID+1719, 181015, 530, 1, 1, -4004.693, -11842.24, 0.201654, 0, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 0) +(@OGUID+1720, 181015, 530, 1, 1, -4004.752, -11845.42, 0.192709, 4.642576, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 0) +(@OGUID+1721, 181015, 530, 1, 1, -4006.262, -11842.13, 0.18635, 4.153885, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 0) +(@OGUID+1722, 181015, 530, 1, 1, -4005.507, -11842.26, 1.427111, 4.886924, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 0) +(@OGUID+1723, 181015, 530, 1, 1, -4006.776, -11844.98, 0.173841, 4.468043, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 0) +(@OGUID+1724, 181014, 571, 1, 1, 5353.096, -2653.161, 310.5197, 3.857183, 0, 0, 0, 1, 120, 255, 1), -- 181014 (Area: 0) +(@OGUID+1725, 181014, 571, 1, 1, 5391.959, -2692.568, 310.2863, 3.874631, 0, 0, 0, 1, 120, 255, 1), -- 181014 (Area: 0) +(@OGUID+1726, 181014, 571, 1, 1, 3802.911, 1477.594, 94.39955, 3.263772, 0, 0, 0, 1, 120, 255, 1), -- 181014 (Area: 4165) +(@OGUID+1727, 181014, 571, 1, 1, 3771.654, 1596.684, 107.9985, 5.009095, 0, 0, 0, 1, 120, 255, 1), -- 181014 (Area: 4165) +(@OGUID+1728, 181014, 571, 1, 1, 3787.579, 1624.979, 107.0998, 0.2967052, 0, 0, 0, 1, 120, 255, 1), -- 181014 (Area: 4165) +(@OGUID+1729, 181014, 571, 1, 1, 2754.732, 6279.374, 181.2734, 2.286379, 0, 0, 0, 1, 120, 255, 1), -- 181014 (Area: 4129) +(@OGUID+1730, 181014, 530, 1, 1, -2054.687, 5229.547, -21.3585, 0.7679439, 0, 0, 0, 1, 120, 255, 1), -- 181014 (Area: 0) +(@OGUID+1731, 181014, 530, 1, 1, 9698.271, -7053.018, 22.76448, 4.729844, 0, 0, 0, 1, 120, 255, 1), -- 181014 (Area: 3487) +(@OGUID+1732, 181060, 571, 1, 1, 6676.038, -197.873, 951.159, 3.33359, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4428) +(@OGUID+1733, 181060, 571, 1, 1, 6676.64, -200.5191, 951.2183, 3.316144, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4428) +(@OGUID+1734, 181060, 571, 1, 1, 6692.196, -262.1433, 956.036, 3.124123, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4428) +(@OGUID+1735, 181060, 571, 1, 1, 6693.974, -261.8266, 956.4064, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4428) +(@OGUID+1736, 181060, 571, 1, 1, 5173.95, -2179.033, 236.5379, 6.143561, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1737, 181060, 571, 1, 1, 5148.001, -2198.408, 237.614, 5.707228, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1738, 181060, 571, 1, 1, 5190.736, -2212.201, 239.3978, 2.513274, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1739, 181060, 571, 1, 1, 5134.635, -2201.145, 238.8165, 0.4014249, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1740, 181060, 571, 1, 1, 5143.447, -2210.877, 237.8243, 0.157079, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1741, 181060, 571, 1, 1, 5380.456, -2636.633, 304.966, 3.106652, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1742, 181060, 571, 1, 1, 5407.522, -2646.742, 305.2902, 3.141593, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1743, 181060, 571, 1, 1, 5407.927, -2617.18, 305.2808, 2.984498, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1744, 181060, 571, 1, 1, 5410.432, -2652.655, 306.231, 2.635444, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1745, 181060, 571, 1, 1, 5465.895, -2590.533, 304.9167, 1.431168, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4275) +(@OGUID+1746, 181060, 571, 1, 1, 5435.949, -2590.28, 304.9167, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4275) +(@OGUID+1747, 181060, 571, 1, 1, 5492.635, -2649.156, 305.2701, 3.089183, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4275) +(@OGUID+1748, 181060, 571, 1, 1, 5492.885, -2617.632, 305.2991, 0.03490625, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4275) +(@OGUID+1749, 181060, 571, 1, 1, 5500.449, -2662.013, 304.9659, 6.161013, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4275) +(@OGUID+1750, 181060, 571, 1, 1, 5524.156, -2679.053, 305.1702, 1.291542, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4275) +(@OGUID+1751, 181060, 571, 1, 1, 5759.467, -3565.396, 388.2509, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4324) +(@OGUID+1752, 181060, 571, 1, 1, 5767.891, -3581.12, 388.5618, 4.747296, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4324) +(@OGUID+1753, 181060, 571, 1, 1, 5771.673, -3602.202, 388.4206, 2.495818, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4324) +(@OGUID+1754, 181060, 571, 1, 1, 5768.993, -3564.651, 388.132, 1.675514, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4324) +(@OGUID+1755, 181060, 571, 1, 1, 5760.941, -3580.523, 388.6815, 4.66003, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4324) +(@OGUID+1756, 181060, 571, 1, 1, 5800.075, -3557.563, 389.7701, 0.3316107, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4323) +(@OGUID+1757, 181060, 571, 1, 1, 5796.288, -3573.157, 388.1471, 3.211419, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4323) +(@OGUID+1758, 181060, 571, 1, 1, 5794.419, -3557.554, 388.8964, 3.176533, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4323) +(@OGUID+1759, 181060, 571, 1, 1, 5801.048, -3572.997, 389.0887, 3.019413, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4323) +(@OGUID+1760, 181060, 571, 1, 1, 3873.443, -4541.185, 210.1433, 4.188792, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1761, 181060, 571, 1, 1, 3876.738, -4547.531, 210.9673, 5.183629, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1762, 181060, 571, 1, 1, 3862.321, -4549.055, 211.5898, 2.757613, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1763, 181060, 571, 1, 1, 3408.684, -2785.898, 202.9841, 5.323256, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1764, 181060, 571, 1, 1, 3411.444, -2783.841, 202.9332, 5.358162, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1765, 181060, 571, 1, 1, 3421.057, -2770.74, 201.4035, 5.340709, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1766, 181060, 571, 1, 1, 3313.647, -2337.281, 112.4452, 0.157079, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1767, 181060, 571, 1, 1, 3201.634, -2297.767, 109.0517, 0.2792516, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4248) +(@OGUID+1768, 181060, 571, 1, 1, 3240.247, -2236.566, 117.1561, 4.607672, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4206) +(@OGUID+1769, 181060, 571, 1, 1, 1456.939, -3279.144, 173.5854, 0.9250238, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4071) +(@OGUID+1770, 181060, 571, 1, 1, 1454.438, -3273.762, 173.5819, 5.602507, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4071) +(@OGUID+1771, 181060, 571, 1, 1, 1458.552, -3277.082, 173.5854, 2.44346, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4071) +(@OGUID+1772, 181060, 571, 1, 1, 1457.29, -3270.155, 173.5816, 5.567601, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4071) +(@OGUID+1773, 181060, 571, 1, 1, 1445.745, -3269.811, 179.7056, 2.373644, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4071) +(@OGUID+1774, 181060, 571, 1, 1, 1447.377, -3267.913, 179.7009, 2.426008, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4071) +(@OGUID+1775, 181060, 571, 1, 1, 1445.814, -3264.554, 168.441, 5.550147, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 3998) +(@OGUID+1776, 181060, 571, 1, 1, 1447.826, -3262.189, 168.441, 5.550147, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 3998) +(@OGUID+1777, 181060, 571, 1, 1, 606.9359, -4923.435, 24.95922, 1.919862, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1778, 181060, 571, 1, 1, 601.9346, -4924.686, 24.95571, 1.745327, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1779, 181060, 571, 1, 1, 600.7967, -4920.292, 24.95571, 3.368496, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1780, 181060, 571, 1, 1, 607.8849, -4925.905, 24.95922, 3.298687, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1781, 181055, 1, 1, 1, 7862.05, -2568.29, 499.327, 0.1047193, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 656) +(@OGUID+1782, 181055, 1, 1, 1, 7958.75, -2575.71, 501.371, 3.124123, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 656) +(@OGUID+1783, 181055, 1, 1, 1, 8013.66, -2637.12, 523.791, 1.727875, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 656) +(@OGUID+1784, 181055, 1, 1, 1, 7917.81, -2496.79, 496.893, 0.122173, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 656) +(@OGUID+1785, 181055, 1, 1, 1, 7918.85, -2507.95, 496.78, 0.05235888, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 656) +(@OGUID+1786, 181055, 1, 1, 1, 7916.47, -2485.73, 496.947, 0.1396245, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 2361) +(@OGUID+1787, 181055, 1, 1, 1, 7856.99, -2491.97, 497.065, 3.194002, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 2361) +(@OGUID+1788, 181055, 1, 1, 1, 7859.37, -2514.28, 496.969, 3.281239, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 2361) +(@OGUID+1789, 181055, 1, 1, 1, 7857.99, -2503.12, 496.981, 3.228859, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 2361) +(@OGUID+1790, 181055, 1, 1, 1, 7883.59, -2461.34, 503.191, 1.692969, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 2361) +(@OGUID+1791, 181055, 1, 1, 1, 7831.7, -2476.79, 502.888, 4.76475, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 2361) +(@OGUID+1792, 181055, 1, 1, 1, 7830.23, -2446.4, 503.081, 1.605702, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 2361) +(@OGUID+1793, 181055, 571, 1, 1, 5762.126, 588.5176, 618.8284, 0.8901166, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4395) +(@OGUID+1794, 181055, 571, 1, 1, 5659.443, 679.3284, 661.8507, 5.864307, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4568) +(@OGUID+1795, 181055, 571, 1, 1, 5948.385, 621.1386, 660.8089, 2.775069, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4613) +(@OGUID+1796, 181055, 571, 1, 1, 5418.945, -2609.535, 310.7752, 3.124123, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1797, 181055, 571, 1, 1, 5418.217, -2654.892, 310.6752, 3.124123, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1798, 181055, 571, 1, 1, 5427.37, -2617.239, 310.7862, 4.694937, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1799, 181055, 571, 1, 1, 5427.162, -2601.81, 310.7791, 1.553341, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1800, 181055, 571, 1, 1, 5426.538, -2647.546, 310.7589, 1.553341, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1801, 181055, 571, 1, 1, 5435.416, -2610.136, 310.76, 6.265733, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1802, 181055, 571, 1, 1, 5465.976, -2609.939, 310.7266, 3.124123, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4275) +(@OGUID+1803, 181055, 571, 1, 1, 5472.982, -2649.109, 310.3139, 1.623156, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4275) +(@OGUID+1804, 181055, 571, 1, 1, 5473.117, -2618.065, 310.7838, 4.694937, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4275) +(@OGUID+1805, 181055, 571, 1, 1, 5474.365, -2602.701, 310.6908, 1.553341, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4275) +(@OGUID+1806, 181055, 571, 1, 1, 5482.347, -2610.531, 310.6789, 6.265733, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4275) +(@OGUID+1807, 181055, 571, 1, 1, 5481.421, -2655.851, 310.4912, 0, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4275) +(@OGUID+1808, 181055, 571, 1, 1, 5779.607, -3647.157, 397.0788, 4.81711, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4324) +(@OGUID+1809, 181055, 571, 1, 1, 3415.612, -2804.818, 207.8745, 5.340709, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1810, 181055, 571, 1, 1, 3426.07, -2797.111, 207.806, 5.340709, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1811, 181055, 571, 1, 1, 3404.855, -2779.617, 207.3744, 2.216565, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1812, 181055, 571, 1, 1, 3272.992, -2376.118, 126.1801, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1813, 181055, 571, 1, 1, 3248.334, -2376.13, 125.8163, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1814, 181055, 571, 1, 1, 3220.808, -2360.816, 129.0979, 0.5585039, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1815, 181055, 571, 1, 1, 3194.915, -2304.803, 131.4482, 0.157079, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1816, 181055, 571, 1, 1, 3207.483, -2339.074, 129.0386, 0.5410506, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1817, 181055, 571, 1, 1, 3313.64, -2339.259, 135.3806, 2.460913, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1818, 181055, 571, 1, 1, 3191.102, -2279.254, 131.5012, 0.1396245, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4248) +(@OGUID+1819, 181055, 571, 1, 1, 3351.668, -2245.885, 137.426, 3.159062, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4206) +(@OGUID+1820, 181055, 571, 1, 1, 3331.027, -2305.595, 137.5376, 2.705255, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4206) +(@OGUID+1821, 181055, 571, 1, 1, 3342.094, -2281.307, 137.6798, 2.705255, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4206) +(@OGUID+1822, 181055, 571, 1, 1, 3325.675, -2187.142, 134.1245, 3.787367, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4206) +(@OGUID+1823, 181055, 571, 1, 1, 2495.748, -1930.493, 18.89087, 0.5934101, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4242) +(@OGUID+1824, 181055, 571, 1, 1, 2510.754, -1823.163, 18.16746, 5.515242, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4242) +(@OGUID+1825, 181055, 571, 1, 1, 2508.891, -1811.156, 18.57204, 0.802851, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4242) +(@OGUID+1826, 181055, 571, 1, 1, 2502.159, -1831.973, 18.18279, 5.480334, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4242) +(@OGUID+1827, 181055, 571, 1, 1, 2493.719, -1840.646, 18.18876, 5.515242, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4242) +(@OGUID+1828, 181055, 571, 1, 1, 2482.121, -1838.097, 19.10611, 3.926996, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4242) +(@OGUID+1829, 181055, 571, 1, 1, 4502.594, 5701.009, 86.9327, 3.804818, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1830, 181055, 571, 1, 1, 4520.103, 5699.374, 86.98763, 5.375615, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1831, 181055, 571, 1, 1, 4505.328, 5718.376, 87.04783, 2.234018, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1832, 181055, 571, 1, 1, 4522.387, 5716.762, 86.95365, 0.6632232, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4122) +(@OGUID+1833, 181055, 530, 1, 1, -1730.328, 5649.338, 136.299, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3899) +(@OGUID+1834, 181055, 530, 1, 1, -1645.066, 5192.24, -27.42542, 2.565632, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3899) +(@OGUID+1835, 181055, 530, 1, 1, -1759.38, 5167.662, -28.72669, 1.902409, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3899) +(@OGUID+1836, 181055, 530, 1, 1, -2056.806, 5228.367, -27.39764, 0.7504908, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1837, 181055, 530, 1, 1, -2138.824, 5148.72, -8.640973, 3.944446, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1838, 181055, 530, 1, 1, -1864.128, 4999.87, -8.724302, 4.66003, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1839, 181055, 530, 1, 1, -1552.944, 5125.714, -8.696525, 5.689774, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1840, 181055, 530, 1, 1, -2625.937, 4419.99, 42.99473, 4.572764, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3683) +(@OGUID+1841, 181055, 530, 1, 1, -3080.017, 2519.666, 75.95196, 0.3490652, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3744) +(@OGUID+1842, 181055, 530, 1, 1, -3097.624, 2522.847, 75.95374, 2.44346, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3744) +(@OGUID+1843, 181055, 530, 1, 1, -3088.047, 2526.28, 75.9549, 1.396262, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3744) +(@OGUID+1844, 181055, 530, 1, 1, -3092.005, 2502.068, 76.35168, 4.555311, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3744) +(@OGUID+1845, 181055, 530, 1, 1, -3099.529, 2512.387, 75.96468, 3.490667, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3744) +(@OGUID+1846, 181055, 530, 1, 1, -3081.95, 2509.127, 75.9601, 5.585054, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3744) +(@OGUID+1847, 181055, 530, 1, 1, -2980.738, 2565.908, 97.9761, 2.705255, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3744) +(@OGUID+1848, 181055, 530, 1, 1, -2978.653, 2545.87, 97.51945, 3.787367, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3744) +(@OGUID+1849, 181055, 530, 1, 1, -2960.054, 2536.851, 96.74974, 4.81711, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3744) +(@OGUID+1850, 181055, 530, 1, 1, -2944.712, 2569.651, 97.11517, 0.6108634, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3744) +(@OGUID+1851, 181055, 530, 1, 1, -2963.106, 2578.467, 97.77729, 1.658062, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3744) +(@OGUID+1852, 181055, 530, 1, 1, -2943.146, 2549.089, 96.68553, 5.846854, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3744) +(@OGUID+1853, 181055, 530, 1, 1, -3956.793, 2241.567, 107.9687, 4.572764, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3745) +(@OGUID+1854, 181055, 530, 1, 1, -4044.765, 2237.184, 118.0772, 5.515242, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3745) +(@OGUID+1855, 181055, 530, 1, 1, -4063.29, 2183.958, 117.962, 0.03490625, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3745) +(@OGUID+1856, 181055, 530, 1, 1, -4053.135, 2167.243, 117.8958, 0.01745246, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3745) +(@OGUID+1857, 181055, 530, 1, 1, -4063.405, 2159.092, 117.9386, 4.729844, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3745) +(@OGUID+1858, 181055, 530, 1, 1, -4114.495, 1119.618, 52.38124, 5.742135, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3929) +(@OGUID+1859, 181055, 530, 1, 1, -3006.023, 795.2581, -1.891022, 2.565632, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3754) +(@OGUID+1860, 181055, 530, 1, 1, -716.8414, 2735.047, 100.798, 3.141593, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3538) +(@OGUID+1861, 181055, 530, 1, 1, -717.3152, 2750.212, 100.8153, 3.176533, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3538) +(@OGUID+1862, 181055, 530, 1, 1, -699.2603, 2709.337, 101.0987, 4.694937, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3538) +(@OGUID+1863, 181055, 530, 1, 1, -690.6761, 2732.448, 100.9171, 6.265733, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3538) +(@OGUID+1864, 181055, 530, 1, 1, -690.3901, 2717.364, 101.012, 0, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3538) +(@OGUID+1865, 181055, 530, 1, 1, 175.2291, 2619.424, 98.45457, 2.18166, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3536) +(@OGUID+1866, 181055, 530, 1, 1, 187.7007, 2628.467, 98.74133, 2.164206, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3536) +(@OGUID+1867, 181055, 530, 1, 1, 203.049, 4333.749, 125.1613, 3.141593, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3552) +(@OGUID+1868, 181055, 530, 1, 1, -223.1397, 5396.124, 40.32872, 1.867502, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3521) +(@OGUID+1869, 181055, 530, 1, 1, -222.4095, 5391.945, 40.32674, 4.921829, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3521) +(@OGUID+1870, 181055, 530, 1, 1, -341.6888, 5481.863, 37.94325, 3.054327, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3565) +(@OGUID+1871, 181055, 530, 1, 1, -337.4103, 5481.802, 37.91649, 6.161013, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3565) +(@OGUID+1872, 181055, 530, 1, 1, -186.2492, 5519.735, 33.73346, 3.455756, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3565) +(@OGUID+1873, 181055, 530, 1, 1, -181.5449, 5532.257, 33.22929, 1.884953, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3565) +(@OGUID+1874, 181055, 530, 1, 1, -175.3683, 5512.138, 33.37462, 5.026549, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3565) +(@OGUID+1875, 181055, 530, 1, 1, -166.1566, 5537.293, 33.22692, 1.884953, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3565) +(@OGUID+1876, 181055, 530, 1, 1, -96.04215, 5545.813, 45.60166, 3.089183, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3565) +(@OGUID+1877, 181055, 530, 1, 1, -91.70524, 5545.659, 45.61694, 6.178466, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3565) +(@OGUID+1878, 181055, 530, 1, 1, -159.9268, 5517.314, 33.24236, 5.026549, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3565) +(@OGUID+1879, 181055, 530, 1, 1, -155.342, 5529.741, 33.96249, 0.3141584, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3565) +(@OGUID+1880, 181055, 530, 1, 1, -1260.943, 7180.634, 63.39374, 2.565632, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3613) +(@OGUID+1881, 181055, 530, 1, 1, 1044.882, 7361.025, 45.56539, 3.874631, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3766) +(@OGUID+1882, 181055, 530, 1, 1, 1941.395, 6838.657, 177.4772, 0.01745246, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3771) +(@OGUID+1883, 181055, 530, 1, 1, 1937.434, 6838.64, 177.4422, 3.194002, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3771) +(@OGUID+1884, 181055, 530, 1, 1, 2085.431, 6890.104, 190.4657, 3.944446, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3772) +(@OGUID+1885, 181055, 530, 1, 1, 2095.052, 6899.62, 190.4382, 3.944446, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3772) +(@OGUID+1886, 181055, 530, 1, 1, 2070.803, 6759.671, 173.2742, 4.694937, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3772) +(@OGUID+1887, 181055, 530, 1, 1, 2055.827, 6759.792, 173.2742, 4.729844, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3772) +(@OGUID+1888, 181055, 530, 1, 1, 2066.258, 6730.639, 181.5167, 1.518436, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3772) +(@OGUID+1889, 181055, 530, 1, 1, 2066.148, 6726.275, 181.5531, 4.747296, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3772) +(@OGUID+1890, 181055, 530, 1, 1, 2944.296, 5533.428, 163.821, 2.565632, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3828) +(@OGUID+1891, 181055, 530, 1, 1, 3085.633, 5473.628, 162.5824, 0.2967052, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3951) +(@OGUID+1892, 181055, 530, 1, 1, 2940.299, 5415.802, 165.9382, 4.084071, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3951) +(@OGUID+1893, 181055, 530, 1, 1, 2090.407, 4769.771, 175.6497, 4.921829, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3827) +(@OGUID+1894, 181055, 530, 1, 1, 2092.127, 4792.164, 175.6362, 1.134463, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3827) +(@OGUID+1895, 181055, 530, 1, 1, 2098.946, 4779.432, 175.5325, 6.178466, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3827) +(@OGUID+1896, 181055, 530, 1, 1, 2078.747, 4789.831, 175.6968, 2.391098, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3827) +(@OGUID+1897, 181055, 530, 1, 1, 3018.137, 3748.76, 151.2779, 1.291542, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3712) +(@OGUID+1898, 181055, 530, 1, 1, 2948.536, 3719.698, 150.2694, 3.124123, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3712) +(@OGUID+1899, 181055, 530, 1, 1, 3044.282, 3608.729, 150.461, 4.729844, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3712) +(@OGUID+1900, 181055, 530, 1, 1, 3116.458, 3688.845, 150.6044, 0.5585039, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3712) +(@OGUID+1901, 181055, 530, 1, 1, 4116.873, 3058.359, 349.9748, 5.131269, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3738) +(@OGUID+1902, 181055, 530, 1, 1, 4184.254, 3009.556, 349.8448, 3.124123, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3738) +(@OGUID+1903, 181055, 530, 1, 1, 4118.572, 2954.05, 360.3641, 1.605702, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3738) +(@OGUID+1904, 181055, 530, 1, 1, 2984.813, 1803.785, 146.0861, 0.6632232, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3728) +(@OGUID+1905, 181055, 530, 1, 1, 2969.402, 1791.448, 145.6347, 3.769912, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3724) +(@OGUID+1906, 181055, 530, 1, 1, 9954.997, -7098.571, 59.86189, 3.996807, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3487) +(@OGUID+1907, 181055, 530, 1, 1, 9992.33, -7205.063, 44.06255, 2.18166, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3487) +(@OGUID+1908, 181055, 530, 1, 1, 10002.23, -7202.467, 44.06782, 1.466076, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3487) +(@OGUID+1909, 181055, 530, 1, 1, 10007.34, -7030.903, 57.97285, 4.06662, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3487) +(@OGUID+1910, 181055, 530, 1, 1, 10010.68, -7199.167, 44.22095, 2.478367, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3487) +(@OGUID+1911, 181055, 530, 1, 1, 9952.419, -7232.268, 43.9028, 2.234018, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3487) +(@OGUID+1912, 181055, 530, 1, 1, 9945.498, -7242.049, 43.90578, 2.792518, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3487) +(@OGUID+1913, 181055, 0, 1, 1, -8341.17, 615.349, 104.273, 2.234018, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 5150) +(@OGUID+1914, 181055, 0, 1, 1, -8605.4, 391.313, 114.686, 2.234018, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 5390) +(@OGUID+1915, 181055, 0, 1, 1, -8610.86, 398.378, 114.794, 2.234018, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 5390) +(@OGUID+1916, 181055, 0, 1, 1, -8616.79, 405.722, 114.684, 2.234018, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 5390) +(@OGUID+1917, 181055, 0, 1, 1, -8845.916, 468.9219, 122.3519, 3.804818, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 5148) +(@OGUID+1918, 181055, 0, 1, 1, -8892.52, 867.236, 109.002, 0.9250238, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 5390) +(@OGUID+1919, 181055, 0, 1, 1, -8937.31, 861.234, 119.3, 6.213374, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 5390) +(@OGUID+1920, 181055, 0, 1, 1, -8914.21, 995.188, 129.577, 4.188792, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 5390) +(@OGUID+1921, 181055, 0, 1, 1, -8948.17, 861.865, 119.265, 2.967041, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 5390) +(@OGUID+1922, 181055, 0, 1, 1, -8630.926, 945.2589, 136.5359, 3.822273, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 5151) +(@OGUID+1923, 181055, 0, 1, 1, -8578.42, 986.8, 133.948, 0.6806767, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 5151) +(@OGUID+1924, 181055, 0, 1, 1, -8523.936, 930.3209, 108.977, 1.53589, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 5151) +(@OGUID+1925, 181055, 1, 1, 1, 10144.4, 2233.66, 1352.2, 2.199115, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 1659) +(@OGUID+1926, 181055, 1, 1, 1, 10130.9, 2224.82, 1352.22, 2.111848, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 1659) +(@OGUID+1927, 181055, 1, 1, 1, 10119.3, 2216.15, 1351.82, 2.199115, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 1659) +(@OGUID+1928, 181017, 0, 1, 1, -8624.95, 933.507, 125.42, 3.839725, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 5151) +(@OGUID+1929, 181017, 0, 1, 1, -8641.03, 953.563, 125.408, 3.822273, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 5151) +(@OGUID+1930, 181017, 0, 1, 1, -8568.147, 978.654, 122.7587, 3.804818, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 5151) +(@OGUID+1931, 181017, 0, 1, 1, -8584.17, 998.563, 122.819, 0.6806767, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 5151) +(@OGUID+1932, 181017, 0, 1, 1, -8504.936, 1192.633, 16.33525, 0.5410506, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4411) +(@OGUID+1933, 181017, 0, 1, 1, -8512.316, 1200.338, 16.39689, 0.9250238, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4411) +(@OGUID+1934, 181017, 0, 1, 1, -8520.524, 1204.205, 16.42972, 1.396262, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4411) +(@OGUID+1935, 181017, 0, 1, 1, -8542.321, 1200.581, 16.43208, 2.129301, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4411) +(@OGUID+1936, 181017, 0, 1, 1, -8534.486, 1204.204, 16.40989, 1.745327, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4411) +(@OGUID+1937, 181017, 0, 1, 1, -8276.106, 1193.003, 16.38176, 2.495818, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4411) +(@OGUID+1938, 181017, 0, 1, 1, -8268.55, 1200.73, 16.45654, 2.146753, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4411) +(@OGUID+1939, 181017, 0, 1, 1, -8238.383, 1200.478, 16.38265, 0.9424766, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4411) +(@OGUID+1940, 181017, 0, 1, 1, -8246.669, 1204.407, 16.31734, 1.378809, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4411) +(@OGUID+1941, 181017, 0, 1, 1, -8260.668, 1204.398, 16.41504, 1.710422, 0, 0, 0, 1, 120, 255, 1); -- 181017 (Area: 4411) + +DELETE FROM `game_event_gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+1941 AND `eventEntry`=@Event; +INSERT INTO `game_event_gameobject` SELECT @Event, gameobject.guid FROM `gameobject` WHERE gameobject.guid BETWEEN @OGUID+0 AND @OGUID+1941; + +DELETE FROM `gameobject` WHERE `guid` IN (24399, 24400, 24401, 24402, 24405); + +UPDATE `creature` SET `position_x`=9616.942, `position_y`=-7181.332, `position_z`=14.3793, `orientation`=2.303835 WHERE `guid`=208827; +UPDATE `creature` SET `position_x`=9612.548, `position_y`=-7182.34, `position_z`=15.55145, `orientation`=1.762783 WHERE `guid`=208800; +UPDATE `creature` SET `position_x`=-4918.147, `position_y`=-982.1111, `position_z`=502.7113, `orientation`=2.234021 WHERE `guid`=208797; +UPDATE `creature` SET `position_x`=-8867.42, `position_y`=637.047, `position_z`=97.03574, `orientation`=0.8203048 WHERE `guid`=208798; +UPDATE `creature` SET `position_x`=9870.95, `position_y`=2492.47, `position_z`=1317.113, `orientation`=5.969026 WHERE `guid`=208799; +UPDATE `creature` SET `position_x`=-4006.774, `position_y`=-11844.94, `position_z`=1.430115, `orientation`=4.468043 WHERE `guid`=208796; +UPDATE `creature` SET `position_x`=9610.493, `position_y`=-7182.677, `position_z`=15.53905, `orientation`=1.850049 WHERE `guid`=208808; +UPDATE `creature` SET `position_x`=-4919.688, `position_y`=-983.6163, `position_z`=502.6961, `orientation`=2.949606 WHERE `guid`=208810; +UPDATE `creature` SET `position_x`=-8868.953, `position_y`=638.5087, `position_z`=97.03911, `orientation`=1.466077 WHERE `guid`=208806; +UPDATE `creature` SET `position_x`=9871.64, `position_y`=2494.43, `position_z`=1317.123, `orientation`=6.021386 WHERE `guid`=208807; +UPDATE `creature` SET `position_x`=-4004.755, `position_y`=-11845.5, `position_z`=1.443716, `orientation`=4.782202 WHERE `guid`=208811; +UPDATE `creature` SET `position_x`=9586.303, `position_y`=-7181.014, `position_z`=14.32427, `orientation`=0 WHERE `guid`=208833; diff --git a/sql/updates/world/2016_02_25_00_world.sql b/sql/updates/world/2016_02_25_00_world.sql new file mode 100644 index 00000000000..346c77bee43 --- /dev/null +++ b/sql/updates/world/2016_02_25_00_world.sql @@ -0,0 +1,5 @@ +-- Create gossip_menu_option 7731,7732 for NPC 18588 Floon in Terokkar Forest +DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (7731,7732) AND `id` = 0; +INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`OptionBroadcastTextID`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`,`BoxBroadcastTextID`) VALUES +(7731,0,0,'He wants his "golds." Pay up or die... again...',15564,1,1,0,0,0,0,'',0), +(7732,0,0,"I have been sent by Sal'salabim to collect a debt that you owe. Pay up or I'm going to have to hurt you.",15560,1,1,0,0,0,0,'',0); diff --git a/sql/updates/world/2016_02_25_01_world_335.sql b/sql/updates/world/2016_02_25_01_world_335.sql new file mode 100644 index 00000000000..473cbd506ce --- /dev/null +++ b/sql/updates/world/2016_02_25_01_world_335.sql @@ -0,0 +1,25 @@ +-- new gossip_menus for Quest 5742 Redemption (Tirion's Tale) +DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (3502,3681,3682,3683) AND `id` = 0; +INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`OptionBroadcastTextID`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`,`BoxBroadcastTextID`) VALUES +(3502, 0,0, 'I am ready to hear your tale, Tirion.', 7219, 1,1, 3681, 0,0,0,'',0), +(3681, 0,0, 'Thank you, Tirion. What of your identity?', 7221, 1,1, 3682, 0,0,0,'',0), +(3682, 0,0, 'That is terrible.', 7223, 1,1, 3683, 0,0,0,'',0), +(3683, 0,0, 'I will, Tirion.', 7225, 1,1, 0, 0,0,0,'',0); + +-- update creature entry 1855 Tirion Fordring +UPDATE `creature_template` SET `AIName` = 'SmartAI', `ScriptName`= '' WHERE `entry` = 1855; + +-- SmartAI script actions for Quest 5742 Redemption (Tirion's Tale) +DELETE FROM `smart_scripts` WHERE `entryorguid`= 1855 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 +(1855,0, 0,0, 62, 0,100,0, 3502, 0,0,0, 98, 3681, 4493, 0,0,0,0, 7,0,0,0,0,0,0,0, 'Tirion Fordring - on gossip_menu 3502 selected - Send Gossip text 4493 with menu option 3681'), +(1855,0, 1,0, 62, 0,100,0, 3681, 0,0,0, 98, 3682, 4494, 0,0,0,0, 7,0,0,0,0,0,0,0, 'Tirion Fordring - on gossip_menu 3681 selected - Send Gossip text 4494 with menu option 3682'), +(1855,0, 2,0, 62, 0,100,0, 3682, 0,0,0, 98, 3683, 4495, 0,0,0,0, 7,0,0,0,0,0,0,0, 'Tirion Fordring - on gossip_menu 3682 selected - Send Gossip text 4495 with menu option 3683'), +(1855,0, 3,4, 62, 0,100,0, 3683, 0,0,0, 15, 5742, 0, 0,0,0,0, 7,0,0,0,0,0,0,0, 'Tirion Fordring - on gossip_menu 3683 selected - Give credit for Quest 5742 Redemption'), +(1855,0, 4,0, 61, 0,100,0, 0, 0,0,0, 72, 0, 0, 0,0,0,0, 7,0,0,0,0,0,0,0, 'Tirion Fordring - on gossip_menu 3683 selected - Close Gossip'); + +-- conditions for Quest 5742 Redemption (Tirion's Tale) +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`= 15 AND `SourceGroup`= 3502; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(15, 3502,0, 0,1, 9,0, 5742, 0,0,0,0,0, '', 'Show gossip menu option 3502 only if Quest 5742 is taken (active)'), +(15, 3502,0, 0,1, 41,0, 1, 1,0,0,0,0, '', 'Show gossip menu option 3502 only if player is sitting (any type)'); diff --git a/sql/updates/world/2016_02_25_02_world.sql b/sql/updates/world/2016_02_25_02_world.sql new file mode 100644 index 00000000000..c5355b13c29 --- /dev/null +++ b/sql/updates/world/2016_02_25_02_world.sql @@ -0,0 +1,109 @@ +SET @CGUID := 86984; + +DELETE FROM `creature` WHERE `id`=24110 AND `guid` BETWEEN @CGUID+0 AND @CGUID+31; +INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `MovementType`) VALUES +(@CGUID+0, 24110, 571, 1, 1, 2480.52, -405.0309, 31.25292, 1.954769, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+1, 24110, 571, 1, 1, 2485.832, -406.4011, 38.64569, 1.937315, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+2, 24110, 571, 1, 1, 2483.247, -405.9387, 35.05476, 4.991642, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+3, 24110, 571, 1, 1, 2477.307, -404.4191, 27.71297, 2.530727, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+4, 24110, 571, 1, 1, 2490.05, -404.6198, 27.34736, 0, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+5, 24110, 571, 1, 1, 2486.804, -396.4983, 37.61678, 6.248279, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+6, 24110, 571, 1, 1, 2473.764, -403.68, 23.80915, 3.246312, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+7, 24110, 571, 1, 1, 2489.167, -395.6806, 28.83605, 0.01745329, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+8, 24110, 571, 1, 1, 2488.105, -403.3663, 35.30573, 2.80998, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+9, 24110, 571, 1, 1, 2457.642, -389.6918, 23.55255, 6.143559, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+10, 24110, 571, 1, 1, 2469.61, -402.5246, 21.45798, 4.08407, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+11, 24110, 571, 1, 1, 2454.252, -397.5855, 51.25713, 0.03490658, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+12, 24110, 571, 1, 1, 2457.418, -405.3847, 30.72205, 6.213372, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+13, 24110, 571, 1, 1, 2483.101, -393.8391, 43.72463, 2.897247, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+14, 24110, 571, 1, 1, 2455.441, -395.9613, 42.66463, 0.05235988, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+15, 24110, 571, 1, 1, 2454.66, -404.776, 48.54633, 6.143559, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+16, 24110, 571, 1, 1, 2458.783, -404.1076, 23.79817, 6.265732, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+17, 24110, 571, 1, 1, 2458.11, -410.4796, 22.85155, 6.195919, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+18, 24110, 571, 1, 1, 2481.292, -393.944, 40.58387, 4.171337, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+19, 24110, 571, 1, 1, 2457.773, -397.1545, 31.50192, 6.195919, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+20, 24110, 571, 1, 1, 2469.01, -396.4393, 25.475, 0.2792527, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+21, 24110, 571, 1, 1, 2478.411, -394.4479, 36.02073, 4.223697, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+22, 24110, 571, 1, 1, 2456.78, -389.8281, 32.9614, 0, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+23, 24110, 571, 1, 1, 2460.665, -399.6276, 19.7543, 3.089233, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+24, 24110, 571, 1, 1, 2476.166, -394.8342, 31.92243, 1.27409, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+25, 24110, 571, 1, 1, 2455.731, -404.8611, 40.88202, 6.213372, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+26, 24110, 571, 1, 1, 2460.889, -401.5321, 19.4641, 5.131268, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+27, 24110, 571, 1, 1, 2464.679, -397.7112, 21.8534, 5.113815, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+28, 24110, 571, 1, 1, 2464.713, -401.7634, 19.7663, 0.06981317, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+29, 24110, 571, 1, 1, 2456.293, -412.3963, 29.24669, 6.073746, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+30, 24110, 571, 1, 1, 2472.812, -395.45, 28.40558, 3.368485, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+31, 24110, 571, 1, 1, 2458.6, -396.5036, 23.42054, 6.248279, 120, 0, 0); -- 24110 (Area: 4181) + +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=28013; +UPDATE `creature_template` SET `AIName`='' WHERE `entry`=28013; +DELETE FROM `creature` WHERE `id`=28013; + +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid` BETWEEN -@CGUID-31 AND -@CGUID-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 +(-@CGUID-0, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-0, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-1, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-1, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-2, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-2, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-3, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-3, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-4, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-4, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-5, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-5, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-6, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-6, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-7, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-7, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-8, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-8, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-9, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-9, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-10, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-10, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-11, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-11, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-12, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-12, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-13, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-13, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-14, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-14, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-15, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-15, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-16, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-16, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-17, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-17, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-18, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-18, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-19, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-19, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-20, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-20, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-21, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-21, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-22, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-22, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-23, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-23, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-24, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-24, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-25, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-25, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-26, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-26, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-27, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-27, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-28, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-28, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-29, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-29, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-30, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-30, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-31, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-31, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''); + +UPDATE `conditions` SET `ConditionValue2`=24110, `Comment`='Fire Upon the Waters - spell to ELM General Purpose Bunny Large' WHERE `SourceTypeOrReferenceId`=13 AND `SourceGroup`=1 AND `SourceEntry`=48455 AND `SourceId`=0 AND `ElseGroup`=0 AND `ConditionTypeOrReference`=31 AND `ConditionTarget`=0 AND `ConditionValue1`=3 AND `ConditionValue2`=28013 AND `ConditionValue3`=0; diff --git a/sql/updates/world/2016_02_26_00_world.sql b/sql/updates/world/2016_02_26_00_world.sql new file mode 100644 index 00000000000..d08d5055089 --- /dev/null +++ b/sql/updates/world/2016_02_26_00_world.sql @@ -0,0 +1,17 @@ +UPDATE `smart_scripts` SET `action_type`=11, `action_param1`=48351, `comment`='Bombard the Ballistae Kill Credit Bunny - On Spellhit \'Siegesmith Bombs\' - Cast Bombard the Ballistae: Ballista Bow' WHERE `entryorguid`=27331 AND `source_type`=0 AND `id`=1 AND `link`=0; +UPDATE `smart_scripts` SET `event_param3`=120000, `event_param4`=120000 WHERE `entryorguid`=27331 AND `source_type`=0 AND `id`=0 AND `link`=1; + +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=27331 AND `id`>1; +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 +(27331, 0, 2, 3, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48352, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Bombard the Ballistae Kill Credit Bunny - On Spellhit \'Siegesmith Bombs\' - Cast Bombard the Ballistae: Ballista Frame'), +(27331, 0, 3, 4, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48353, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Bombard the Ballistae Kill Credit Bunny - On Spellhit \'Siegesmith Bombs\' - Cast Bombard the Ballistae: Ballista Missile'), +(27331, 0, 4, 5, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48354, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Bombard the Ballistae Kill Credit Bunny - On Spellhit \'Siegesmith Bombs\' - Cast Bombard the Ballistae: Ballista Wheel'), +(27331, 0, 5, 6, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48347, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Bombard the Ballistae Kill Credit Bunny - On Spellhit \'Siegesmith Bombs\' - Cast Bombard the Ballistae: FX Master'), +(27331, 0, 6, 7, 61, 0, 100, 0, 0, 0, 0, 0, 11, 52687, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Bombard the Ballistae Kill Credit Bunny - On Spellhit \'Siegesmith Bombs\' - Cast Bombard the Ballistae: Knockback'), +(27331, 0, 7, 0, 61, 0, 100, 0, 0, 0, 0, 0, 70, 120, 0, 0, 0, 0, 0, 20, 188673, 0, 0, 0, 0, 0, 0, 'Bombard the Ballistae Kill Credit Bunny - On Spellhit \'Siegesmith Bombs\' - Despawn GO'); + +UPDATE `smart_scripts` SET `link`=2 WHERE `entryorguid`=27331 AND `source_type`=0 AND `id`=1 AND `link`=0; + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=48347; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 2, 48347, 0, 0, 31, 0, 5, 188673, 0, 0, 0, 0, '', 'Bombard the Ballistae: FX Master effect #2 targets go 188673'); diff --git a/sql/updates/world/2016_02_26_01_world.sql b/sql/updates/world/2016_02_26_01_world.sql new file mode 100644 index 00000000000..b30b3cba35f --- /dev/null +++ b/sql/updates/world/2016_02_26_01_world.sql @@ -0,0 +1 @@ +DELETE FROM `event_scripts` WHERE `id` = 16547; diff --git a/sql/updates/world/2016_02_27_00_world.sql b/sql/updates/world/2016_02_27_00_world.sql new file mode 100644 index 00000000000..b9288b2ddfb --- /dev/null +++ b/sql/updates/world/2016_02_27_00_world.sql @@ -0,0 +1,4 @@ +-- fix "Val'anyr, Hammer of Ancient Kings" to properly provide shields from Earth Shield charges and Glyph of Holy Light heals (as well as others) +DELETE FROM `spell_proc_event` WHERE `entry`=64411; +INSERT INTO `spell_proc_event` (`entry`,`procFlags`) VALUES +(64411,0x00044400); diff --git a/sql/updates/world/2016_02_28_00_world.sql b/sql/updates/world/2016_02_28_00_world.sql new file mode 100644 index 00000000000..5a5694e0320 --- /dev/null +++ b/sql/updates/world/2016_02_28_00_world.sql @@ -0,0 +1,2 @@ +-- remove script from core requires removing ScriptName from creature_template +UPDATE `creature_template` SET `ScriptName`= '' WHERE `entry`IN (1749,2708); diff --git a/sql/updates/world/2016_02_29_00_world.sql b/sql/updates/world/2016_02_29_00_world.sql new file mode 100644 index 00000000000..280f2f901ef --- /dev/null +++ b/sql/updates/world/2016_02_29_00_world.sql @@ -0,0 +1,27 @@ +-- creature text 23576 Nalorakk + sound ID + broadcast_text ID +DELETE FROM `creature_text` WHERE `entry` = 23576 AND `type` = 14; +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`BroadcastTextId`,`TextRange`,`comment`) VALUES +(23576, 0,0, "Get da move on, guards! It be killin' time!", 14,0,100,0,0, 12066, 22144, 1, 'Nalorakk - YELL_NALORAKK_WAVE1'), +(23576, 1,0, "Guards, go already! Who you more afraid of, dem... or me?", 14,0,100,0,0, 12067, 22146, 1, 'Nalorakk - YELL_NALORAKK_WAVE2'), +(23576, 2,0, "Ride now! Ride out dere and bring me back some heads!", 14,0,100,0,0, 12068, 22151, 1, 'Nalorakk - YELL_NALORAKK_WAVE3'), +(23576, 3,0, "I be losin' me patience! Go on: make dem wish dey was never born!", 14,0,100,0,0, 12069, 22155, 1, 'Nalorakk - YELL_NALORAKK_WAVE4'), +(23576, 4,0, "You be dead soon enough!", 14,0,100,0,0, 12070, 23166, 1, 'Nalorakk - YELL_AGGRO'), +(23576, 5,0, "I bring da pain!", 14,0,100,0,0, 12071, 23167, 1, 'Nalorakk - YELL_SURGE'), +(23576, 6,0, "You call on da beast, you gonna get more dan you bargain for!", 14,0,100,0,0, 12072, 23168, 1, 'Nalorakk - YELL_SHIFTEDTOBEAR '), +(23576, 7,0, "Make way for da Nalorakk!", 14,0,100,0,0, 12073, 23169, 1, 'Nalorakk - YELL_SHIFTEDTOTROLL'), +(23576, 8,0, "You had your chance; now it be too late!", 14,0,100,0,0, 12074, 23170, 1, 'Nalorakk - YELL_BERSERK'), +(23576, 9,0, "Now whatchoo got to say?", 14,0,100,0,0, 12075, 23171, 1, 'Nalorakk - YELL_KILL_ONE'), +(23576, 10,0, "Da Amani gonna rule again!", 14,0,100,0,0, 12076, 23172, 1, 'Nalorakk - YELL_KILL_TWO'), +(23576, 11,0, "I... be waitin' on da udda side....", 14,0,100,0,0, 12077, 23173, 1, 'Nalorakk - YELL_DEATH'), +(23576, 12,0, "What could be better than servin' da bear spirit for eternity? Come closer now. Bring your souls to me!", 14,0,100,0,0, 12078, 23305, 1, 'Nalorakk - YELL_NALORAKK_EVENT1'), +(23576, 13,0, "I smell you, strangers. Don't be delayin' your fate. Come to me now. I make your sacrifice quick.", 14,0,100,0,0, 12079, 23306, 1, 'Nalorakk - YELL_NALORAKK_EVENT1'); + +-- creature text 24239 Hex Lord Malacrass + sound ID + broadcast_text ID +DELETE FROM `creature_text` WHERE `entry` = 24239 AND `type` = 14; +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`BroadcastTextId`,`TextRange`,`comment`) VALUES +(24239, 0,0, "Da shadow gonna fall on you....", 14,0,100,0,0, 12041, 23591, 1, 'Hex Lord Malacrass - YELL_AGGRO'), +(24239, 1,0, "Dis a nightmare ya don' wake up from!", 14,0,100,0,0, 12043, 23593, 1, 'Hex Lord Malacrass - YELL_KILL_ONE'), +(24239, 2,0, "Azzaga choogo zinn!", 14,0,100,0,0, 12044, 23594, 1, 'Hex Lord Malacrass - YELL_KILL_TWO'), +(24239, 3,0, "Darkness comin' for you....", 14,0,100,0,0, 12046, 23596, 1, 'Hex Lord Malacrass - YELL_DRAIN_POWER'), +(24239, 4,0, "Your soul gonna bleed!", 14,0,100,0,0, 12047, 23597, 1, 'Hex Lord Malacrass - YELL_SPIRIT_BOLTS'), +(24239, 5,0, "Dis not... da end for me!", 14,0,100,0,0, 12051, 23601, 1, 'Hex Lord Malacrass - YELL_DEATH'); diff --git a/sql/updates/world/2016_02_29_01_world.sql b/sql/updates/world/2016_02_29_01_world.sql new file mode 100644 index 00000000000..40343440d9a --- /dev/null +++ b/sql/updates/world/2016_02_29_01_world.sql @@ -0,0 +1 @@ +DELETE FROM `game_event_gameobject` WHERE `guid` IN (24399, 24400, 24401, 24402, 24405); diff --git a/sql/updates/world/2016_03_01_00_world_335.sql b/sql/updates/world/2016_03_01_00_world_335.sql new file mode 100644 index 00000000000..36c48379190 --- /dev/null +++ b/sql/updates/world/2016_03_01_00_world_335.sql @@ -0,0 +1,75 @@ +SET @Pool := 370; + +UPDATE `quest_template_addon` SET `PrevQuestID`=0 WHERE `ID` IN(12604,12541,12502,12509,12519,12502,12509,12519,12588,12591,12594,12557,12597,12598,12599,12564,12568,12585); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN(19,20) AND`SourceEntry` IN(12541,12604,12502,12509,12519,12502,12509,12519,12588,12591,12594,12557,12597,12598,12599,12564,12568,12585); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(19, 0, 12604, 0, 0, 1, 0, 51573, 0, 0, 0, 0, 0, '', "Show quest mark 12604 'Congratulations!' if player has aura 51573 'On Patrol'."), +(20, 0, 12604, 0, 0, 1, 0, 51573, 0, 0, 0, 0, 0, '', "Show quest mark 12604 'Congratulations!' if player has aura 51573 'On Patrol'."), +(19, 0, 12604, 0, 0, 1, 0, 53707, 0, 0, 1, 0, 0, '', "Show quest mark 12604 'Congratulations!' if player has no aura 51573 'On Patrol Heartbeat Script'."), +(20, 0, 12604, 0, 0, 1, 0, 53707, 0, 0, 1, 0, 0, '', "Show quest mark 12604 'Congratulations!' if player has no aura 51573 'On Patrol Heartbeat Script'."), +(19, 0, 12541, 0, 0, 9, 0, 12501, 0, 0, 0, 0, 0, '', "Show quest mark 12604 'Troll Patrol: The Alchemists Apprentice' if player has quest Troll patrol'."), +(20, 0, 12541, 0, 0, 9, 0, 12501, 0, 0, 0, 0, 0, '', "Show quest mark 12604 'Troll Patrol: The Alchemists Apprentice' if player has quest Troll patrol'."), +(19, 0, 12541, 0, 1, 9, 0, 12563, 0, 0, 0, 0, 0, '', "Show quest mark 12604 'Troll Patrol: The Alchemists Apprentice' if player has quest Troll patrol'."), +(20, 0, 12541, 0, 1, 9, 0, 12563, 0, 0, 0, 0, 0, '', "Show quest mark 12604 'Troll Patrol: The Alchemists Apprentice' if player has quest Troll patrol'."), +(19, 0, 12541, 0, 2, 9, 0, 12587, 0, 0, 0, 0, 0, '', "Show quest mark 12604 'Troll Patrol: The Alchemists Apprentice' if player has quest Troll patrol'."), +(20, 0, 12541, 0, 2, 9, 0, 12587, 0, 0, 0, 0, 0, '', "Show quest mark 12604 'Troll Patrol: The Alchemists Apprentice' if player has quest Troll patrol'."), +(19, 0, 12509, 0, 0, 9, 0, 12501, 0, 0, 0, 0, 0, '', "Show quest mark 12509 'Troll Patrol: Intestinal Fortitude' if player has quest Troll patrol'."), +(20, 0, 12509, 0, 0, 9, 0, 12501, 0, 0, 0, 0, 0, '', "Show quest mark 12509 'Troll Patrol: Intestinal Fortitude' if player has quest Troll patrol'."), +(19, 0, 12519, 0, 0, 9, 0, 12501, 0, 0, 0, 0, 0, '', "Show quest mark 12604 'Troll Patrol: Whatdya Want, a Medal?' if player has quest Troll patrol'."), +(20, 0, 12519, 0, 0, 9, 0, 12501, 0, 0, 0, 0, 0, '', "Show quest mark 12604 'Troll Patrol: Whatdya Want, a Medal?' if player has quest Troll patrol'."), +(19, 0, 12502, 0, 0, 9, 0, 12501, 0, 0, 0, 0, 0, '', "Show quest mark 12502 'Troll Patrol: High Standards' if player has quest Troll patrol'."), +(20, 0, 12502, 0, 0, 9, 0, 12501, 0, 0, 0, 0, 0, '', "Show quest mark 12502 'Troll Patrol: High Standards' if player has quest Troll patrol'."), +(19, 0, 12564, 0, 0, 9, 0, 12563, 0, 0, 0, 0, 0, '', "Show quest mark 12564 'Troll Patrol: Something for the Pain' if player has quest Troll patrol'."), +(20, 0, 12564, 0, 0, 9, 0, 12563, 0, 0, 0, 0, 0, '', "Show quest mark 12564 'Troll Patrol: Something for the Pain' if player has quest Troll patrol'."), +(19, 0, 12568, 0, 0, 9, 0, 12563, 0, 0, 0, 0, 0, '', "Show quest mark 12568 'Troll Patrol: Done to Death' if player has quest Troll patrol'."), +(20, 0, 12568, 0, 0, 9, 0, 12563, 0, 0, 0, 0, 0, '', "Show quest mark 12558 'Troll Patrol: Done to Death' if player has quest Troll patrol'."), +(19, 0, 12585, 0, 0, 9, 0, 12563, 0, 0, 0, 0, 0, '', "Show quest mark 12585 'Troll Patrol: Creature Comforts' if player has quest Troll patrol'."), +(20, 0, 12585, 0, 0, 9, 0, 12563, 0, 0, 0, 0, 0, '', "Show quest mark 12585 'Troll Patrol: Creature Comforts' if player has quest Troll patrol'."), +(19, 0, 12588, 0, 0, 9, 0, 12587, 0, 0, 0, 0, 0, '', "Show quest mark 12588 'Troll Patrol: Can You Dig It?' if player has quest Troll patrol'."), +(20, 0, 12588, 0, 0, 9, 0, 12587, 0, 0, 0, 0, 0, '', "Show quest mark 12588 'Troll Patrol: Can You Dig It?' if player has quest Troll patrol'."), +(19, 0, 12591, 0, 0, 9, 0, 12587, 0, 0, 0, 0, 0, '', "Show quest mark 12591 'Troll Patrol: Throwing Down' if player has quest Troll patrol'."), +(20, 0, 12591, 0, 0, 9, 0, 12587, 0, 0, 0, 0, 0, '', "Show quest mark 12591 'Troll Patrol: Throwing Down' if player has quest Troll patrol'."), +(19, 0, 12594, 0, 0, 9, 0, 12587, 0, 0, 0, 0, 0, '', "Show quest mark 12594 'Troll Patrol: Couldn't Care Less' if player has quest Troll patrol'."), +(20, 0, 12594, 0, 0, 9, 0, 12587, 0, 0, 0, 0, 0, '', "Show quest mark 12594 'Troll Patrol: Couldn't Care Less' if player has quest Troll patrol'."), +(19, 0, 12557, 0, 0, 9, 0, 12596, 0, 0, 0, 0, 0, '', "Show quest mark 12557 'Lab Work' if player has quest Pa'Troll'."), +(20, 0, 12557, 0, 0, 9, 0, 12596, 0, 0, 0, 0, 0, '', "Show quest mark 12557 'Lab Work' if player has quest Pa'Troll'."), +(19, 0, 12597, 0, 0, 9, 0, 12596, 0, 0, 0, 0, 0, '', "Show quest mark 12597 'Something for the Pain' if player has quest Pa'Troll'."), +(20, 0, 12597, 0, 0, 9, 0, 12596, 0, 0, 0, 0, 0, '', "Show quest mark 12597 'Something for the Pain' if player has quest Pa'Troll'."), +(19, 0, 12598, 0, 0, 9, 0, 12596, 0, 0, 0, 0, 0, '', "Show quest mark 12598 'Throwing Down' if player has quest Pa'Troll'."), +(20, 0, 12598, 0, 0, 9, 0, 12596, 0, 0, 0, 0, 0, '', "Show quest mark 12598 'Throwing Down' if player has quest Pa'Troll'."), +(19, 0, 12599, 0, 0, 9, 0, 12596, 0, 0, 0, 0, 0, '', "Show quest mark 12599 'Creature Comforts' if player has quest Pa'Troll'."), +(20, 0, 12599, 0, 0, 9, 0, 12596, 0, 0, 0, 0, 0, '', "Show quest mark 12599 'Creature Comforts' if player has quest Pa'Troll'."); + +UPDATE `creature_template` SET `AIName`='SmartAI', `ScriptName`='' WHERE `entry` =28039; +DELETE FROM `smart_scripts` WHERE `entryorguid` =28039 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 +(28039, 0, 0, 1, 19, 0, 100, 0, 12596, 0, 0, 0, 85, 51506, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Commander Kunz - On Quest Accept Pa''Troll - Invoker Cast Clear Patrol Quests'), +(28039, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 85, 51509, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Commander Kunz - On Quest Accept Pa''Troll - Invoker Cast Clear Patrol Quests II'), +(28039, 0, 2, 5, 19, 0, 100, 0, 12587, 0, 0, 0, 85, 51573, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Commander Kunz - On Quest Accept Troll Patrol - Invoker Cast On Patrol'), +(28039, 0, 3, 5, 19, 0, 100, 0, 12501, 0, 0, 0, 85, 51573, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Commander Kunz - On Quest Accept Troll Patrol - Invoker Cast On Patrol'), +(28039, 0, 4, 5, 19, 0, 100, 0, 12563, 0, 0, 0, 85, 51573, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Commander Kunz - On Quest Accept Troll Patrol - Invoker Cast On Patrol'), +(28039, 0, 5, 6, 61, 0, 100, 0, 0, 0, 0, 0, 85, 53712, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Commander Kunz - On Quest Accept Troll Patrol - Invoker Cast Clear DAILY Patrol SUBQuests 00'), +(28039, 0, 6, 7, 61, 0, 100, 0, 0, 0, 0, 0, 85, 53713, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Commander Kunz - On Quest Accept Troll Patrol - Invoker Cast Clear DAILY Patrol SUBQuests 01'), +(28039, 0, 7, 8, 61, 0, 100, 0, 0, 0, 0, 0, 85, 53715, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Commander Kunz - On Quest Accept Troll Patrol - Invoker Cast Clear DAILY Patrol SUBQuests 02'), +(28039, 0, 8, 9, 61, 0, 100, 0, 0, 0, 0, 0, 85, 53716, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Commander Kunz - On Quest Accept Troll Patrol - Invoker Cast Clear DAILY Patrol SUBQuests 03'), +(28039, 0, 9, 0, 61, 0, 100, 0, 0, 0, 0, 0, 85, 53707, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Commander Kunz - On Quest Accept Troll Patrol - Invoker Cast On Patrol Heartbeat Script'), +(28039, 0, 10, 0, 20, 0, 100, 0, 12587, 0, 0, 0, 28, 51573, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Commander Kunz - On Quest Reward Congratulations - Remove Aura On Patrol'), +(28039, 0, 11, 0, 20, 0, 100, 0, 12563, 0, 0, 0, 28, 53707, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Commander Kunz - On Quest Reward Troll Patrol - Remove Aura On Patrol Heartbeat Script'), +(28039, 0, 12, 0, 20, 0, 100, 0, 12501, 0, 0, 0, 28, 53707, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Commander Kunz - On Quest Reward Troll Patrol - Remove Aura On Patrol Heartbeat Script'), +(28039, 0, 13, 0, 20, 0, 100, 0, 12604, 0, 0, 0, 28, 53707, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Commander Kunz - On Quest Reward Troll Patrol - Remove Aura On Patrol Heartbeat Script'); + +UPDATE `quest_template_addon` SET `ExclusiveGroup`=12587 WHERE `ID` IN(12501,12563,12587); + +DELETE FROM `pool_quest` WHERE `pool_entry` IN (@Pool); + +INSERT INTO `pool_quest` (`entry`, `pool_entry`, `description`) VALUES +(12587, @Pool, 'Troll Patrol'), +(12501, @Pool, 'Troll Patrol'), +(12563, @Pool, 'Troll Patrol'); + +DELETE FROM `pool_template` WHERE `entry` IN (@Pool); + +INSERT INTO `pool_template` (`entry`, `max_limit`, `description`) VALUES +(@Pool, 1, 'Troll Patrol Daily Quests'); diff --git a/sql/updates/world/2016_03_02_00_world_335.sql b/sql/updates/world/2016_03_02_00_world_335.sql new file mode 100644 index 00000000000..e7a9f60e790 --- /dev/null +++ b/sql/updates/world/2016_03_02_00_world_335.sql @@ -0,0 +1,3 @@ +-- +-- Only for 3.3.5! +UPDATE `conditions` SET `ConditionTypeOrReference`=42 WHERE `ConditionTypeOrReference`=41; diff --git a/sql/updates/world/2016_03_03_00_world.sql b/sql/updates/world/2016_03_03_00_world.sql new file mode 100644 index 00000000000..473bac4708a --- /dev/null +++ b/sql/updates/world/2016_03_03_00_world.sql @@ -0,0 +1,93 @@ +SET @CGUID := 91749; +SET @OGUID := 62179; + +UPDATE `creature_template` SET `npcflag`=16777216 WHERE `entry`=28162; + +DELETE FROM `npc_spellclick_spells` WHERE `npc_entry`=28162; +INSERT INTO `npc_spellclick_spells` (`npc_entry`, `spell_id`, `cast_flags`, `user_type`) VALUES +(28162, 51026, 1, 0); +DELETE FROM `smart_scripts` WHERE `entryorguid`IN(28162,28330,28156) AND `source_type`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid`IN(2833000,2833001,2833002) AND `source_type`=9; + +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 +(28162, 0, 0, 1, 8, 0, 100, 1, 51026, 0, 0, 0, 11, 61286, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Drakkari Corpse - On Spellhit Create Drakkari Medallion Cover - Cast World Generic Dismount/Cancel Shapeshift'), +(28162, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 11, 50737, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Drakkari Corpse - On Spellhit Create Drakkari Medallion Cover - Cast Create Drakkari Medallion'), +(28162, 0, 2, 3, 61, 0, 100, 0, 0, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Drakkari Corpse - On Spellhit Create Drakkari Medallion Cover - Cast Create Drakkari Medallion'), +(28162, 0, 3, 0, 61, 0, 100, 0, 0, 0, 0, 0, 41, 3000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Drakkari Corpse - On Spellhit Create Drakkari Medallion Cover - Despawn'), +(28162, 0, 4, 0, 25, 0, 100, 0, 0, 0, 0, 0, 81, 16777216, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Drakkari Corpse - On Respawn - Set NPC Flags'), +(28330, 0, 0, 1, 8, 0, 100, 0, 51333, 0, 120000, 120000, 33, 28330, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Ancient Dirt KC Bunny - On Spell Hit - Give Quest Credit'), +(28330, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 70, 120, 0, 0, 0, 0, 0, 20, 190550, 0, 0, 0, 0, 0, 0, 'Ancient Dirt KC Bunny - On Spell Hit - Despawn GO'), +(28330, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 87, 2833000, 2833001, 2833002, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Ancient Dirt KC Bunny - On Spell Hit - Run Random Script'), +(28156, 0, 0, 1, 8, 0, 100, 1, 51276, 0, 0, 0, 11, 59216, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Defeated Argent Footman - On Spellhit \'Incinerate Corpse\' - Cast \'Burning Corpse\''), +(28156, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 11, 51279, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Defeated Argent Footman - On Spellhit - Cast \'Defeated Argent Footman KC\''), +(28156, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 41, 10000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Defeated Argent Footman - On Spellhit - Despawn'), +(2833000, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 51345, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Ancient Dirt KC Bunny - Script 1 - Cast Summon Ancient Drakkari Chest'), +(2833001, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 51357, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Ancient Dirt KC Bunny - Script 2 - Cast Summon Spider'), +(2833002, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 51370, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Ancient Dirt KC Bunny - Script 3 - Cast Summon Drakkari Spectre'); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=18 AND `SourceGroup`=28162; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(18, 28162, 51026, 0, 0, 9, 0, 12519, 0, 0, 0, 0, 0, '', 'Required quest active for spellclick'); + +DELETE FROM `gameobject_template` WHERE `entry`=190552; +INSERT INTO `gameobject_template` (`entry`, `type`, `displayId`, `name`, `IconName`, `castBarCaption`, `unk1`, `faction`, `flags`, `size`, `Data0`, `Data1`, `Data2`, `Data3`, `Data4`, `Data5`, `Data6`, `Data7`, `Data8`, `Data9`, `Data10`, `Data11`, `Data12`, `Data13`, `Data14`, `Data15`, `Data16`, `Data17`, `Data18`, `Data19`, `Data20`, `Data21`, `Data22`, `Data23`, `AIName`, `ScriptName`, `VerifiedBuild`) VALUES +(190552, 3, 2450, 'Ancient Drakkari Chest', '', '', '', 94, 0, 1, 1691, 27240, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, '', '', 14007); + +DELETE FROM `gameobject_loot_template` WHERE `Entry`=27240; +INSERT INTO `gameobject_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(27240, 46369, 0, 52, 0, 1, 1, 1, 1, NULL), +(27240, 46368, 0, 47, 0, 1, 1, 1, 1, NULL), +(27240, 43851, 0, 15, 0, 1, 2, 1, 1, NULL), +(27240, 43852, 0, 14, 0, 1, 2, 1, 1, NULL), +(27240, 33470, 0, 14, 0, 1, 3, 1, 4, NULL); + +DELETE FROM `creature` WHERE `id`=28330; +INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `MovementType`) VALUES +(@CGUID+0, 28330, 571, 1, 1, 4994.237, -2934.52, 289.698, 4.502949, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+1, 28330, 571, 1, 1, 4928.283, -2954.844, 289.4258, 0.3665192, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+2, 28330, 571, 1, 1, 4971.499, -2967.053, 290.4032, 6.021386, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+3, 28330, 571, 1, 1, 4934.217, -2988.888, 290.1517, 3.316126, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+4, 28330, 571, 1, 1, 4901.642, -3020.357, 290.4903, 3.577925, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+5, 28330, 571, 1, 1, 4936.192, -2911.305, 289.9935, 3.804818, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+6, 28330, 571, 1, 1, 4904.635, -2938.013, 290.041, 2.792527, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+7, 28330, 571, 1, 1, 4959.712, -2882.519, 290.1794, 2.495821, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+8, 28330, 571, 1, 1, 4903.988, -2988.983, 289.8607, 6.073746, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+9, 28330, 571, 1, 1, 4884.578, -2949.397, 291.4635, 6.248279, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+10, 28330, 571, 1, 1, 4867.053, -3032.317, 290.2768, 0.01745329, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+11, 28330, 571, 1, 1, 4875.137, -2981.573, 289.6624, 3.769911, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+12, 28330, 571, 1, 1, 4948.37, -2845.009, 289.9186, 0.2094395, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+13, 28330, 571, 1, 1, 4900.262, -2870.288, 290.5846, 2.879793, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+14, 28330, 571, 1, 1, 4889.488, -2826.498, 291.2368, 6.213372, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+15, 28330, 571, 1, 1, 4865.896, -2879.65, 291.2252, 3.124139, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+16, 28330, 571, 1, 1, 4847.792, -2933.366, 290.7986, 1.954769, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+17, 28330, 571, 1, 1, 4838.494, -2962.302, 290.7893, 5.096361, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+18, 28330, 571, 1, 1, 4834.676, -3024.518, 290.9732, 5.77704, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+19, 28330, 571, 1, 1, 4834.516, -3055.432, 292.7168, 4.223697, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+20, 28330, 571, 1, 1, 4833.344, -3086.806, 290.7325, 5.183628, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+21, 28330, 571, 1, 1, 4811.373, -3122.263, 290.908, 3.787364, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+22, 28330, 571, 1, 1, 4774.604, -3146.782, 293.9535, 4.886922, 120, 0, 0); -- 28330 (Area: 66) + +DELETE FROM `gameobject` WHERE `id`=190550; +INSERT INTO `gameobject` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`) VALUES +(@OGUID+0, 190550, 571, 1, 1, 4947.931, -2845.012, 289.6788, 3.141593, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 4278) +(@OGUID+1, 190550, 571, 1, 1, 4994.241, -2934.715, 289.4844, 3.036838, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 0) +(@OGUID+2, 190550, 571, 1, 1, 4959.522, -2882.375, 289.9583, -0.2268925, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 0) +(@OGUID+3, 190550, 571, 1, 1, 4935.69, -2910.847, 289.8739, 0.4712385, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 0) +(@OGUID+4, 190550, 571, 1, 1, 4904.143, -2988.849, 289.7597, -2.879789, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 0) +(@OGUID+5, 190550, 571, 1, 1, 4901.818, -3020.541, 290.4142, 2.862335, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 0) +(@OGUID+6, 190550, 571, 1, 1, 4847.445, -2933.018, 290.703, 2.91469, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 0) +(@OGUID+7, 190550, 571, 1, 1, 4889.123, -2826.122, 291.1009, -2.670348, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 0) +(@OGUID+8, 190550, 571, 1, 1, 4959.522, -2882.375, 289.9583, -0.2268925, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 0) +(@OGUID+9, 190550, 571, 1, 1, 4904.084, -2937.728, 289.9795, -0.9250239, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 0) +(@OGUID+10, 190550, 571, 1, 1, 4865.544, -2879.292, 291.0988, 0.8377574, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 0) +(@OGUID+11, 190550, 571, 1, 1, 4935.69, -2910.847, 289.8739, 0.4712385, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 0) +(@OGUID+12, 190550, 571, 1, 1, 4934.223, -2988.802, 290.0577, 1.727875, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 0) +(@OGUID+13, 190550, 571, 1, 1, 4874.853, -2981.499, 289.5772, 5.183629, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 0) +(@OGUID+14, 190550, 571, 1, 1, 4837.822, -2961.738, 290.6022, 2.565632, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 0) +(@OGUID+15, 190550, 571, 1, 1, 4834.372, -3055.432, 292.4856, 4.799657, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 0) +(@OGUID+16, 190550, 571, 1, 1, 4928.226, -2954.833, 289.3405, 2.129301, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 4279) +(@OGUID+17, 190550, 571, 1, 1, 4900.326, -2870.361, 290.4038, 1.431168, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 0) +(@OGUID+18, 190550, 571, 1, 1, 4971.439, -2966.859, 290.2518, 4.520406, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 4278) +(@OGUID+19, 190550, 571, 1, 1, 4928.226, -2954.833, 289.3405, 2.129301, 0, 0, 0, 1, 120, 255, 1); -- 190550 (Area: 0) + +DELETE FROM `event_scripts` WHERE `id`=4845 AND `delay`=0 AND `command`=9 AND `datalong`=21207 AND `datalong2`=66 AND `dataint`=0 AND `x`=0 AND `y`=0 AND `z`=0 AND `o`=0 LIMIT 1; diff --git a/sql/updates/world/2016_03_03_01_world.sql b/sql/updates/world/2016_03_03_01_world.sql new file mode 100644 index 00000000000..a242d26efe1 --- /dev/null +++ b/sql/updates/world/2016_03_03_01_world.sql @@ -0,0 +1,57 @@ +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=28330; + +-- Ghostwing needs spell 59091 in relation to Crusader Olakin Sainrith in phase 64 +DELETE FROM `npc_spellclick_spells` WHERE `npc_entry`= 31432 AND `spell_id`= 59091; + +INSERT INTO `npc_spellclick_spells` (`npc_entry`,`spell_id`,`cast_flags`,`user_type`) VALUES +(31432, 59091, 1, 0); + +DELETE FROM `vehicle_template_accessory` WHERE `entry`=31432 AND `seat_id`=0; + +DELETE FROM `creature` WHERE `guid`=145119; + +DELETE FROM `spell_area` WHERE `spell`=58139 AND `area`IN(4588); +INSERT INTO `spell_area` (`spell`, `area`, `quest_start`, `quest_end`, `aura_spell`, `racemask`, `gender`, `autocast`, `quest_start_status`, `quest_end_status`) VALUES +(58139, 4588, 13144, 0, 0, 0, 2, 1, 64, 11); -- Blackwatch after Killing two scourge with one skeleton +UPDATE `creature` SET `phaseMask`=65 WHERE `guid`=123657; + +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`IN(30631,31432); + +DELETE FROM `smart_scripts` WHERE `entryorguid`IN(30631,31432) AND `source_type`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid`IN(31428) AND `source_type`=0 AND `id`>4; + +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 +(30631, 0, 0, 1, 20, 0, 100, 0, 13144, 0, 0, 0, 12, 31432, 1, 90000, 0, 0, 0, 8, 0, 0, 0, 6588.43, 3278.2, 818.203, 5.044, 'Darkrider Arly - On Quest Reward - Summon Ghostwing'), +(30631, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 12, 31428, 1, 90000, 0, 0, 0, 8, 0, 0, 0, 6648.77, 3217.7, 810.501, 1.55334, 'Darkrider Arly - On Quest Reward - Summon Crusader Olakin Sainrith'), +(31428, 0, 5, 6, 54, 0, 100, 0, 0, 0, 0, 0, 71, 0, 0, 40598, 42543, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Crusader Olakin Sainrith - On Just Summoned - Equip Items'), +(31428, 0, 6, 7, 61, 0, 100, 0, 0, 0, 0, 0, 44, 64, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Crusader Olakin Sainrith - On Just Summoned - Set Ingame Phase 64'), +(31428, 0, 7, 8, 61, 0, 100, 0, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Crusader Olakin Sainrith - On Just Summoned - Dismount'), +(31428, 0, 8, 0, 61, 0, 100, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Crusader Olakin Sainrith - On Just Summoned - Say Line 1'), +(31428, 0, 9, 0, 38, 0, 100, 0, 2, 2, 0, 0, 11, 59091, 2, 0, 0, 0, 0, 19, 31432, 0, 0, 0, 0, 0, 0, 'Crusader Olakin Sainrith - On Data Set - Cast Ride Ghostwing'), +(31432, 0, 0, 1, 54, 0, 100, 0, 0, 0, 0, 0, 44, 64, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Ghostwing - On Just Summoned - Set Ingame Phase 64'), +(31432, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Ghostwing - On Just Summoned - Start WP'), +(31432, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 53, 1, 31432, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Ghostwing - On Just Summoned - Set Active'), +(31432, 0, 3, 4, 40, 0, 100, 0, 1, 31432, 0, 0, 54, 3000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Ghostwing - On Reached WP1 - Pause WP'), +(31432, 0, 4, 5, 61, 0, 100, 0, 0, 0, 0, 0, 45, 2, 2, 0, 0, 0, 0, 19, 31428, 0, 0, 0, 0, 0, 0, 'Ghostwing - On Reached WP1 - Set Data on Crusader Olakin Sainrith'), +(31432, 0, 5, 0, 61, 0, 100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Ghostwing - On Reached WP1 - Say Line 0'), +(31432, 0, 6, 7, 40, 0, 100, 0, 2, 31432, 0, 0, 1, 0, 0, 0, 0, 0, 0, 19, 30631, 0, 0, 0, 0, 0, 0, 'Ghostwing - On Reached WP2 - Say Line 0 on Darkrider Arly'), +(31432, 0, 7, 8, 61, 0, 100, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 19, 31432, 0, 0, 0, 0, 0, 0, 'Ghostwing - On Reached WP2 - Despawn Crusader Olakin Sainrith'), +(31432, 0, 8, 0, 61, 0, 100, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Ghostwing - On Reached WP2 - Despawn '); + +DELETE FROM `creature_text` WHERE `entry` IN(30631,31432); +DELETE FROM `creature_text` WHERE `entry` IN(31428) AND `groupid`=1; + + +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextId`, `comment`) VALUES +(30631, 0, 0, 'Damn it, Olakin, get your arse back here! There''s work to be done!', 12, 0, 100, 5, 0, 0, 32195, 'Darkrider Arly to Crusader Olakin Sainrith'), +(31428, 1, 0, 'Look! What''s a frostwyrm doing here? It''s coming straight for us.', 12, 0, 100, 25, 0, 0, 32173, 'Crusader Olakin Sainrith to Player'), +(31432, 0, 0, 'Destroy our raw materials, will you? Well, the master has a special plan in mind for you... ', 12, 0, 100, 460, 0, 0, 32171, 'Ghostwing to Player'); + +DELETE FROM `waypoints` WHERE `entry`=31432; +INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES +(31432, 1, 6644.43, 3222.912, 823.0705, 'Ghostwing'), +(31432, 2, 6690.65, 3177.279, 860.5705, 'Ghostwing'); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=59091; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 1, 59091, 0, 0, 31, 0, 3, 31432, 0, 0, 0, 0, '', 'Ride Ghostwing'); diff --git a/src/common/Configuration/BuiltInConfig.cpp b/src/common/Configuration/BuiltInConfig.cpp new file mode 100644 index 00000000000..c2fc3b91766 --- /dev/null +++ b/src/common/Configuration/BuiltInConfig.cpp @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "BuiltInConfig.h" +#include "Config.h" +#include "GitRevision.h" + +template<typename Fn> +static std::string GetStringWithDefaultValueFromFunction( + std::string const& key, Fn getter) +{ + std::string const value = sConfigMgr->GetStringDefault(key, ""); + return value.empty() ? getter() : value; +} + +std::string BuiltInConfig::GetCMakeCommand() +{ + return GetStringWithDefaultValueFromFunction( + "CMakeCommand", GitRevision::GetCMakeCommand); +} + +std::string BuiltInConfig::GetBuildDirectory() +{ + return GetStringWithDefaultValueFromFunction( + "BuildDirectory", GitRevision::GetBuildDirectory); +} + +std::string BuiltInConfig::GetSourceDirectory() +{ + return GetStringWithDefaultValueFromFunction( + "SourceDirectory", GitRevision::GetSourceDirectory); +} + +std::string BuiltInConfig::GetMySQLExecutable() +{ + return GetStringWithDefaultValueFromFunction( + "MySQLExecutable", GitRevision::GetMySQLExecutable); +} diff --git a/src/common/Configuration/BuiltInConfig.h b/src/common/Configuration/BuiltInConfig.h new file mode 100644 index 00000000000..4ae4ed40189 --- /dev/null +++ b/src/common/Configuration/BuiltInConfig.h @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef BUILT_IN_CONFIG_H +#define BUILT_IN_CONFIG_H + +#include <string> + +/// Provides helper functions to access built-in values +/// which can be overwritten in config +namespace BuiltInConfig +{ + /// Returns the CMake command when any is specified in the config, + /// returns the built-in path otherwise + std::string GetCMakeCommand(); + /// Returns the build directory path when any is specified in the config, + /// returns the built-in one otherwise + std::string GetBuildDirectory(); + /// Returns the source directory path when any is specified in the config, + /// returns the built-in one otherwise + std::string GetSourceDirectory(); + /// Returns the path to the mysql executable (`mysql`) when any is specified + /// in the config, returns the built-in one otherwise + std::string GetMySQLExecutable(); + +} // namespace BuiltInConfig + +#endif // BUILT_IN_CONFIG_H diff --git a/src/common/Configuration/Config.cpp b/src/common/Configuration/Config.cpp index 6ac04615315..5db333c8aff 100644 --- a/src/common/Configuration/Config.cpp +++ b/src/common/Configuration/Config.cpp @@ -61,7 +61,7 @@ bool ConfigMgr::Reload(std::string& error) return LoadInitial(_filename, error); } -std::string ConfigMgr::GetStringDefault(std::string const& name, const std::string& def) +std::string ConfigMgr::GetStringDefault(std::string const& name, const std::string& def) const { std::string value = _config.get<std::string>(ptree::path_type(name, '/'), def); @@ -70,7 +70,7 @@ std::string ConfigMgr::GetStringDefault(std::string const& name, const std::stri return value; } -bool ConfigMgr::GetBoolDefault(std::string const& name, bool def) +bool ConfigMgr::GetBoolDefault(std::string const& name, bool def) const { try { @@ -84,12 +84,12 @@ bool ConfigMgr::GetBoolDefault(std::string const& name, bool def) } } -int ConfigMgr::GetIntDefault(std::string const& name, int def) +int ConfigMgr::GetIntDefault(std::string const& name, int def) const { return _config.get<int>(ptree::path_type(name, '/'), def); } -float ConfigMgr::GetFloatDefault(std::string const& name, float def) +float ConfigMgr::GetFloatDefault(std::string const& name, float def) const { return _config.get<float>(ptree::path_type(name, '/'), def); } diff --git a/src/common/Configuration/Config.h b/src/common/Configuration/Config.h index 5b04212ed7c..ada910d8fcc 100644 --- a/src/common/Configuration/Config.h +++ b/src/common/Configuration/Config.h @@ -41,10 +41,10 @@ public: bool Reload(std::string& error); - std::string GetStringDefault(std::string const& name, const std::string& def); - bool GetBoolDefault(std::string const& name, bool def); - int GetIntDefault(std::string const& name, int def); - float GetFloatDefault(std::string const& name, float def); + std::string GetStringDefault(std::string const& name, const std::string& def) const; + bool GetBoolDefault(std::string const& name, bool def) const; + int GetIntDefault(std::string const& name, int def) const; + float GetFloatDefault(std::string const& name, float def) const; std::string const& GetFilename(); std::list<std::string> GetKeysByString(std::string const& name); diff --git a/src/common/Define.h b/src/common/Define.h index df3dd37b503..b34edb6a549 100644 --- a/src/common/Define.h +++ b/src/common/Define.h @@ -83,10 +83,16 @@ # define ATTR_NORETURN __attribute__((__noreturn__)) # define ATTR_PRINTF(F, V) __attribute__ ((__format__ (__printf__, F, V))) # define ATTR_DEPRECATED __attribute__((__deprecated__)) +# define TRINITY_CONSTEXPR constexpr #else //COMPILER != COMPILER_GNU # define ATTR_NORETURN # define ATTR_PRINTF(F, V) # define ATTR_DEPRECATED +#if _MSC_VER >= 1900 +# define TRINITY_CONSTEXPR constexpr +#else +# define TRINITY_CONSTEXPR +#endif #endif //COMPILER == COMPILER_GNU #define UI64FMTD "%" PRIu64 diff --git a/src/common/GitRevision.cpp b/src/common/GitRevision.cpp index d0719c09959..5343fbd6531 100644 --- a/src/common/GitRevision.cpp +++ b/src/common/GitRevision.cpp @@ -17,6 +17,16 @@ char const* GitRevision::GetBranch() return _BRANCH; } +char const* GitRevision::GetCMakeCommand() +{ + return _CMAKE_COMMAND; +} + +char const* GitRevision::GetBuildDirectory() +{ + return _BUILD_DIRECTORY; +} + char const* GitRevision::GetSourceDirectory() { return _SOURCE_DIRECTORY; @@ -66,13 +76,3 @@ char const* GitRevision::GetProductVersionStr() { return VER_PRODUCTVERSION_STR; } - -char const* GitRevision::GetCompilerCFlags() -{ - return COMPILER_C_FLAGS; -} - -char const* GitRevision::GetCompilerCXXFlags() -{ - return COMPILER_CXX_FLAGS; -} diff --git a/src/common/GitRevision.h b/src/common/GitRevision.h index 8d2764ba861..7fddcb7605a 100644 --- a/src/common/GitRevision.h +++ b/src/common/GitRevision.h @@ -25,6 +25,8 @@ namespace GitRevision char const* GetHash(); char const* GetDate(); char const* GetBranch(); + char const* GetCMakeCommand(); + char const* GetBuildDirectory(); char const* GetSourceDirectory(); char const* GetMySQLExecutable(); char const* GetFullDatabase(); @@ -33,8 +35,6 @@ namespace GitRevision char const* GetLegalCopyrightStr(); char const* GetFileVersionStr(); char const* GetProductVersionStr(); - char const* GetCompilerCFlags(); - char const* GetCompilerCXXFlags(); } #endif diff --git a/src/common/Logging/Log.cpp b/src/common/Logging/Log.cpp index 4bd0487343d..a80a4671822 100644 --- a/src/common/Logging/Log.cpp +++ b/src/common/Logging/Log.cpp @@ -214,13 +214,13 @@ void Log::ReadLoggersFromConfig() AppenderConsole* appender = new AppenderConsole(NextAppenderId(), "Console", LOG_LEVEL_DEBUG, APPENDER_FLAGS_NONE, ExtraAppenderArgs()); appenders[appender->getId()] = appender; - Logger& logger = loggers[LOGGER_ROOT]; - logger.Create(LOGGER_ROOT, LOG_LEVEL_ERROR); - logger.addAppender(appender->getId(), appender); + Logger& rootLogger = loggers[LOGGER_ROOT]; + rootLogger.Create(LOGGER_ROOT, LOG_LEVEL_ERROR); + rootLogger.addAppender(appender->getId(), appender); - logger = loggers["server"]; - logger.Create("server", LOG_LEVEL_ERROR); - logger.addAppender(appender->getId(), appender); + Logger& serverLogger = loggers["server"]; + serverLogger.Create("server", LOG_LEVEL_INFO); + serverLogger.addAppender(appender->getId(), appender); } } diff --git a/src/common/Threading/MPSCQueue.h b/src/common/Threading/MPSCQueue.h new file mode 100644 index 00000000000..09648b844be --- /dev/null +++ b/src/common/Threading/MPSCQueue.h @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef MPSCQueue_h__ +#define MPSCQueue_h__ + +#include <atomic> +#include <utility> + +// C++ implementation of Dmitry Vyukov's lock free MPSC queue +// http://www.1024cores.net/home/lock-free-algorithms/queues/non-intrusive-mpsc-node-based-queue +template<typename T> +class MPSCQueue +{ +public: + MPSCQueue() : _head(new Node()), _tail(_head.load(std::memory_order_relaxed)) + { + Node* front = _head.load(std::memory_order_relaxed); + front->Next.store(nullptr, std::memory_order_relaxed); + } + + ~MPSCQueue() + { + T* output; + while (this->Dequeue(output)) + ; + + Node* front = _head.load(std::memory_order_relaxed); + delete front; + } + + void Enqueue(T* input) + { + Node* node = new Node(input); + Node* prevHead = _head.exchange(node, std::memory_order_acq_rel); + prevHead->Next.store(node, std::memory_order_release); + } + + bool Dequeue(T*& result) + { + Node* tail = _tail.load(std::memory_order_relaxed); + Node* next = tail->Next.load(std::memory_order_acquire); + if (!next) + return false; + + result = next->Data; + _tail.store(next, std::memory_order_release); + delete tail; + return true; + } + +private: + struct Node + { + Node() = default; + explicit Node(T* data) : Data(data) { Next.store(nullptr, std::memory_order_relaxed); } + + T* Data; + std::atomic<Node*> Next; + }; + + std::atomic<Node*> _head; + std::atomic<Node*> _tail; + + MPSCQueue(MPSCQueue const&) = delete; + MPSCQueue& operator=(MPSCQueue const&) = delete; +}; + +#endif // MPSCQueue_h__ diff --git a/src/server/shared/Containers.h b/src/common/Utilities/Containers.h index c2ebbf58a1e..f3e9432ca4c 100644 --- a/src/server/shared/Containers.h +++ b/src/common/Utilities/Containers.h @@ -19,10 +19,11 @@ #define TRINITY_CONTAINERS_H #include "Define.h" +#include "Random.h" +#include <algorithm> +#include <functional> #include <list> - -//! Because circular includes are bad -extern uint32 urand(uint32 min, uint32 max); +#include <vector> namespace Trinity { @@ -57,14 +58,64 @@ namespace Trinity list = listCopy; } - /* Select a random element from a container. Note: make sure you explicitly empty check the container */ - template <class C> typename C::value_type const& SelectRandomContainerElement(C const& container) + /* + * Select a random element from a container. + * + * Note: container cannot be empty + */ + template <class C> + typename C::value_type const& SelectRandomContainerElement(C const& container) { typename C::const_iterator it = container.begin(); std::advance(it, urand(0, container.size() - 1)); return *it; } + /* + * Select a random element from a container where each element has a different chance to be selected. + * + * @param container Container to select an element from + * @param weights Chances of each element to be selected, must be in the same order as elements in container. + * Caller is responsible for checking that sum of all weights is greater than 0. + * + * Note: container cannot be empty + */ + template <class C> + typename C::const_iterator SelectRandomWeightedContainerElement(C const& container, std::vector<double> weights) + { + Trinity::discrete_distribution_param<uint32> ddParam(weights.begin(), weights.end()); + std::discrete_distribution<uint32> dd(ddParam); + typename C::const_iterator it = container.begin(); + std::advance(it, dd(SFMTEngine::Instance())); + return it; + } + + /* + * Select a random element from a container where each element has a different chance to be selected. + * + * @param container Container to select an element from + * @param weightExtractor Function retrieving chance of each element in container, expected to take an element of the container and returning a double + * + * Note: container cannot be empty + */ + template <class C, class Fn> + typename C::const_iterator SelectRandomWeightedContainerElement(C const& container, Fn weightExtractor) + { + std::vector<double> weights; + weights.reserve(container.size()); + double weightSum = 0.0; + for (auto itr = container.begin(); itr != container.end(); ++itr) + { + double weight = weightExtractor(*itr); + weights.push_back(weight); + weightSum += weight; + } + if (weightSum <= 0.0) + weights.assign(container.size(), 1.0); + + return SelectRandomWeightedContainerElement(container, weights); + } + /** * @fn bool Trinity::Containers::Intersects(Iterator first1, Iterator last1, Iterator first2, Iterator last2) * diff --git a/src/common/Utilities/Random.cpp b/src/common/Utilities/Random.cpp new file mode 100644 index 00000000000..31318e8f52d --- /dev/null +++ b/src/common/Utilities/Random.cpp @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "Random.h" +#include "Common.h" +#include "Errors.h" +#include "SFMT.h" +#include <boost/thread/tss.hpp> + +static boost::thread_specific_ptr<SFMTRand> sfmtRand; + +static SFMTRand* GetRng() +{ + SFMTRand* rand = sfmtRand.get(); + + if (!rand) + { + rand = new SFMTRand(); + sfmtRand.reset(rand); + } + + return rand; +} + +int32 irand(int32 min, int32 max) +{ + ASSERT(max >= min); + return int32(GetRng()->IRandom(min, max)); +} + +uint32 urand(uint32 min, uint32 max) +{ + ASSERT(max >= min); + return GetRng()->URandom(min, max); +} + +uint32 urandms(uint32 min, uint32 max) +{ + ASSERT(max >= min); + ASSERT(INT_MAX / IN_MILLISECONDS >= max); + return GetRng()->URandom(min * IN_MILLISECONDS, max * IN_MILLISECONDS); +} + +float frand(float min, float max) +{ + ASSERT(max >= min); + return float(GetRng()->Random() * (max - min) + min); +} + +Milliseconds randtime(Milliseconds const& min, Milliseconds const& max) +{ + long long diff = max.count() - min.count(); + ASSERT(diff >= 0); + ASSERT(diff <= (uint32)-1); + return min + Milliseconds(urand(0, diff)); +} + +uint32 rand32() +{ + return GetRng()->BRandom(); +} + +double rand_norm() +{ + return GetRng()->Random(); +} + +double rand_chance() +{ + return GetRng()->Random() * 100.0; +} + +SFMTEngine& SFMTEngine::Instance() +{ + static SFMTEngine engine; + return engine; +} diff --git a/src/common/Utilities/Random.h b/src/common/Utilities/Random.h new file mode 100644 index 00000000000..5dea6117f97 --- /dev/null +++ b/src/common/Utilities/Random.h @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef Random_h__ +#define Random_h__ + +#include "Define.h" +#include "Duration.h" +#include <limits> +#include <random> + +/* Return a random number in the range min..max. */ +int32 irand(int32 min, int32 max); + +/* Return a random number in the range min..max (inclusive). */ +uint32 urand(uint32 min, uint32 max); + +/* Return a random millisecond value between min and max seconds. Functionally equivalent to urand(min*IN_MILLISECONDS, max*IN_MILLISECONDS). */ +uint32 urandms(uint32 min, uint32 max); + +/* Return a random number in the range 0 .. UINT32_MAX. */ +uint32 rand32(); + +/* Return a random time in the range min..max (up to millisecond precision). Only works for values where millisecond difference is a valid uint32. */ +Milliseconds randtime(Milliseconds const& min, Milliseconds const& max); + +/* Return a random number in the range min..max */ +float frand(float min, float max); + +/* Return a random double from 0.0 to 1.0 (exclusive). */ +double rand_norm(); + +/* Return a random double from 0.0 to 100.0 (exclusive). */ +double rand_chance(); + +/* Return true if a random roll fits in the specified chance (range 0-100). */ +inline bool roll_chance_f(float chance) +{ + return chance > rand_chance(); +} + +/* Return true if a random roll fits in the specified chance (range 0-100). */ +inline bool roll_chance_i(int chance) +{ + return chance > irand(0, 99); +} + +/* +* SFMT wrapper satisfying UniformRandomNumberGenerator concept for use in <random> algorithms +*/ +class SFMTEngine +{ +public: + typedef uint32 result_type; + + static TRINITY_CONSTEXPR result_type min() { return std::numeric_limits<result_type>::min(); } + static TRINITY_CONSTEXPR result_type max() { return std::numeric_limits<result_type>::max(); } + result_type operator()() const { return rand32(); } + + static SFMTEngine& Instance(); +}; + +// Ugly, horrible, i don't even..., hack for VS2013 to work around missing discrete_distribution(iterator, iterator) constructor +namespace Trinity +{ +#if COMPILER == COMPILER_MICROSOFT && _MSC_VER <= 1800 + template<typename T> + struct discrete_distribution_param : public std::discrete_distribution<T>::param_type + { + typedef typename std::discrete_distribution<T>::param_type base; + + template<typename InIt> + discrete_distribution_param(InIt begin, InIt end) : base(_Noinit()) + { + this->_Pvec.assign(begin, end); + this->_Init(); + } + }; +#else + template<typename T> + using discrete_distribution_param = typename std::discrete_distribution<T>::param_type; +#endif +} + +#endif // Random_h__ diff --git a/src/common/Utilities/Util.cpp b/src/common/Utilities/Util.cpp index 3eb901ca35d..1360253294f 100644 --- a/src/common/Utilities/Util.cpp +++ b/src/common/Utilities/Util.cpp @@ -20,10 +20,8 @@ #include "Common.h" #include "CompilerDefs.h" #include "utf8.h" -#include "SFMT.h" #include "Errors.h" // for ASSERT #include <stdarg.h> -#include <boost/thread/tss.hpp> #if COMPILER == COMPILER_GNU #include <sys/socket.h> @@ -31,61 +29,6 @@ #include <arpa/inet.h> #endif -static boost::thread_specific_ptr<SFMTRand> sfmtRand; - -static SFMTRand* GetRng() -{ - SFMTRand* rand = sfmtRand.get(); - - if (!rand) - { - rand = new SFMTRand(); - sfmtRand.reset(rand); - } - - return rand; -} - -int32 irand(int32 min, int32 max) -{ - ASSERT(max >= min); - return int32(GetRng()->IRandom(min, max)); -} - -uint32 urand(uint32 min, uint32 max) -{ - ASSERT(max >= min); - return GetRng()->URandom(min, max); -} - -uint32 urandms(uint32 min, uint32 max) -{ - ASSERT(max >= min); - ASSERT(INT_MAX/IN_MILLISECONDS >= max); - return GetRng()->URandom(min * IN_MILLISECONDS, max * IN_MILLISECONDS); -} - -float frand(float min, float max) -{ - ASSERT(max >= min); - return float(GetRng()->Random() * (max - min) + min); -} - -uint32 rand32() -{ - return GetRng()->BRandom(); -} - -double rand_norm() -{ - return GetRng()->Random(); -} - -double rand_chance() -{ - return GetRng()->Random() * 100.0; -} - Tokenizer::Tokenizer(const std::string &src, const char sep, uint32 vectorReserve) { m_str = new char[src.length() + 1]; diff --git a/src/common/Utilities/Util.h b/src/common/Utilities/Util.h index 1f3b78a8d56..ab5cabca8d2 100644 --- a/src/common/Utilities/Util.h +++ b/src/common/Utilities/Util.h @@ -21,6 +21,7 @@ #include "Define.h" #include "Errors.h" +#include "Random.h" #include <algorithm> #include <string> @@ -77,39 +78,6 @@ std::string secsToTimeString(uint64 timeInSecs, bool shortText = false, bool hou uint32 TimeStringToSecs(const std::string& timestring); std::string TimeToTimestampStr(time_t t); -/* Return a random number in the range min..max. */ -int32 irand(int32 min, int32 max); - -/* Return a random number in the range min..max (inclusive). */ -uint32 urand(uint32 min, uint32 max); - -/* Return a random millisecond value between min and max seconds. Functionally equivalent to urand(min*IN_MILLISECONDS, max*IN_MILLISECONDS). */ -uint32 urandms(uint32 min, uint32 max); - -/* Return a random number in the range 0 .. UINT32_MAX. */ -uint32 rand32(); - -/* Return a random number in the range min..max */ -float frand(float min, float max); - -/* Return a random double from 0.0 to 1.0 (exclusive). */ -double rand_norm(); - -/* Return a random double from 0.0 to 100.0 (exclusive). */ -double rand_chance(); - -/* Return true if a random roll fits in the specified chance (range 0-100). */ -inline bool roll_chance_f(float chance) -{ - return chance > rand_chance(); -} - -/* Return true if a random roll fits in the specified chance (range 0-100). */ -inline bool roll_chance_i(int chance) -{ - return chance > irand(0, 99); -} - inline void ApplyPercentModFloatVar(float& var, float val, bool apply) { if (val == -100.0f) // prevent set var to zero diff --git a/src/server/authserver/CMakeLists.txt b/src/server/authserver/CMakeLists.txt index c11deec39bb..d87847d6740 100644 --- a/src/server/authserver/CMakeLists.txt +++ b/src/server/authserver/CMakeLists.txt @@ -79,10 +79,10 @@ if( NOT WIN32 ) endif() target_link_libraries(authserver - common shared - format database + common + format ${MYSQL_LIBRARY} ${OPENSSL_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} diff --git a/src/server/authserver/Main.cpp b/src/server/authserver/Main.cpp index 0c812ebd494..0618ec437b6 100644 --- a/src/server/authserver/Main.cpp +++ b/src/server/authserver/Main.cpp @@ -68,11 +68,14 @@ bool StartDB(); void StopDB(); void SignalHandler(const boost::system::error_code& error, int signalNumber); void KeepDatabaseAliveHandler(const boost::system::error_code& error); +void BanExpiryHandler(boost::system::error_code const& error); variables_map GetConsoleArguments(int argc, char** argv, std::string& configFile, std::string& configService); boost::asio::io_service* _ioService; boost::asio::deadline_timer* _dbPingTimer; uint32 _dbPingInterval; +boost::asio::deadline_timer* _banExpiryCheckTimer; +uint32 _banExpiryCheckInterval; LoginDatabaseWorkerPool LoginDatabase; int main(int argc, char** argv) @@ -169,6 +172,11 @@ int main(int argc, char** argv) _dbPingTimer->expires_from_now(boost::posix_time::minutes(_dbPingInterval)); _dbPingTimer->async_wait(KeepDatabaseAliveHandler); + _banExpiryCheckInterval = sConfigMgr->GetIntDefault("BanExpiryCheckInterval", 60); + _banExpiryCheckTimer = new boost::asio::deadline_timer(*_ioService); + _banExpiryCheckTimer->expires_from_now(boost::posix_time::seconds(_banExpiryCheckInterval)); + _banExpiryCheckTimer->async_wait(BanExpiryHandler); + #if PLATFORM == PLATFORM_WINDOWS if (m_ServiceStatus != -1) { @@ -181,6 +189,7 @@ int main(int argc, char** argv) // Start the io service worker loop _ioService->run(); + _banExpiryCheckTimer->cancel(); _dbPingTimer->cancel(); sAuthSocketMgr.StopNetwork(); @@ -192,6 +201,7 @@ int main(int argc, char** argv) signals.cancel(); + delete _banExpiryCheckTimer; delete _dbPingTimer; delete _ioService; return 0; @@ -242,6 +252,18 @@ void KeepDatabaseAliveHandler(const boost::system::error_code& error) } } +void BanExpiryHandler(boost::system::error_code const& error) +{ + if (!error) + { + LoginDatabase.Execute(LoginDatabase.GetPreparedStatement(LOGIN_DEL_EXPIRED_IP_BANS)); + LoginDatabase.Execute(LoginDatabase.GetPreparedStatement(LOGIN_UPD_EXPIRED_ACCOUNT_BANS)); + + _banExpiryCheckTimer->expires_from_now(boost::posix_time::seconds(_banExpiryCheckInterval)); + _banExpiryCheckTimer->async_wait(BanExpiryHandler); + } +} + #if PLATFORM == PLATFORM_WINDOWS void ServiceStatusWatcher(boost::system::error_code const& error) { diff --git a/src/server/authserver/Server/AuthSession.cpp b/src/server/authserver/Server/AuthSession.cpp index 60e9b734b13..57e5d6682f2 100644 --- a/src/server/authserver/Server/AuthSession.cpp +++ b/src/server/authserver/Server/AuthSession.cpp @@ -43,12 +43,6 @@ enum eAuthCmd XFER_CANCEL = 0x34 }; -enum eStatus -{ - STATUS_CONNECTED = 0, - STATUS_AUTHED -}; - #pragma pack(push, 1) typedef struct AUTH_LOGON_CHALLENGE_C @@ -115,11 +109,10 @@ enum class BufferSizes : uint32 SRP_6_S = 0x20, }; +#define MAX_ACCEPTED_CHALLENGE_SIZE (sizeof(AUTH_LOGON_CHALLENGE_C) + 16) + #define AUTH_LOGON_CHALLENGE_INITIAL_SIZE 4 #define REALM_LIST_PACKET_SIZE 5 -#define XFER_ACCEPT_SIZE 1 -#define XFER_RESUME_SIZE 9 -#define XFER_CANCEL_SIZE 1 std::unordered_map<uint8, AuthHandler> AuthSession::InitHandlers() { @@ -130,15 +123,98 @@ std::unordered_map<uint8, AuthHandler> AuthSession::InitHandlers() handlers[AUTH_RECONNECT_CHALLENGE] = { STATUS_CONNECTED, AUTH_LOGON_CHALLENGE_INITIAL_SIZE, &AuthSession::HandleReconnectChallenge }; handlers[AUTH_RECONNECT_PROOF] = { STATUS_CONNECTED, sizeof(AUTH_RECONNECT_PROOF_C), &AuthSession::HandleReconnectProof }; handlers[REALM_LIST] = { STATUS_AUTHED, REALM_LIST_PACKET_SIZE, &AuthSession::HandleRealmList }; - handlers[XFER_ACCEPT] = { STATUS_AUTHED, XFER_ACCEPT_SIZE, &AuthSession::HandleXferAccept }; - handlers[XFER_RESUME] = { STATUS_AUTHED, XFER_RESUME_SIZE, &AuthSession::HandleXferResume }; - handlers[XFER_CANCEL] = { STATUS_AUTHED, XFER_CANCEL_SIZE, &AuthSession::HandleXferCancel }; return handlers; } std::unordered_map<uint8, AuthHandler> const Handlers = AuthSession::InitHandlers(); +void AccountInfo::LoadResult(Field* fields) +{ + // 0 1 2 3 4 5 6 + //SELECT a.id, a.username, a.locked, a.lock_country, a.last_ip, a.failed_logins, ab.unbandate > UNIX_TIMESTAMP() OR ab.unbandate = ab.bandate, + // 7 8 9 10 11 12 + // ab.unbandate = ab.bandate, aa.gmlevel, a.token_key, a.sha_pass_hash, a.v, a.s + //FROM account a LEFT JOIN account_access aa ON a.id = aa.id LEFT JOIN account_banned ab ON ab.id = a.id AND ab.active = 1 WHERE a.username = ? + + Id = fields[0].GetUInt32(); + Login = fields[1].GetString(); + IsLockedToIP = fields[2].GetBool(); + LockCountry = fields[3].GetString(); + LastIP = fields[4].GetString(); + FailedLogins = fields[5].GetUInt32(); + IsBanned = fields[6].GetUInt64() != 0; + IsPermanenetlyBanned = fields[7].GetUInt64() != 0; + SecurityLevel = AccountTypes(fields[8].GetUInt8()); +} + +AuthSession::AuthSession(tcp::socket&& socket) : Socket(std::move(socket)), +_sentChallenge(false), _sentProof(false), +_status(STATUS_CONNECTED), _build(0), _expversion(0) +{ + N.SetHexStr("894B645E89E1535BBDAD5B8B290650530801B18EBFBF5E8FAB3C82872A3E9BB7"); + g.SetDword(7); +} + +void AuthSession::Start() +{ + std::string ip_address = GetRemoteIpAddress().to_string(); + TC_LOG_TRACE("session", "Accepted connection from %s", ip_address.c_str()); + + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_IP_INFO); + stmt->setString(0, ip_address); + stmt->setUInt32(1, inet_addr(ip_address.c_str())); + + _queryCallback = std::bind(&AuthSession::CheckIpCallback, this, std::placeholders::_1); + _queryFuture = LoginDatabase.AsyncQuery(stmt); +} + +bool AuthSession::Update() +{ + if (!AuthSocket::Update()) + return false; + + if (_queryFuture.valid() && _queryFuture.wait_for(std::chrono::seconds(0)) == std::future_status::ready) + { + auto callback = _queryCallback; + _queryCallback = nullptr; + callback(_queryFuture.get()); + } + + return true; +} + +void AuthSession::CheckIpCallback(PreparedQueryResult result) +{ + if (result) + { + bool banned = false; + do + { + Field* fields = result->Fetch(); + if (fields[0].GetUInt64() != 0) + banned = true; + + if (!fields[1].GetString().empty()) + _ipCountry = fields[1].GetString(); + + } while (result->NextRow()); + + if (banned) + { + ByteBuffer pkt; + pkt << uint8(AUTH_LOGON_CHALLENGE); + pkt << uint8(0x00); + pkt << uint8(WOW_FAIL_BANNED); + SendPacket(pkt); + TC_LOG_DEBUG("session", "[AuthSession::CheckIpCallback] Banned ip '%s:%d' tries to login!", GetRemoteIpAddress().to_string().c_str(), GetRemotePort()); + return; + } + } + + AsyncRead(); +} + void AuthSession::ReadHandler() { MessageBuffer& packet = GetReadBuffer(); @@ -153,6 +229,12 @@ void AuthSession::ReadHandler() break; } + if (_status != itr->second.status) + { + CloseSocket(); + return; + } + uint16 size = uint16(itr->second.packetSize); if (packet.GetActiveSize() < size) break; @@ -161,12 +243,17 @@ void AuthSession::ReadHandler() { sAuthLogonChallenge_C* challenge = reinterpret_cast<sAuthLogonChallenge_C*>(packet.GetReadPointer()); size += challenge->size; + if (size > MAX_ACCEPTED_CHALLENGE_SIZE) + { + CloseSocket(); + return; + } } if (packet.GetActiveSize() < size) break; - if (!(*this.*Handlers.at(cmd).handler)()) + if (!(*this.*itr->second.handler)()) { CloseSocket(); return; @@ -187,233 +274,209 @@ void AuthSession::SendPacket(ByteBuffer& packet) { MessageBuffer buffer; buffer.Write(packet.contents(), packet.size()); - - std::unique_lock<std::mutex> guard(_writeLock); - - QueuePacket(std::move(buffer), guard); + QueuePacket(std::move(buffer)); } } bool AuthSession::HandleLogonChallenge() { + if (_sentChallenge) + return false; + + _sentChallenge = true; + sAuthLogonChallenge_C* challenge = reinterpret_cast<sAuthLogonChallenge_C*>(GetReadBuffer().GetReadPointer()); + if (challenge->size - (sizeof(sAuthLogonChallenge_C) - AUTH_LOGON_CHALLENGE_INITIAL_SIZE - 1) != challenge->I_len) + return false; - //TC_LOG_DEBUG("server.authserver", "[AuthChallenge] got full packet, %#04x bytes", challenge->size); - TC_LOG_DEBUG("server.authserver", "[AuthChallenge] name(%d): '%s'", challenge->I_len, challenge->I); + std::string login((const char*)challenge->I, challenge->I_len); + TC_LOG_DEBUG("server.authserver", "[AuthChallenge] '%s'", login.c_str()); - ByteBuffer pkt; + if (_queryCallback) + { + ByteBuffer pkt; + pkt << uint8(AUTH_LOGON_CHALLENGE); + pkt << uint8(0x00); + pkt << uint8(WOW_FAIL_DB_BUSY); + SendPacket(pkt); + + TC_LOG_DEBUG("server.authserver", "[AuthChallenge] %s attempted to log too quick after previous attempt!", login.c_str()); + return true; + } - _login.assign((const char*)challenge->I, challenge->I_len); _build = challenge->build; _expversion = uint8(AuthHelper::IsPostBCAcceptedClientBuild(_build) ? POST_BC_EXP_FLAG : (AuthHelper::IsPreBCAcceptedClientBuild(_build) ? PRE_BC_EXP_FLAG : NO_VALID_EXP_FLAG)); - _os = (const char*)challenge->os; - - if (_os.size() > 4) - return false; + std::array<char, 5> os; + os.fill('\0'); + memcpy(os.data(), challenge->os, sizeof(challenge->os)); + _os = os.data(); // Restore string order as its byte order is reversed std::reverse(_os.begin(), _os.end()); + _localizationName.resize(4); + for (int i = 0; i < 4; ++i) + _localizationName[i] = challenge->country[4 - i - 1]; + + // Get the account details from the account table + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_LOGONCHALLENGE); + stmt->setString(0, login); + + _queryCallback = std::bind(&AuthSession::LogonChallengeCallback, this, std::placeholders::_1); + _queryFuture = LoginDatabase.AsyncQuery(stmt); + return true; +} + +void AuthSession::LogonChallengeCallback(PreparedQueryResult result) +{ + ByteBuffer pkt; pkt << uint8(AUTH_LOGON_CHALLENGE); pkt << uint8(0x00); - // Verify that this IP is not in the ip_banned table - LoginDatabase.Execute(LoginDatabase.GetPreparedStatement(LOGIN_DEL_EXPIRED_IP_BANS)); + if (!result) + { + pkt << uint8(WOW_FAIL_UNKNOWN_ACCOUNT); + SendPacket(pkt); + return; + } + + Field* fields = result->Fetch(); + + _accountInfo.LoadResult(fields); std::string ipAddress = GetRemoteIpAddress().to_string(); uint16 port = GetRemotePort(); - PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_IP_BANNED); - stmt->setString(0, ipAddress); - PreparedQueryResult result = LoginDatabase.Query(stmt); - if (result) + // If the IP is 'locked', check that the player comes indeed from the correct IP address + if (_accountInfo.IsLockedToIP) { - pkt << uint8(WOW_FAIL_BANNED); - TC_LOG_DEBUG("server.authserver", "'%s:%d' [AuthChallenge] Banned ip tries to login!", ipAddress.c_str(), port); + TC_LOG_DEBUG("server.authserver", "[AuthChallenge] Account '%s' is locked to IP - '%s' is logging in from '%s'", _accountInfo.Login.c_str(), _accountInfo.LastIP.c_str(), ipAddress.c_str()); + if (_accountInfo.LastIP != ipAddress) + { + pkt << uint8(WOW_FAIL_LOCKED_ENFORCED); + SendPacket(pkt); + return; + } } else { - // Get the account details from the account table - // No SQL injection (prepared statement) - stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_LOGONCHALLENGE); - stmt->setString(0, _login); - - PreparedQueryResult res2 = LoginDatabase.Query(stmt); - if (res2) + TC_LOG_DEBUG("server.authserver", "[AuthChallenge] Account '%s' is not locked to ip", _accountInfo.Login.c_str()); + if (_accountInfo.LockCountry.empty() || _accountInfo.LockCountry == "00") + TC_LOG_DEBUG("server.authserver", "[AuthChallenge] Account '%s' is not locked to country", _accountInfo.Login.c_str()); + else if (!_accountInfo.LockCountry.empty() && !_ipCountry.empty()) { - Field* fields = res2->Fetch(); - - // If the IP is 'locked', check that the player comes indeed from the correct IP address - bool locked = false; - if (fields[2].GetUInt8() == 1) // if ip is locked - { - TC_LOG_DEBUG("server.authserver", "[AuthChallenge] Account '%s' is locked to IP - '%s'", _login.c_str(), fields[4].GetCString()); - TC_LOG_DEBUG("server.authserver", "[AuthChallenge] Player address is '%s'", ipAddress.c_str()); - - if (strcmp(fields[4].GetCString(), ipAddress.c_str()) != 0) - { - TC_LOG_DEBUG("server.authserver", "[AuthChallenge] Account IP differs"); - pkt << uint8(WOW_FAIL_LOCKED_ENFORCED); - locked = true; - } - else - TC_LOG_DEBUG("server.authserver", "[AuthChallenge] Account IP matches"); - } - else + TC_LOG_DEBUG("server.authserver", "[AuthChallenge] Account '%s' is locked to country: '%s' Player country is '%s'", _accountInfo.Login.c_str(), _accountInfo.LockCountry.c_str(), _ipCountry.c_str()); + if (_ipCountry != _accountInfo.LockCountry) { - TC_LOG_DEBUG("server.authserver", "[AuthChallenge] Account '%s' is not locked to ip", _login.c_str()); - std::string accountCountry = fields[3].GetString(); - if (accountCountry.empty() || accountCountry == "00") - TC_LOG_DEBUG("server.authserver", "[AuthChallenge] Account '%s' is not locked to country", _login.c_str()); - else if (!accountCountry.empty()) - { - uint32 ip = inet_addr(ipAddress.c_str()); - EndianConvertReverse(ip); - - stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_LOGON_COUNTRY); - stmt->setUInt32(0, ip); - if (PreparedQueryResult sessionCountryQuery = LoginDatabase.Query(stmt)) - { - std::string loginCountry = (*sessionCountryQuery)[0].GetString(); - TC_LOG_DEBUG("server.authserver", "[AuthChallenge] Account '%s' is locked to country: '%s' Player country is '%s'", _login.c_str(), - accountCountry.c_str(), loginCountry.c_str()); - - if (loginCountry != accountCountry) - { - TC_LOG_DEBUG("server.authserver", "[AuthChallenge] Account country differs."); - pkt << uint8(WOW_FAIL_UNLOCKABLE_LOCK); - locked = true; - } - else - TC_LOG_DEBUG("server.authserver", "[AuthChallenge] Account country matches"); - } - else - TC_LOG_DEBUG("server.authserver", "[AuthChallenge] IP2NATION Table empty"); - } + pkt << uint8(WOW_FAIL_UNLOCKABLE_LOCK); + SendPacket(pkt); + return; } + } + } - if (!locked) - { - //set expired bans to inactive - LoginDatabase.DirectExecute(LoginDatabase.GetPreparedStatement(LOGIN_UPD_EXPIRED_ACCOUNT_BANS)); - - // If the account is banned, reject the logon attempt - stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_BANNED); - stmt->setUInt32(0, fields[1].GetUInt32()); - PreparedQueryResult banresult = LoginDatabase.Query(stmt); - if (banresult) - { - if ((*banresult)[0].GetUInt32() == (*banresult)[1].GetUInt32()) - { - pkt << uint8(WOW_FAIL_BANNED); - TC_LOG_DEBUG("server.authserver", "'%s:%d' [AuthChallenge] Banned account %s tried to login!", ipAddress.c_str(), - port, _login.c_str()); - } - else - { - pkt << uint8(WOW_FAIL_SUSPENDED); - TC_LOG_DEBUG("server.authserver", "'%s:%d' [AuthChallenge] Temporarily banned account %s tried to login!", - ipAddress.c_str(), port, _login.c_str()); - } - } - else - { - // Get the password from the account table, upper it, and make the SRP6 calculation - std::string rI = fields[0].GetString(); - - // Don't calculate (v, s) if there are already some in the database - std::string databaseV = fields[6].GetString(); - std::string databaseS = fields[7].GetString(); - - TC_LOG_DEBUG("network", "database authentication values: v='%s' s='%s'", databaseV.c_str(), databaseS.c_str()); - - // multiply with 2 since bytes are stored as hexstring - if (databaseV.size() != size_t(BufferSizes::SRP_6_V) * 2 || databaseS.size() != size_t(BufferSizes::SRP_6_S) * 2) - SetVSFields(rI); - else - { - s.SetHexStr(databaseS.c_str()); - v.SetHexStr(databaseV.c_str()); - } - - b.SetRand(19 * 8); - BigNumber gmod = g.ModExp(b, N); - B = ((v * 3) + gmod) % N; - - ASSERT(gmod.GetNumBytes() <= 32); - - BigNumber unk3; - unk3.SetRand(16 * 8); - - // Fill the response packet with the result - if (AuthHelper::IsAcceptedClientBuild(_build)) - pkt << uint8(WOW_SUCCESS); - else - pkt << uint8(WOW_FAIL_VERSION_INVALID); - - // B may be calculated < 32B so we force minimal length to 32B - pkt.append(B.AsByteArray(32).get(), 32); // 32 bytes - pkt << uint8(1); - pkt.append(g.AsByteArray(1).get(), 1); - pkt << uint8(32); - pkt.append(N.AsByteArray(32).get(), 32); - pkt.append(s.AsByteArray(int32(BufferSizes::SRP_6_S)).get(), size_t(BufferSizes::SRP_6_S)); // 32 bytes - pkt.append(unk3.AsByteArray(16).get(), 16); - uint8 securityFlags = 0; - - // Check if token is used - _tokenKey = fields[8].GetString(); - if (!_tokenKey.empty()) - securityFlags = 4; - - pkt << uint8(securityFlags); // security flags (0x0...0x04) - - if (securityFlags & 0x01) // PIN input - { - pkt << uint32(0); - pkt << uint64(0) << uint64(0); // 16 bytes hash? - } - - if (securityFlags & 0x02) // Matrix input - { - pkt << uint8(0); - pkt << uint8(0); - pkt << uint8(0); - pkt << uint8(0); - pkt << uint64(0); - } - - if (securityFlags & 0x04) // Security token input - pkt << uint8(1); - - uint8 secLevel = fields[5].GetUInt8(); - _accountSecurityLevel = secLevel <= SEC_ADMINISTRATOR ? AccountTypes(secLevel) : SEC_ADMINISTRATOR; - - _localizationName.resize(4); - for (int i = 0; i < 4; ++i) - _localizationName[i] = challenge->country[4 - i - 1]; - - TC_LOG_DEBUG("server.authserver", "'%s:%d' [AuthChallenge] account %s is using '%c%c%c%c' locale (%u)", - ipAddress.c_str(), port, _login.c_str(), - challenge->country[3], challenge->country[2], challenge->country[1], challenge->country[0], - GetLocaleByName(_localizationName) - ); - } - } + // If the account is banned, reject the logon attempt + if (_accountInfo.IsBanned) + { + if (_accountInfo.IsPermanenetlyBanned) + { + pkt << uint8(WOW_FAIL_BANNED); + SendPacket(pkt); + TC_LOG_DEBUG("server.authserver", "'%s:%d' [AuthChallenge] Banned account %s tried to login!", ipAddress.c_str(), port, _accountInfo.Login.c_str()); + return; + } + else + { + pkt << uint8(WOW_FAIL_SUSPENDED); + SendPacket(pkt); + TC_LOG_DEBUG("server.authserver", "'%s:%d' [AuthChallenge] Temporarily banned account %s tried to login!", ipAddress.c_str(), port, _accountInfo.Login.c_str()); + return; } - else //no account - pkt << uint8(WOW_FAIL_UNKNOWN_ACCOUNT); } + // Get the password from the account table, upper it, and make the SRP6 calculation + std::string rI = fields[10].GetString(); + + // Don't calculate (v, s) if there are already some in the database + std::string databaseV = fields[11].GetString(); + std::string databaseS = fields[12].GetString(); + + TC_LOG_DEBUG("network", "database authentication values: v='%s' s='%s'", databaseV.c_str(), databaseS.c_str()); + + // multiply with 2 since bytes are stored as hexstring + if (databaseV.size() != size_t(BufferSizes::SRP_6_V) * 2 || databaseS.size() != size_t(BufferSizes::SRP_6_S) * 2) + SetVSFields(rI); + else + { + s.SetHexStr(databaseS.c_str()); + v.SetHexStr(databaseV.c_str()); + } + + b.SetRand(19 * 8); + BigNumber gmod = g.ModExp(b, N); + B = ((v * 3) + gmod) % N; + + ASSERT(gmod.GetNumBytes() <= 32); + + BigNumber unk3; + unk3.SetRand(16 * 8); + + // Fill the response packet with the result + if (AuthHelper::IsAcceptedClientBuild(_build)) + pkt << uint8(WOW_SUCCESS); + else + pkt << uint8(WOW_FAIL_VERSION_INVALID); + + // B may be calculated < 32B so we force minimal length to 32B + pkt.append(B.AsByteArray(32).get(), 32); // 32 bytes + pkt << uint8(1); + pkt.append(g.AsByteArray(1).get(), 1); + pkt << uint8(32); + pkt.append(N.AsByteArray(32).get(), 32); + pkt.append(s.AsByteArray(int32(BufferSizes::SRP_6_S)).get(), size_t(BufferSizes::SRP_6_S)); // 32 bytes + pkt.append(unk3.AsByteArray(16).get(), 16); + uint8 securityFlags = 0; + + // Check if token is used + _tokenKey = fields[9].GetString(); + if (!_tokenKey.empty()) + securityFlags = 4; + + pkt << uint8(securityFlags); // security flags (0x0...0x04) + + if (securityFlags & 0x01) // PIN input + { + pkt << uint32(0); + pkt << uint64(0) << uint64(0); // 16 bytes hash? + } + + if (securityFlags & 0x02) // Matrix input + { + pkt << uint8(0); + pkt << uint8(0); + pkt << uint8(0); + pkt << uint8(0); + pkt << uint64(0); + } + + if (securityFlags & 0x04) // Security token input + pkt << uint8(1); + + TC_LOG_DEBUG("server.authserver", "'%s:%d' [AuthChallenge] account %s is using '%s' locale (%u)", + ipAddress.c_str(), port, _accountInfo.Login.c_str(), _localizationName.c_str(), GetLocaleByName(_localizationName)); + SendPacket(pkt); - return true; } // Logon Proof command handler bool AuthSession::HandleLogonProof() { - TC_LOG_DEBUG("server.authserver", "Entering _HandleLogonProof"); + if (_sentProof) + return false; + + _sentProof = true; + // Read the packet sAuthLogonProof_C *logonProof = reinterpret_cast<sAuthLogonProof_C*>(GetReadBuffer().GetReadPointer()); @@ -487,7 +550,7 @@ bool AuthSession::HandleLogonProof() t3.SetBinary(hash, 20); sha.Initialize(); - sha.UpdateData(_login); + sha.UpdateData(_accountInfo.Login); sha.Finalize(); uint8 t4[SHA_DIGEST_LENGTH]; memcpy(t4, sha.GetDigest(), SHA_DIGEST_LENGTH); @@ -503,7 +566,7 @@ bool AuthSession::HandleLogonProof() // Check if SRP6 results match (password is correct), else send an error if (!memcmp(M.AsByteArray(sha.GetLength()).get(), logonProof->M1, 20)) { - TC_LOG_DEBUG("server.authserver", "'%s:%d' User '%s' successfully authenticated", GetRemoteIpAddress().to_string().c_str(), GetRemotePort(), _login.c_str()); + TC_LOG_DEBUG("server.authserver", "'%s:%d' User '%s' successfully authenticated", GetRemoteIpAddress().to_string().c_str(), GetRemotePort(), _accountInfo.Login.c_str()); // Update the sessionkey, last_ip, last login time and reset number of failed logins in the account table for this account // No SQL injection (escaped user name) and IP address as received by socket @@ -514,7 +577,7 @@ bool AuthSession::HandleLogonProof() stmt->setString(1, GetRemoteIpAddress().to_string().c_str()); stmt->setUInt32(2, GetLocaleByName(_localizationName)); stmt->setString(3, _os); - stmt->setString(4, _login); + stmt->setString(4, _accountInfo.Login); LoginDatabase.DirectExecute(stmt); OPENSSL_free((void*)K_hex); @@ -531,6 +594,7 @@ bool AuthSession::HandleLogonProof() std::string token(reinterpret_cast<char*>(GetReadBuffer().GetReadPointer() + sizeof(sAuthLogonProof_C) + sizeof(size)), size); GetReadBuffer().ReadCompleted(sizeof(size) + size); uint32 validToken = TOTP::GenerateToken(_tokenKey.c_str()); + _tokenKey.clear(); uint32 incomingToken = atoi(token.c_str()); if (validToken != incomingToken) { @@ -571,7 +635,7 @@ bool AuthSession::HandleLogonProof() } SendPacket(packet); - _isAuthenticated = true; + _status = STATUS_AUTHED; } else { @@ -583,7 +647,7 @@ bool AuthSession::HandleLogonProof() SendPacket(packet); TC_LOG_DEBUG("server.authserver", "'%s:%d' [AuthChallenge] account %s tried to login with invalid password!", - GetRemoteIpAddress().to_string().c_str(), GetRemotePort(), _login.c_str()); + GetRemoteIpAddress().to_string().c_str(), GetRemotePort(), _accountInfo.Login.c_str()); uint32 MaxWrongPassCount = sConfigMgr->GetIntDefault("WrongPass.MaxCount", 0); @@ -591,7 +655,7 @@ bool AuthSession::HandleLogonProof() if (sConfigMgr->GetBoolDefault("WrongPass.Logging", false)) { PreparedStatement* logstmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_FALP_IP_LOGGING); - logstmt->setString(0, _login); + logstmt->setString(0, _accountInfo.Login); logstmt->setString(1, GetRemoteIpAddress().to_string()); logstmt->setString(2, "Logged on failed AccountLogin due wrong password"); @@ -602,42 +666,33 @@ bool AuthSession::HandleLogonProof() { //Increment number of failed logins by one and if it reaches the limit temporarily ban that account or IP PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_FAILEDLOGINS); - stmt->setString(0, _login); + stmt->setString(0, _accountInfo.Login); LoginDatabase.Execute(stmt); - stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_FAILEDLOGINS); - stmt->setString(0, _login); - - if (PreparedQueryResult loginfail = LoginDatabase.Query(stmt)) + if (_accountInfo.FailedLogins >= MaxWrongPassCount) { - uint32 failed_logins = (*loginfail)[1].GetUInt32(); + uint32 WrongPassBanTime = sConfigMgr->GetIntDefault("WrongPass.BanTime", 600); + bool WrongPassBanType = sConfigMgr->GetBoolDefault("WrongPass.BanType", false); - if (failed_logins >= MaxWrongPassCount) + if (WrongPassBanType) + { + stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_ACCOUNT_AUTO_BANNED); + stmt->setUInt32(0, _accountInfo.Id); + stmt->setUInt32(1, WrongPassBanTime); + LoginDatabase.Execute(stmt); + + TC_LOG_DEBUG("server.authserver", "'%s:%d' [AuthChallenge] account %s got banned for '%u' seconds because it failed to authenticate '%u' times", + GetRemoteIpAddress().to_string().c_str(), GetRemotePort(), _accountInfo.Login.c_str(), WrongPassBanTime, _accountInfo.FailedLogins); + } + else { - uint32 WrongPassBanTime = sConfigMgr->GetIntDefault("WrongPass.BanTime", 600); - bool WrongPassBanType = sConfigMgr->GetBoolDefault("WrongPass.BanType", false); - - if (WrongPassBanType) - { - uint32 acc_id = (*loginfail)[0].GetUInt32(); - stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_ACCOUNT_AUTO_BANNED); - stmt->setUInt32(0, acc_id); - stmt->setUInt32(1, WrongPassBanTime); - LoginDatabase.Execute(stmt); - - TC_LOG_DEBUG("server.authserver", "'%s:%d' [AuthChallenge] account %s got banned for '%u' seconds because it failed to authenticate '%u' times", - GetRemoteIpAddress().to_string().c_str(), GetRemotePort(), _login.c_str(), WrongPassBanTime, failed_logins); - } - else - { - stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_IP_AUTO_BANNED); - stmt->setString(0, GetRemoteIpAddress().to_string()); - stmt->setUInt32(1, WrongPassBanTime); - LoginDatabase.Execute(stmt); - - TC_LOG_DEBUG("server.authserver", "'%s:%d' [AuthChallenge] IP got banned for '%u' seconds because account %s failed to authenticate '%u' times", - GetRemoteIpAddress().to_string().c_str(), GetRemotePort(), WrongPassBanTime, _login.c_str(), failed_logins); - } + stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_IP_AUTO_BANNED); + stmt->setString(0, GetRemoteIpAddress().to_string()); + stmt->setUInt32(1, WrongPassBanTime); + LoginDatabase.Execute(stmt); + + TC_LOG_DEBUG("server.authserver", "'%s:%d' [AuthChallenge] IP got banned for '%u' seconds because account %s failed to authenticate '%u' times", + GetRemoteIpAddress().to_string().c_str(), GetRemotePort(), WrongPassBanTime, _accountInfo.Login.c_str(), _accountInfo.FailedLogins); } } } @@ -648,61 +703,88 @@ bool AuthSession::HandleLogonProof() bool AuthSession::HandleReconnectChallenge() { - TC_LOG_DEBUG("server.authserver", "Entering _HandleReconnectChallenge"); - sAuthLogonChallenge_C* challenge = reinterpret_cast<sAuthLogonChallenge_C*>(GetReadBuffer().GetReadPointer()); + if (_sentChallenge) + return false; - //TC_LOG_DEBUG("server.authserver", "[AuthChallenge] got full packet, %#04x bytes", challenge->size); - TC_LOG_DEBUG("server.authserver", "[AuthChallenge] name(%d): '%s'", challenge->I_len, challenge->I); + _sentChallenge = true; - _login.assign((const char*)challenge->I, challenge->I_len); + sAuthLogonChallenge_C* challenge = reinterpret_cast<sAuthLogonChallenge_C*>(GetReadBuffer().GetReadPointer()); + if (challenge->size - (sizeof(sAuthLogonChallenge_C) - AUTH_LOGON_CHALLENGE_INITIAL_SIZE - 1) != challenge->I_len) + return false; - PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_SESSIONKEY); - stmt->setString(0, _login); - PreparedQueryResult result = LoginDatabase.Query(stmt); + std::string login((const char*)challenge->I, challenge->I_len); + TC_LOG_DEBUG("server.authserver", "[ReconnectChallenge] '%s'", login.c_str()); - // Stop if the account is not found - if (!result) + if (_queryCallback) { - TC_LOG_ERROR("server.authserver", "'%s:%d' [ERROR] user %s tried to login and we cannot find his session key in the database.", - GetRemoteIpAddress().to_string().c_str(), GetRemotePort(), _login.c_str()); - return false; + ByteBuffer pkt; + pkt << uint8(AUTH_RECONNECT_CHALLENGE); + pkt << uint8(WOW_FAIL_DB_BUSY); + SendPacket(pkt); + + TC_LOG_DEBUG("server.authserver", "[ReconnectChallenge] %s attempted to log too quick after previous attempt!", login.c_str()); + return true; } - // Reinitialize build, expansion and the account securitylevel _build = challenge->build; _expversion = uint8(AuthHelper::IsPostBCAcceptedClientBuild(_build) ? POST_BC_EXP_FLAG : (AuthHelper::IsPreBCAcceptedClientBuild(_build) ? PRE_BC_EXP_FLAG : NO_VALID_EXP_FLAG)); - _os = (const char*)challenge->os; - - if (_os.size() > 4) - return false; + std::array<char, 5> os; + os.fill('\0'); + memcpy(os.data(), challenge->os, sizeof(challenge->os)); + _os = os.data(); // Restore string order as its byte order is reversed std::reverse(_os.begin(), _os.end()); - Field* fields = result->Fetch(); - uint8 secLevel = fields[2].GetUInt8(); - _accountSecurityLevel = secLevel <= SEC_ADMINISTRATOR ? AccountTypes(secLevel) : SEC_ADMINISTRATOR; + _localizationName.resize(4); + for (int i = 0; i < 4; ++i) + _localizationName[i] = challenge->country[4 - i - 1]; - K.SetHexStr((*result)[0].GetCString()); + // Get the account details from the account table + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_RECONNECTCHALLENGE); + stmt->setString(0, login); + + _queryCallback = std::bind(&AuthSession::ReconnectChallengeCallback, this, std::placeholders::_1); + _queryFuture = LoginDatabase.AsyncQuery(stmt); + return true; +} - // Sending response +void AuthSession::ReconnectChallengeCallback(PreparedQueryResult result) +{ ByteBuffer pkt; pkt << uint8(AUTH_RECONNECT_CHALLENGE); - pkt << uint8(0x00); + + if (!result) + { + pkt << uint8(WOW_FAIL_UNKNOWN_ACCOUNT); + SendPacket(pkt); + return; + } + + Field* fields = result->Fetch(); + + _accountInfo.LoadResult(fields); + K.SetHexStr(fields[9].GetCString()); _reconnectProof.SetRand(16 * 8); - pkt.append(_reconnectProof.AsByteArray(16).get(), 16); // 16 bytes random + + pkt << uint8(WOW_SUCCESS); + pkt.append(_reconnectProof.AsByteArray(16).get(), 16); // 16 bytes random pkt << uint64(0x00) << uint64(0x00); // 16 bytes zeros SendPacket(pkt); - - return true; } + bool AuthSession::HandleReconnectProof() { TC_LOG_DEBUG("server.authserver", "Entering _HandleReconnectProof"); + if (_sentProof) + return false; + + _sentProof = true; + sAuthReconnectProof_C *reconnectProof = reinterpret_cast<sAuthReconnectProof_C*>(GetReadBuffer().GetReadPointer()); - if (_login.empty() || !_reconnectProof.GetNumBytes() || !K.GetNumBytes()) + if (_accountInfo.Login.empty() || !_reconnectProof.GetNumBytes() || !K.GetNumBytes()) return false; BigNumber t1; @@ -710,7 +792,7 @@ bool AuthSession::HandleReconnectProof() SHA1Hash sha; sha.Initialize(); - sha.UpdateData(_login); + sha.UpdateData(_accountInfo.Login); sha.UpdateBigNumbers(&t1, &_reconnectProof, &K, NULL); sha.Finalize(); @@ -722,13 +804,13 @@ bool AuthSession::HandleReconnectProof() pkt << uint8(0x00); pkt << uint16(0x00); // 2 bytes zeros SendPacket(pkt); - _isAuthenticated = true; + _status = STATUS_AUTHED; return true; } else { TC_LOG_ERROR("server.authserver", "'%s:%d' [ERROR] user %s tried to login, but session is invalid.", GetRemoteIpAddress().to_string().c_str(), - GetRemotePort(), _login.c_str()); + GetRemotePort(), _accountInfo.Login.c_str()); return false; } } @@ -772,20 +854,31 @@ bool AuthSession::HandleRealmList() { TC_LOG_DEBUG("server.authserver", "Entering _HandleRealmList"); - // Get the user id (else close the connection) - // No SQL injection (prepared statement) - PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_ID_BY_NAME); - stmt->setString(0, _login); - PreparedQueryResult result = LoginDatabase.Query(stmt); - if (!result) + if (_queryCallback) { - TC_LOG_ERROR("server.authserver", "'%s:%d' [ERROR] user %s tried to login but we cannot find him in the database.", GetRemoteIpAddress().to_string().c_str(), - GetRemotePort(), _login.c_str()); + TC_LOG_DEBUG("server.authserver", "[RealmList] %s attempted to get realmlist too quick after previous attempt!", _accountInfo.Login.c_str()); return false; } - Field* fields = result->Fetch(); - uint32 id = fields[0].GetUInt32(); + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_REALM_CHARACTER_COUNTS); + stmt->setUInt32(0, _accountInfo.Id); + + _queryCallback = std::bind(&AuthSession::RealmListCallback, this, std::placeholders::_1); + _queryFuture = LoginDatabase.AsyncQuery(stmt); + return true; +} + +void AuthSession::RealmListCallback(PreparedQueryResult result) +{ + std::map<uint32, uint8> characterCounts; + if (result) + { + do + { + Field* fields = result->Fetch(); + characterCounts[fields[0].GetUInt32()] = fields[1].GetUInt8(); + } while (result->NextRow()); + } // Update realm list if need sRealmList->UpdateIfNeed(); @@ -822,25 +915,17 @@ bool AuthSession::HandleRealmList() name = ss.str(); } - uint8 lock = (realm.allowedSecurityLevel > _accountSecurityLevel) ? 1 : 0; - - uint8 AmountOfCharacters = 0; - stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_NUM_CHARS_ON_REALM); - stmt->setUInt32(0, realm.m_ID); - stmt->setUInt32(1, id); - result = LoginDatabase.Query(stmt); - if (result) - AmountOfCharacters = (*result)[0].GetUInt8(); + uint8 lock = (realm.allowedSecurityLevel > _accountInfo.SecurityLevel) ? 1 : 0; - pkt << realm.icon; // realm type + pkt << uint8(realm.icon); // realm type if (_expversion & POST_BC_EXP_FLAG) // only 2.x and 3.x clients - pkt << lock; // if 1, then realm locked + pkt << uint8(lock); // if 1, then realm locked pkt << uint8(flag); // RealmFlags pkt << name; pkt << boost::lexical_cast<std::string>(GetAddressForClient(realm, GetRemoteIpAddress())); - pkt << realm.populationLevel; - pkt << AmountOfCharacters; - pkt << realm.timezone; // realm category + pkt << float(realm.populationLevel); + pkt << uint8(characterCounts[realm.m_ID]); + pkt << uint8(realm.timezone); // realm category if (_expversion & POST_BC_EXP_FLAG) // 2.x and 3.x clients pkt << uint8(realm.m_ID); else @@ -882,32 +967,6 @@ bool AuthSession::HandleRealmList() hdr.append(RealmListSizeBuffer); // append RealmList's size buffer hdr.append(pkt); // append realms in the realmlist SendPacket(hdr); - return true; -} - -// Resume patch transfer -bool AuthSession::HandleXferResume() -{ - TC_LOG_DEBUG("server.authserver", "Entering _HandleXferResume"); - //uint8 - //uint64 - return true; -} - -// Cancel patch transfer -bool AuthSession::HandleXferCancel() -{ - TC_LOG_DEBUG("server.authserver", "Entering _HandleXferCancel"); - //uint8 - return false; -} - -// Accept patch transfer -bool AuthSession::HandleXferAccept() -{ - TC_LOG_DEBUG("server.authserver", "Entering _HandleXferAccept"); - //uint8 - return true; } // Make the SRP6 calculation from hash in dB @@ -940,7 +999,7 @@ void AuthSession::SetVSFields(const std::string& rI) PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_VS); stmt->setString(0, v_hex); stmt->setString(1, s_hex); - stmt->setString(2, _login); + stmt->setString(2, _accountInfo.Login); LoginDatabase.Execute(stmt); OPENSSL_free(v_hex); diff --git a/src/server/authserver/Server/AuthSession.h b/src/server/authserver/Server/AuthSession.h index d40e0852b57..1babb7407a9 100644 --- a/src/server/authserver/Server/AuthSession.h +++ b/src/server/authserver/Server/AuthSession.h @@ -23,29 +23,48 @@ #include "ByteBuffer.h" #include "Socket.h" #include "BigNumber.h" +#include "Callback.h" #include <memory> #include <boost/asio/ip/tcp.hpp> using boost::asio::ip::tcp; +class Field; struct AuthHandler; +enum AuthStatus +{ + STATUS_CONNECTED = 0, + STATUS_AUTHED +}; + +struct AccountInfo +{ + void LoadResult(Field* fields); + + uint32 Id = 0; + std::string Login; + bool IsLockedToIP = false; + std::string LockCountry; + std::string LastIP; + uint32 FailedLogins = 0; + bool IsBanned = false; + bool IsPermanenetlyBanned = false; + AccountTypes SecurityLevel = SEC_PLAYER; + std::string TokenKey; +}; + class AuthSession : public Socket<AuthSession> { + typedef Socket<AuthSession> AuthSocket; + public: static std::unordered_map<uint8, AuthHandler> InitHandlers(); - AuthSession(tcp::socket&& socket) : Socket(std::move(socket)), - _isAuthenticated(false), _build(0), _expversion(0), _accountSecurityLevel(SEC_PLAYER) - { - N.SetHexStr("894B645E89E1535BBDAD5B8B290650530801B18EBFBF5E8FAB3C82872A3E9BB7"); - g.SetDword(7); - } + AuthSession(tcp::socket&& socket); - void Start() override - { - AsyncRead(); - } + void Start() override; + bool Update() override; void SendPacket(ByteBuffer& packet); @@ -59,10 +78,10 @@ private: bool HandleReconnectProof(); bool HandleRealmList(); - //data transfer handle for patch - bool HandleXferResume(); - bool HandleXferCancel(); - bool HandleXferAccept(); + void CheckIpCallback(PreparedQueryResult result); + void LogonChallengeCallback(PreparedQueryResult result); + void ReconnectChallengeCallback(PreparedQueryResult result); + void RealmListCallback(PreparedQueryResult result); void SetVSFields(const std::string& rI); @@ -71,22 +90,27 @@ private: BigNumber K; BigNumber _reconnectProof; - bool _isAuthenticated; + bool _sentChallenge; + bool _sentProof; + + AuthStatus _status; + AccountInfo _accountInfo; std::string _tokenKey; - std::string _login; std::string _localizationName; std::string _os; + std::string _ipCountry; uint16 _build; uint8 _expversion; - AccountTypes _accountSecurityLevel; + PreparedQueryResultFuture _queryFuture; + std::function<void(PreparedQueryResult)> _queryCallback; }; #pragma pack(push, 1) struct AuthHandler { - uint32 status; + AuthStatus status; size_t packetSize; bool (AuthSession::*handler)(); }; diff --git a/src/server/authserver/Server/AuthSocketMgr.h b/src/server/authserver/Server/AuthSocketMgr.h index fa96502663f..a16b7d405b9 100644 --- a/src/server/authserver/Server/AuthSocketMgr.h +++ b/src/server/authserver/Server/AuthSocketMgr.h @@ -21,8 +21,6 @@ #include "SocketMgr.h" #include "AuthSession.h" -void OnSocketAccept(tcp::socket&& sock); - class AuthSocketMgr : public SocketMgr<AuthSession> { typedef SocketMgr<AuthSession> BaseSocketMgr; @@ -39,7 +37,7 @@ public: if (!BaseSocketMgr::StartNetwork(service, bindIp, port)) return false; - _acceptor->AsyncAcceptManaged(&OnSocketAccept); + _acceptor->AsyncAcceptWithCallback<&AuthSocketMgr::OnSocketAccept>(); return true; } @@ -48,14 +46,13 @@ protected: { return new NetworkThread<AuthSession>[1]; } + + static void OnSocketAccept(tcp::socket&& sock, uint32 threadIndex) + { + Instance().OnSocketOpen(std::forward<tcp::socket>(sock), threadIndex); + } }; #define sAuthSocketMgr AuthSocketMgr::Instance() -void OnSocketAccept(tcp::socket&& sock) -{ - sAuthSocketMgr.OnSocketOpen(std::forward<tcp::socket>(sock)); -} - - #endif // AuthSocketMgr_h__ diff --git a/src/server/authserver/authserver.conf.dist b/src/server/authserver/authserver.conf.dist index 604988d62e5..a97d75b3f57 100644 --- a/src/server/authserver/authserver.conf.dist +++ b/src/server/authserver/authserver.conf.dist @@ -131,6 +131,33 @@ WrongPass.BanType = 0 WrongPass.Logging = 0 # +# BanExpiryCheckInterval +# Description: Time (in seconds) between checks for expired bans +# Default: 60 + +BanExpiryCheckInterval = 60 + +# +# SourceDirectory +# Description: The path to your TrinityCore source directory. +# If the path is left empty, the built-in CMAKE_SOURCE_DIR is used. +# Example: "../TrinityCore" +# Default: "" + +SourceDirectory = "" + +# +# MySQLExecutable +# Description: The path to your mysql cli binary. +# If the path is left empty, built-in path from cmake is used. +# Example: "C:/Program Files/MySQL/MySQL Server 5.6/bin/mysql.exe" +# "mysql.exe" +# "/usr/bin/mysql" +# Default: "" + +MySQLExecutable = "" + +# ################################################################################################### ################################################################################################### @@ -174,26 +201,6 @@ LoginDatabase.WorkerThreads = 1 Updates.EnableDatabases = 0 # -# Updates.SourcePath -# Description: The path to your TrinityCore source directory. -# If the path is left empty, built-in CMAKE_SOURCE_DIR is used. -# Example: "../TrinityCore" -# Default: "" - -Updates.SourcePath = "" - -# -# Updates.MySqlCLIPath -# Description: The path to your mysql cli binary. -# If the path is left empty, built-in path from cmake is used. -# Example: "C:/Program Files/MySQL/MySQL Server 5.6/bin/mysql.exe" -# "mysql.exe" -# "/usr/bin/mysql" -# Default: "" - -Updates.MySqlCLIPath = "" - -# # Updates.AutoSetup # Description: Auto populate empty databases. # Default: 1 - (Enabled) diff --git a/src/server/database/Database/DatabaseLoader.cpp b/src/server/database/Database/DatabaseLoader.cpp index 92d8730cd12..6a8e86ffca9 100644 --- a/src/server/database/Database/DatabaseLoader.cpp +++ b/src/server/database/Database/DatabaseLoader.cpp @@ -32,7 +32,7 @@ DatabaseLoader& DatabaseLoader::AddDatabase(DatabaseWorkerPool<T>& pool, std::st { bool const updatesEnabledForThis = DBUpdater<T>::IsEnabled(_updateFlags); - _open.push(std::make_pair([this, name, updatesEnabledForThis, &pool]() -> bool + _open.push([this, name, updatesEnabledForThis, &pool]() -> bool { std::string const dbString = sConfigMgr->GetStringDefault(name + "DatabaseInfo", ""); if (dbString.empty()) @@ -71,12 +71,13 @@ DatabaseLoader& DatabaseLoader::AddDatabase(DatabaseWorkerPool<T>& pool, std::st return false; } } + // Add the close operation + _close.push([&pool] + { + pool.Close(); + }); return true; - }, - [&pool]() - { - pool.Close(); - })); + }); // Populate and update only if updates are enabled for this pool if (updatesEnabledForThis) @@ -137,38 +138,7 @@ bool DatabaseLoader::Load() bool DatabaseLoader::OpenDatabases() { - while (!_open.empty()) - { - std::pair<Predicate, std::function<void()>> const load = _open.top(); - if (load.first()) - _close.push(load.second); - else - { - // Close all loaded databases - while (!_close.empty()) - { - _close.top()(); - _close.pop(); - } - return false; - } - - _open.pop(); - } - return true; -} - -// Processes the elements of the given stack until a predicate returned false. -bool DatabaseLoader::Process(std::stack<Predicate>& stack) -{ - while (!stack.empty()) - { - if (!stack.top()()) - return false; - - stack.pop(); - } - return true; + return Process(_open); } bool DatabaseLoader::PopulateDatabases() @@ -186,6 +156,27 @@ bool DatabaseLoader::PrepareStatements() return Process(_prepare); } +bool DatabaseLoader::Process(std::queue<Predicate>& queue) +{ + while (!queue.empty()) + { + if (!queue.front()()) + { + // Close all open databases which have a registered close operation + while (!_close.empty()) + { + _close.top()(); + _close.pop(); + } + + return false; + } + + queue.pop(); + } + return true; +} + template DatabaseLoader& DatabaseLoader::AddDatabase<LoginDatabaseConnection>(DatabaseWorkerPool<LoginDatabaseConnection>& pool, std::string const& name); template diff --git a/src/server/database/Database/DatabaseLoader.h b/src/server/database/Database/DatabaseLoader.h index da92cf85a9f..ec390a427ad 100644 --- a/src/server/database/Database/DatabaseLoader.h +++ b/src/server/database/Database/DatabaseLoader.h @@ -21,8 +21,9 @@ #include "DatabaseWorkerPool.h" #include "DatabaseEnv.h" -#include <stack> #include <functional> +#include <stack> +#include <queue> // A helper class to initiate all database worker pools, // handles updating, delays preparing of statements and cleans up on failure. @@ -56,16 +57,18 @@ private: bool PrepareStatements(); using Predicate = std::function<bool()>; + using Closer = std::function<void()>; - static bool Process(std::stack<Predicate>& stack); + // Invokes all functions in the given queue and closes the databases on errors. + // Returns false when there was an error. + bool Process(std::queue<Predicate>& queue); std::string const _logger; bool const _autoSetup; uint32 const _updateFlags; - std::stack<std::pair<Predicate, std::function<void()>>> _open; - std::stack<std::function<void()>> _close; - std::stack<Predicate> _populate, _update, _prepare; + std::queue<Predicate> _open, _populate, _update, _prepare; + std::stack<Closer> _close; }; #endif // DatabaseLoader_h__ diff --git a/src/server/database/Database/DatabaseWorkerPool.cpp b/src/server/database/Database/DatabaseWorkerPool.cpp new file mode 100644 index 00000000000..5d914b6e0e8 --- /dev/null +++ b/src/server/database/Database/DatabaseWorkerPool.cpp @@ -0,0 +1,322 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "DatabaseWorkerPool.h" +#include "DatabaseEnv.h" + +#define MIN_MYSQL_SERVER_VERSION 50100u +#define MIN_MYSQL_CLIENT_VERSION 50100u + +template <class T> +DatabaseWorkerPool<T>::DatabaseWorkerPool() + : _queue(new ProducerConsumerQueue<SQLOperation*>()), + _async_threads(0), _synch_threads(0) +{ + WPFatal(mysql_thread_safe(), "Used MySQL library isn't thread-safe."); + WPFatal(mysql_get_client_version() >= MIN_MYSQL_CLIENT_VERSION, "TrinityCore does not support MySQL versions below 5.1"); + WPFatal(mysql_get_client_version() == MYSQL_VERSION_ID, "Used MySQL library version (%s) does not match the version used to compile TrinityCore (%s).", + mysql_get_client_info(), MYSQL_SERVER_VERSION); +} + +template <class T> +void DatabaseWorkerPool<T>::SetConnectionInfo(std::string const& infoString, + uint8 const asyncThreads, uint8 const synchThreads) +{ + _connectionInfo = Trinity::make_unique<MySQLConnectionInfo>(infoString); + + _async_threads = asyncThreads; + _synch_threads = synchThreads; +} + +template <class T> +uint32 DatabaseWorkerPool<T>::Open() +{ + WPFatal(_connectionInfo.get(), "Connection info was not set!"); + + TC_LOG_INFO("sql.driver", "Opening DatabasePool '%s'. " + "Asynchronous connections: %u, synchronous connections: %u.", + GetDatabaseName(), _async_threads, _synch_threads); + + uint32 error = OpenConnections(IDX_ASYNC, _async_threads); + + if (error) + return error; + + error = OpenConnections(IDX_SYNCH, _synch_threads); + + if (!error) + { + TC_LOG_INFO("sql.driver", "DatabasePool '%s' opened successfully. " SZFMTD + " total connections running.", GetDatabaseName(), + (_connections[IDX_SYNCH].size() + _connections[IDX_ASYNC].size())); + } + + return error; +} + +template <class T> +void DatabaseWorkerPool<T>::Close() +{ + TC_LOG_INFO("sql.driver", "Closing down DatabasePool '%s'.", GetDatabaseName()); + + //! Closes the actualy MySQL connection. + _connections[IDX_ASYNC].clear(); + + TC_LOG_INFO("sql.driver", "Asynchronous connections on DatabasePool '%s' terminated. " + "Proceeding with synchronous connections.", + GetDatabaseName()); + + //! Shut down the synchronous connections + //! There's no need for locking the connection, because DatabaseWorkerPool<>::Close + //! should only be called after any other thread tasks in the core have exited, + //! meaning there can be no concurrent access at this point. + _connections[IDX_SYNCH].clear(); + + TC_LOG_INFO("sql.driver", "All connections on DatabasePool '%s' closed.", GetDatabaseName()); +} + +template <class T> +bool DatabaseWorkerPool<T>::PrepareStatements() +{ + for (auto& connections : _connections) + for (auto& connection : connections) + { + connection->LockIfReady(); + if (!connection->PrepareStatements()) + { + connection->Unlock(); + Close(); + return false; + } + else + connection->Unlock(); + } + + return true; +} + +template <class T> +QueryResult DatabaseWorkerPool<T>::Query(const char* sql, T* connection /*= nullptr*/) +{ + if (!connection) + connection = GetFreeConnection(); + + ResultSet* result = connection->Query(sql); + connection->Unlock(); + if (!result || !result->GetRowCount() || !result->NextRow()) + { + delete result; + return QueryResult(NULL); + } + + return QueryResult(result); +} + +template <class T> +PreparedQueryResult DatabaseWorkerPool<T>::Query(PreparedStatement* stmt) +{ + auto connection = GetFreeConnection(); + PreparedResultSet* ret = connection->Query(stmt); + connection->Unlock(); + + //! Delete proxy-class. Not needed anymore + delete stmt; + + if (!ret || !ret->GetRowCount()) + { + delete ret; + return PreparedQueryResult(NULL); + } + + return PreparedQueryResult(ret); +} + +template <class T> +QueryResultFuture DatabaseWorkerPool<T>::AsyncQuery(const char* sql) +{ + BasicStatementTask* task = new BasicStatementTask(sql, true); + // Store future result before enqueueing - task might get already processed and deleted before returning from this method + QueryResultFuture result = task->GetFuture(); + Enqueue(task); + return result; +} + +template <class T> +PreparedQueryResultFuture DatabaseWorkerPool<T>::AsyncQuery(PreparedStatement* stmt) +{ + PreparedStatementTask* task = new PreparedStatementTask(stmt, true); + // Store future result before enqueueing - task might get already processed and deleted before returning from this method + PreparedQueryResultFuture result = task->GetFuture(); + Enqueue(task); + return result; +} + +template <class T> +QueryResultHolderFuture DatabaseWorkerPool<T>::DelayQueryHolder(SQLQueryHolder* holder) +{ + SQLQueryHolderTask* task = new SQLQueryHolderTask(holder); + // Store future result before enqueueing - task might get already processed and deleted before returning from this method + QueryResultHolderFuture result = task->GetFuture(); + Enqueue(task); + return result; +} + +template <class T> +void DatabaseWorkerPool<T>::CommitTransaction(SQLTransaction transaction) +{ +#ifdef TRINITY_DEBUG + //! Only analyze transaction weaknesses in Debug mode. + //! Ideally we catch the faults in Debug mode and then correct them, + //! so there's no need to waste these CPU cycles in Release mode. + switch (transaction->GetSize()) + { + case 0: + TC_LOG_DEBUG("sql.driver", "Transaction contains 0 queries. Not executing."); + return; + case 1: + TC_LOG_DEBUG("sql.driver", "Warning: Transaction only holds 1 query, consider removing Transaction context in code."); + break; + default: + break; + } +#endif // TRINITY_DEBUG + + Enqueue(new TransactionTask(transaction)); +} + +template <class T> +void DatabaseWorkerPool<T>::DirectCommitTransaction(SQLTransaction& transaction) +{ + T* connection = GetFreeConnection(); + int errorCode = connection->ExecuteTransaction(transaction); + if (!errorCode) + { + connection->Unlock(); // OK, operation succesful + return; + } + + //! Handle MySQL Errno 1213 without extending deadlock to the core itself + /// @todo More elegant way + if (errorCode == ER_LOCK_DEADLOCK) + { + uint8 loopBreaker = 5; + for (uint8 i = 0; i < loopBreaker; ++i) + { + if (!connection->ExecuteTransaction(transaction)) + break; + } + } + + //! Clean up now. + transaction->Cleanup(); + + connection->Unlock(); +} + +template <class T> +void DatabaseWorkerPool<T>::EscapeString(std::string& str) +{ + if (str.empty()) + return; + + char* buf = new char[str.size() * 2 + 1]; + EscapeString(buf, str.c_str(), str.size()); + str = buf; + delete[] buf; +} + +template <class T> +void DatabaseWorkerPool<T>::KeepAlive() +{ + //! Ping synchronous connections + for (auto& connection : _connections[IDX_SYNCH]) + { + if (connection->LockIfReady()) + { + connection->Ping(); + connection->Unlock(); + } + } + + //! Assuming all worker threads are free, every worker thread will receive 1 ping operation request + //! If one or more worker threads are busy, the ping operations will not be split evenly, but this doesn't matter + //! as the sole purpose is to prevent connections from idling. + auto const count = _connections[IDX_ASYNC].size(); + for (uint8 i = 0; i < count; ++i) + Enqueue(new PingOperation); +} + +template <class T> +uint32 DatabaseWorkerPool<T>::OpenConnections(InternalIndex type, uint8 numConnections) +{ + for (uint8 i = 0; i < numConnections; ++i) + { + // Create the connection + auto connection = [&] { + switch (type) + { + case IDX_ASYNC: + return Trinity::make_unique<T>(_queue.get(), *_connectionInfo); + case IDX_SYNCH: + return Trinity::make_unique<T>(*_connectionInfo); + default: + ABORT(); + } + }(); + + if (uint32 error = connection->Open()) + { + // Failed to open a connection or invalid version, abort and cleanup + _connections[type].clear(); + return error; + } + else if (mysql_get_server_version(connection->GetHandle()) < MIN_MYSQL_SERVER_VERSION) + { + TC_LOG_ERROR("sql.driver", "TrinityCore does not support MySQL versions below 5.1"); + return 1; + } + else + { + _connections[type].push_back(std::move(connection)); + } + } + + // Everything is fine + return 0; +} + +template <class T> +T* DatabaseWorkerPool<T>::GetFreeConnection() +{ + uint8 i = 0; + auto const num_cons = _connections[IDX_SYNCH].size(); + T* connection = nullptr; + //! Block forever until a connection is free + for (;;) + { + connection = _connections[IDX_SYNCH][++i % num_cons].get(); + //! Must be matched with t->Unlock() or you will get deadlocks + if (connection->LockIfReady()) + break; + } + + return connection; +} + +template class DatabaseWorkerPool<LoginDatabaseConnection>; +template class DatabaseWorkerPool<WorldDatabaseConnection>; +template class DatabaseWorkerPool<CharacterDatabaseConnection>; diff --git a/src/server/database/Database/DatabaseWorkerPool.h b/src/server/database/Database/DatabaseWorkerPool.h index d5a254647eb..d883366237f 100644 --- a/src/server/database/Database/DatabaseWorkerPool.h +++ b/src/server/database/Database/DatabaseWorkerPool.h @@ -32,9 +32,7 @@ #include <mysqld_error.h> #include <memory> - -#define MIN_MYSQL_SERVER_VERSION 50100u -#define MIN_MYSQL_CLIENT_VERSION 50100u +#include <array> class PingOperation : public SQLOperation { @@ -59,97 +57,21 @@ class DatabaseWorkerPool public: /* Activity state */ - DatabaseWorkerPool() : _queue(new ProducerConsumerQueue<SQLOperation*>()), - _async_threads(0), _synch_threads(0) - { - memset(_connectionCount, 0, sizeof(_connectionCount)); - _connections.resize(IDX_SIZE); - - WPFatal(mysql_thread_safe(), "Used MySQL library isn't thread-safe."); - WPFatal(mysql_get_client_version() >= MIN_MYSQL_CLIENT_VERSION, "TrinityCore does not support MySQL versions below 5.1"); - WPFatal(mysql_get_client_version() == MYSQL_VERSION_ID, "Used MySQL library version (%s) does not match the version used to compile TrinityCore (%s).", - mysql_get_client_info(), MYSQL_SERVER_VERSION); - } + DatabaseWorkerPool(); ~DatabaseWorkerPool() { _queue->Cancel(); } - void SetConnectionInfo(std::string const& infoString, uint8 const asyncThreads, uint8 const synchThreads) - { - _connectionInfo.reset(new MySQLConnectionInfo(infoString)); - - _async_threads = asyncThreads; - _synch_threads = synchThreads; - } - - uint32 Open() - { - WPFatal(_connectionInfo.get(), "Connection info was not set!"); - - TC_LOG_INFO("sql.driver", "Opening DatabasePool '%s'. Asynchronous connections: %u, synchronous connections: %u.", - GetDatabaseName(), _async_threads, _synch_threads); - - uint32 error = OpenConnections(IDX_ASYNC, _async_threads); - - if (error) - return error; - - error = OpenConnections(IDX_SYNCH, _synch_threads); - - if (!error) - { - TC_LOG_INFO("sql.driver", "DatabasePool '%s' opened successfully. %u total connections running.", GetDatabaseName(), - (_connectionCount[IDX_SYNCH] + _connectionCount[IDX_ASYNC])); - } - - return error; - } - - void Close() - { - TC_LOG_INFO("sql.driver", "Closing down DatabasePool '%s'.", GetDatabaseName()); + void SetConnectionInfo(std::string const& infoString, uint8 const asyncThreads, uint8 const synchThreads); - for (uint8 i = 0; i < _connectionCount[IDX_ASYNC]; ++i) - { - T* t = _connections[IDX_ASYNC][i]; - t->Close(); //! Closes the actualy MySQL connection. - } + uint32 Open(); - TC_LOG_INFO("sql.driver", "Asynchronous connections on DatabasePool '%s' terminated. Proceeding with synchronous connections.", - GetDatabaseName()); - - //! Shut down the synchronous connections - //! There's no need for locking the connection, because DatabaseWorkerPool<>::Close - //! should only be called after any other thread tasks in the core have exited, - //! meaning there can be no concurrent access at this point. - for (uint8 i = 0; i < _connectionCount[IDX_SYNCH]; ++i) - _connections[IDX_SYNCH][i]->Close(); - - TC_LOG_INFO("sql.driver", "All connections on DatabasePool '%s' closed.", GetDatabaseName()); - } + void Close(); //! Prepares all prepared statements - bool PrepareStatements() - { - for (uint8 i = 0; i < IDX_SIZE; ++i) - for (uint32 c = 0; c < _connectionCount[i]; ++c) - { - T* t = _connections[i][c]; - t->LockIfReady(); - if (!t->PrepareStatements()) - { - t->Unlock(); - Close(); - return false; - } - else - t->Unlock(); - } - - return true; - } + bool PrepareStatements(); inline MySQLConnectionInfo const* GetConnectionInfo() const { @@ -201,9 +123,9 @@ class DatabaseWorkerPool if (!sql) return; - T* t = GetFreeConnection(); - t->Execute(sql); - t->Unlock(); + T* connection = GetFreeConnection(); + connection->Execute(sql); + connection->Unlock(); } //! Directly executes a one-way SQL operation in string format -with variable args-, that will block the calling thread until finished. @@ -221,9 +143,9 @@ class DatabaseWorkerPool //! Statement must be prepared with the CONNECTION_SYNCH flag. void DirectExecute(PreparedStatement* stmt) { - T* t = GetFreeConnection(); - t->Execute(stmt); - t->Unlock(); + T* connection = GetFreeConnection(); + connection->Execute(stmt); + connection->Unlock(); //! Delete proxy-class. Not needed anymore delete stmt; @@ -235,21 +157,7 @@ class DatabaseWorkerPool //! Directly executes an SQL query in string format that will block the calling thread until finished. //! Returns reference counted auto pointer, no need for manual memory management in upper level code. - QueryResult Query(const char* sql, T* conn = nullptr) - { - if (!conn) - conn = GetFreeConnection(); - - ResultSet* result = conn->Query(sql); - conn->Unlock(); - if (!result || !result->GetRowCount() || !result->NextRow()) - { - delete result; - return QueryResult(NULL); - } - - return QueryResult(result); - } + QueryResult Query(const char* sql, T* connection = nullptr); //! Directly executes an SQL query in string format -with variable args- that will block the calling thread until finished. //! Returns reference counted auto pointer, no need for manual memory management in upper level code. @@ -276,23 +184,7 @@ class DatabaseWorkerPool //! Directly executes an SQL query in prepared format that will block the calling thread until finished. //! Returns reference counted auto pointer, no need for manual memory management in upper level code. //! Statement must be prepared with CONNECTION_SYNCH flag. - PreparedQueryResult Query(PreparedStatement* stmt) - { - T* t = GetFreeConnection(); - PreparedResultSet* ret = t->Query(stmt); - t->Unlock(); - - //! Delete proxy-class. Not needed anymore - delete stmt; - - if (!ret || !ret->GetRowCount()) - { - delete ret; - return PreparedQueryResult(NULL); - } - - return PreparedQueryResult(ret); - } + PreparedQueryResult Query(PreparedStatement* stmt); /** Asynchronous query (with resultset) methods. @@ -300,14 +192,7 @@ class DatabaseWorkerPool //! Enqueues a query in string format that will set the value of the QueryResultFuture return object as soon as the query is executed. //! The return value is then processed in ProcessQueryCallback methods. - QueryResultFuture AsyncQuery(const char* sql) - { - BasicStatementTask* task = new BasicStatementTask(sql, true); - // Store future result before enqueueing - task might get already processed and deleted before returning from this method - QueryResultFuture result = task->GetFuture(); - Enqueue(task); - return result; - } + QueryResultFuture AsyncQuery(const char* sql); //! Enqueues a query in string format -with variable args- that will set the value of the QueryResultFuture return object as soon as the query is executed. //! The return value is then processed in ProcessQueryCallback methods. @@ -320,27 +205,13 @@ class DatabaseWorkerPool //! Enqueues a query in prepared format that will set the value of the PreparedQueryResultFuture return object as soon as the query is executed. //! The return value is then processed in ProcessQueryCallback methods. //! Statement must be prepared with CONNECTION_ASYNC flag. - PreparedQueryResultFuture AsyncQuery(PreparedStatement* stmt) - { - PreparedStatementTask* task = new PreparedStatementTask(stmt, true); - // Store future result before enqueueing - task might get already processed and deleted before returning from this method - PreparedQueryResultFuture result = task->GetFuture(); - Enqueue(task); - return result; - } + PreparedQueryResultFuture AsyncQuery(PreparedStatement* stmt); //! Enqueues a vector of SQL operations (can be both adhoc and prepared) that will set the value of the QueryResultHolderFuture //! return object as soon as the query is executed. //! The return value is then processed in ProcessQueryCallback methods. //! Any prepared statements added to this holder need to be prepared with the CONNECTION_ASYNC flag. - QueryResultHolderFuture DelayQueryHolder(SQLQueryHolder* holder) - { - SQLQueryHolderTask* task = new SQLQueryHolderTask(holder); - // Store future result before enqueueing - task might get already processed and deleted before returning from this method - QueryResultHolderFuture result = task->GetFuture(); - Enqueue(task); - return result; - } + QueryResultHolderFuture DelayQueryHolder(SQLQueryHolder* holder); /** Transaction context methods. @@ -354,57 +225,11 @@ class DatabaseWorkerPool //! Enqueues a collection of one-way SQL operations (can be both adhoc and prepared). The order in which these operations //! were appended to the transaction will be respected during execution. - void CommitTransaction(SQLTransaction transaction) - { - #ifdef TRINITY_DEBUG - //! Only analyze transaction weaknesses in Debug mode. - //! Ideally we catch the faults in Debug mode and then correct them, - //! so there's no need to waste these CPU cycles in Release mode. - switch (transaction->GetSize()) - { - case 0: - TC_LOG_DEBUG("sql.driver", "Transaction contains 0 queries. Not executing."); - return; - case 1: - TC_LOG_DEBUG("sql.driver", "Warning: Transaction only holds 1 query, consider removing Transaction context in code."); - break; - default: - break; - } - #endif // TRINITY_DEBUG - - Enqueue(new TransactionTask(transaction)); - } + void CommitTransaction(SQLTransaction transaction); //! Directly executes a collection of one-way SQL operations (can be both adhoc and prepared). The order in which these operations //! were appended to the transaction will be respected during execution. - void DirectCommitTransaction(SQLTransaction& transaction) - { - T* con = GetFreeConnection(); - int errorCode = con->ExecuteTransaction(transaction); - if (!errorCode) - { - con->Unlock(); // OK, operation succesful - return; - } - - //! Handle MySQL Errno 1213 without extending deadlock to the core itself - /// @todo More elegant way - if (errorCode == ER_LOCK_DEADLOCK) - { - uint8 loopBreaker = 5; - for (uint8 i = 0; i < loopBreaker; ++i) - { - if (!con->ExecuteTransaction(transaction)) - break; - } - } - - //! Clean up now. - transaction->Cleanup(); - - con->Unlock(); - } + void DirectCommitTransaction(SQLTransaction& transaction); //! Method used to execute prepared statements in a diverse context. //! Will be wrapped in a transaction if valid object is present, otherwise executed standalone. @@ -441,90 +266,21 @@ class DatabaseWorkerPool } //! Apply escape string'ing for current collation. (utf8) - void EscapeString(std::string& str) - { - if (str.empty()) - return; - - char* buf = new char[str.size() * 2 + 1]; - EscapeString(buf, str.c_str(), str.size()); - str = buf; - delete[] buf; - } + void EscapeString(std::string& str); //! Keeps all our MySQL connections alive, prevent the server from disconnecting us. - void KeepAlive() - { - //! Ping synchronous connections - for (uint8 i = 0; i < _connectionCount[IDX_SYNCH]; ++i) - { - T* t = _connections[IDX_SYNCH][i]; - if (t->LockIfReady()) - { - t->Ping(); - t->Unlock(); - } - } - - //! Assuming all worker threads are free, every worker thread will receive 1 ping operation request - //! If one or more worker threads are busy, the ping operations will not be split evenly, but this doesn't matter - //! as the sole purpose is to prevent connections from idling. - for (size_t i = 0; i < _connections[IDX_ASYNC].size(); ++i) - Enqueue(new PingOperation); - } + void KeepAlive(); private: - uint32 OpenConnections(InternalIndex type, uint8 numConnections) - { - _connections[type].resize(numConnections); - for (uint8 i = 0; i < numConnections; ++i) - { - T* t; - - if (type == IDX_ASYNC) - t = new T(_queue.get(), *_connectionInfo); - else if (type == IDX_SYNCH) - t = new T(*_connectionInfo); - else - ABORT(); - - _connections[type][i] = t; - ++_connectionCount[type]; - - uint32 error = t->Open(); - - if (!error) - { - if (mysql_get_server_version(t->GetHandle()) < MIN_MYSQL_SERVER_VERSION) - { - TC_LOG_ERROR("sql.driver", "TrinityCore does not support MySQL versions below 5.1"); - error = 1; - } - } - - // Failed to open a connection or invalid version, abort and cleanup - if (error) - { - while (_connectionCount[type] != 0) - { - t = _connections[type][i--]; - delete t; - --_connectionCount[type]; - } - return error; - } - } - - // Everything is fine - return 0; - } + uint32 OpenConnections(InternalIndex type, uint8 numConnections); unsigned long EscapeString(char *to, const char *from, unsigned long length) { if (!to || !from || !length) return 0; - return mysql_real_escape_string(_connections[IDX_SYNCH][0]->GetHandle(), to, from, length); + return mysql_real_escape_string( + _connections[IDX_SYNCH].front()->GetHandle(), to, from, length); } void Enqueue(SQLOperation* op) @@ -534,22 +290,7 @@ class DatabaseWorkerPool //! Gets a free connection in the synchronous connection pool. //! Caller MUST call t->Unlock() after touching the MySQL context to prevent deadlocks. - T* GetFreeConnection() - { - uint8 i = 0; - size_t num_cons = _connectionCount[IDX_SYNCH]; - T* t = NULL; - //! Block forever until a connection is free - for (;;) - { - t = _connections[IDX_SYNCH][++i % num_cons]; - //! Must be matched with t->Unlock() or you will get deadlocks - if (t->LockIfReady()) - break; - } - - return t; - } + T* GetFreeConnection(); char const* GetDatabaseName() const { @@ -558,9 +299,7 @@ class DatabaseWorkerPool //! Queue shared by async worker threads. std::unique_ptr<ProducerConsumerQueue<SQLOperation*>> _queue; - std::vector<std::vector<T*>> _connections; - //! Counter of MySQL connections; - uint32 _connectionCount[IDX_SIZE]; + std::array<std::vector<std::unique_ptr<T>>, IDX_SIZE> _connections; std::unique_ptr<MySQLConnectionInfo> _connectionInfo; uint8 _async_threads, _synch_threads; }; diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index 140f3bf31c9..ab68aca2a8c 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -72,7 +72,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() "FROM characters WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_GROUP_MEMBER, "SELECT guid FROM group_member WHERE memberGuid = ?", CONNECTION_BOTH); - PrepareStatement(CHAR_SEL_CHARACTER_INSTANCE, "SELECT id, permanent, map, difficulty, resettime FROM character_instance LEFT JOIN instance ON instance = id WHERE guid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_CHARACTER_INSTANCE, "SELECT id, permanent, map, difficulty, extendState, resettime FROM character_instance LEFT JOIN instance ON instance = id WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_AURAS, "SELECT casterGuid, spell, effectMask, recalculateMask, stackCount, amount0, amount1, amount2, " "base_amount0, base_amount1, base_amount2, maxDuration, remainTime, remainCharges FROM character_aura WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_SPELL, "SELECT spell, active, disabled FROM character_spell WHERE guid = ?", CONNECTION_ASYNC); @@ -405,8 +405,8 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_UPD_WORLDSTATE, "UPDATE worldstates SET value = ? WHERE entry = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_WORLDSTATE, "INSERT INTO worldstates (entry, value) VALUES (?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_INSTANCE_BY_INSTANCE_GUID, "DELETE FROM character_instance WHERE guid = ? AND instance = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_UPD_CHAR_INSTANCE, "UPDATE character_instance SET instance = ?, permanent = ? WHERE guid = ? AND instance = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_INS_CHAR_INSTANCE, "INSERT INTO character_instance (guid, instance, permanent) VALUES (?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_UPD_CHAR_INSTANCE, "UPDATE character_instance SET instance = ?, permanent = ?, extendState = ? WHERE guid = ? AND instance = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_INS_CHAR_INSTANCE, "INSERT INTO character_instance (guid, instance, permanent, extendState) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_GENDER_PLAYERBYTES, "UPDATE characters SET gender = ?, playerBytes = ?, playerBytes2 = ? WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHARACTER_SKILL, "DELETE FROM character_skills WHERE guid = ? AND skill = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_ADD_CHARACTER_SOCIAL_FLAGS, "UPDATE character_social SET flags = flags | ? WHERE guid = ? AND friend = ?", CONNECTION_ASYNC); @@ -434,6 +434,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_SEL_CHAR_CLASS_LVL_AT_LOGIN, "SELECT class, level, at_login, knownTitles FROM characters WHERE guid = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_CHAR_AT_LOGIN_TITLES, "SELECT at_login, knownTitles FROM characters WHERE guid = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_INSTANCE, "SELECT data, completedEncounters FROM instance WHERE map = ? AND id = ?", CONNECTION_SYNCH); + PrepareStatement(CHAR_SEL_PERM_BIND_BY_INSTANCE, "SELECT guid FROM character_instance WHERE instance = ? and permanent = 1", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_CHAR_COD_ITEM_MAIL, "SELECT id, messageType, mailTemplateId, sender, subject, body, money, has_items FROM mail WHERE receiver = ? AND has_items <> 0 AND cod <> 0", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_CHAR_SOCIAL, "SELECT DISTINCT guid FROM character_social WHERE friend = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_CHAR_OLD_CHARS, "SELECT guid, deleteInfos_Account FROM characters WHERE deleteDate IS NOT NULL AND deleteDate < ?", CONNECTION_SYNCH); @@ -470,9 +471,10 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_INS_CHAR_GIFT, "INSERT INTO character_gifts (guid, item_guid, entry, flags) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_INSTANCE_BY_INSTANCE, "DELETE FROM instance WHERE id = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_INSTANCE_BY_INSTANCE, "DELETE FROM character_instance WHERE instance = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_DEL_CHAR_INSTANCE_BY_MAP_DIFF, "DELETE FROM character_instance USING character_instance LEFT JOIN instance ON character_instance.instance = id WHERE map = ? and difficulty = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_DEL_EXPIRED_CHAR_INSTANCE_BY_MAP_DIFF, "DELETE FROM character_instance USING character_instance LEFT JOIN instance ON character_instance.instance = id WHERE (extendState = 0 or permanent = 0) and map = ? and difficulty = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_GROUP_INSTANCE_BY_MAP_DIFF, "DELETE FROM group_instance USING group_instance LEFT JOIN instance ON group_instance.instance = id WHERE map = ? and difficulty = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_DEL_INSTANCE_BY_MAP_DIFF, "DELETE FROM instance WHERE map = ? and difficulty = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_DEL_EXPIRED_INSTANCE_BY_MAP_DIFF, "DELETE FROM instance WHERE map = ? and difficulty = ? and (SELECT guid FROM character_instance WHERE extendState != 0 AND instance = id LIMIT 1) IS NULL", CONNECTION_ASYNC); + PrepareStatement(CHAR_UPD_EXPIRE_CHAR_INSTANCE_BY_MAP_DIFF, "UPDATE character_instance LEFT JOIN instance ON character_instance.instance = id SET extendState = extendState-1 WHERE map = ? and difficulty = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_MAIL_ITEM_BY_ID, "DELETE FROM mail_items WHERE mail_id = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_PETITION, "INSERT INTO petition (ownerguid, petitionguid, name, type) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_PETITION_BY_GUID, "DELETE FROM petition WHERE petitionguid = ?", CONNECTION_ASYNC); diff --git a/src/server/database/Database/Implementation/CharacterDatabase.h b/src/server/database/Database/Implementation/CharacterDatabase.h index c0ff9cbbfbe..19d4a609e77 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.h +++ b/src/server/database/Database/Implementation/CharacterDatabase.h @@ -365,6 +365,7 @@ enum CharacterDatabaseStatements CHAR_SEL_CHAR_CLASS_LVL_AT_LOGIN, CHAR_SEL_CHAR_AT_LOGIN_TITLES, CHAR_SEL_INSTANCE, + CHAR_SEL_PERM_BIND_BY_INSTANCE, CHAR_SEL_CHAR_COD_ITEM_MAIL, CHAR_SEL_CHAR_SOCIAL, CHAR_SEL_CHAR_OLD_CHARS, @@ -396,9 +397,10 @@ enum CharacterDatabaseStatements CHAR_INS_CHAR_GIFT, CHAR_DEL_INSTANCE_BY_INSTANCE, CHAR_DEL_CHAR_INSTANCE_BY_INSTANCE, - CHAR_DEL_CHAR_INSTANCE_BY_MAP_DIFF, + CHAR_DEL_EXPIRED_CHAR_INSTANCE_BY_MAP_DIFF, CHAR_DEL_GROUP_INSTANCE_BY_MAP_DIFF, - CHAR_DEL_INSTANCE_BY_MAP_DIFF, + CHAR_DEL_EXPIRED_INSTANCE_BY_MAP_DIFF, + CHAR_UPD_EXPIRE_CHAR_INSTANCE_BY_MAP_DIFF, CHAR_DEL_MAIL_ITEM_BY_ID, CHAR_INS_PETITION, CHAR_DEL_PETITION_BY_GUID, diff --git a/src/server/database/Database/Implementation/LoginDatabase.cpp b/src/server/database/Database/Implementation/LoginDatabase.cpp index 66847f0a6a0..2749c08594f 100644 --- a/src/server/database/Database/Implementation/LoginDatabase.cpp +++ b/src/server/database/Database/Implementation/LoginDatabase.cpp @@ -24,33 +24,34 @@ void LoginDatabaseConnection::DoPrepareStatements() PrepareStatement(LOGIN_SEL_REALMLIST, "SELECT id, name, address, localAddress, localSubnetMask, port, icon, flag, timezone, allowedSecurityLevel, population, gamebuild FROM realmlist WHERE flag <> 3 ORDER BY name", CONNECTION_SYNCH); PrepareStatement(LOGIN_DEL_EXPIRED_IP_BANS, "DELETE FROM ip_banned WHERE unbandate<>bandate AND unbandate<=UNIX_TIMESTAMP()", CONNECTION_ASYNC); - PrepareStatement(LOGIN_UPD_EXPIRED_ACCOUNT_BANS, "UPDATE account_banned SET active = 0 WHERE active = 1 AND unbandate<>bandate AND unbandate<=UNIX_TIMESTAMP()", CONNECTION_SYNCH); + PrepareStatement(LOGIN_UPD_EXPIRED_ACCOUNT_BANS, "UPDATE account_banned SET active = 0 WHERE active = 1 AND unbandate<>bandate AND unbandate<=UNIX_TIMESTAMP()", CONNECTION_ASYNC); PrepareStatement(LOGIN_SEL_IP_INFO, "(SELECT unbandate > UNIX_TIMESTAMP() OR unbandate = bandate AS banned, NULL as country FROM ip_banned WHERE ip = ?) " "UNION " "(SELECT NULL AS banned, country FROM ip2nation WHERE INET_NTOA(ip) = ?)", CONNECTION_ASYNC); - PrepareStatement(LOGIN_SEL_IP_BANNED, "SELECT * FROM ip_banned WHERE ip = ?", CONNECTION_SYNCH); PrepareStatement(LOGIN_INS_IP_AUTO_BANNED, "INSERT INTO ip_banned (ip, bandate, unbandate, bannedby, banreason) VALUES (?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+?, 'Trinity Auth', 'Failed login autoban')", CONNECTION_ASYNC); PrepareStatement(LOGIN_SEL_IP_BANNED_ALL, "SELECT ip, bandate, unbandate, bannedby, banreason FROM ip_banned WHERE (bandate = unbandate OR unbandate > UNIX_TIMESTAMP()) ORDER BY unbandate", CONNECTION_SYNCH); PrepareStatement(LOGIN_SEL_IP_BANNED_BY_IP, "SELECT ip, bandate, unbandate, bannedby, banreason FROM ip_banned WHERE (bandate = unbandate OR unbandate > UNIX_TIMESTAMP()) AND ip LIKE CONCAT('%%', ?, '%%') ORDER BY unbandate", CONNECTION_SYNCH); - PrepareStatement(LOGIN_SEL_ACCOUNT_BANNED, "SELECT bandate, unbandate FROM account_banned WHERE id = ? AND active = 1", CONNECTION_SYNCH); PrepareStatement(LOGIN_SEL_ACCOUNT_BANNED_ALL, "SELECT account.id, username FROM account, account_banned WHERE account.id = account_banned.id AND active = 1 GROUP BY account.id", CONNECTION_SYNCH); PrepareStatement(LOGIN_SEL_ACCOUNT_BANNED_BY_USERNAME, "SELECT account.id, username FROM account, account_banned WHERE account.id = account_banned.id AND active = 1 AND username LIKE CONCAT('%%', ?, '%%') GROUP BY account.id", CONNECTION_SYNCH); PrepareStatement(LOGIN_INS_ACCOUNT_AUTO_BANNED, "INSERT INTO account_banned VALUES (?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+?, 'Trinity Auth', 'Failed login autoban', 1)", CONNECTION_ASYNC); PrepareStatement(LOGIN_DEL_ACCOUNT_BANNED, "DELETE FROM account_banned WHERE id = ?", CONNECTION_ASYNC); - PrepareStatement(LOGIN_SEL_SESSIONKEY, "SELECT a.sessionkey, a.id, aa.gmlevel FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE username = ?", CONNECTION_SYNCH); PrepareStatement(LOGIN_UPD_VS, "UPDATE account SET v = ?, s = ? WHERE username = ?", CONNECTION_ASYNC); PrepareStatement(LOGIN_UPD_LOGONPROOF, "UPDATE account SET sessionkey = ?, last_ip = ?, last_login = NOW(), locale = ?, failed_logins = 0, os = ? WHERE username = ?", CONNECTION_SYNCH); - PrepareStatement(LOGIN_SEL_LOGONCHALLENGE, "SELECT a.sha_pass_hash, a.id, a.locked, a.lock_country, a.last_ip, aa.gmlevel, a.v, a.s, a.token_key FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE a.username = ?", CONNECTION_SYNCH); + PrepareStatement(LOGIN_SEL_LOGONCHALLENGE, "SELECT a.id, UPPER(a.username), a.locked, a.lock_country, a.last_ip, a.failed_logins, ab.unbandate > UNIX_TIMESTAMP() OR ab.unbandate = ab.bandate, " + "ab.unbandate = ab.bandate, aa.gmlevel, a.token_key, a.sha_pass_hash, a.v, a.s " + "FROM account a LEFT JOIN account_access aa ON a.id = aa.id LEFT JOIN account_banned ab ON ab.id = a.id AND ab.active = 1 WHERE a.username = ?", CONNECTION_ASYNC); + PrepareStatement(LOGIN_SEL_RECONNECTCHALLENGE, "SELECT a.id, UPPER(a.username), a.locked, a.lock_country, a.last_ip, a.failed_logins, ab.unbandate > UNIX_TIMESTAMP() OR ab.unbandate = ab.bandate, " + "ab.unbandate = ab.bandate, aa.gmlevel, a.sessionKey " + "FROM account a LEFT JOIN account_access aa ON a.id = aa.id LEFT JOIN account_banned ab ON ab.id = a.id AND ab.active = 1 WHERE a.username = ?", CONNECTION_ASYNC); PrepareStatement(LOGIN_SEL_LOGON_COUNTRY, "SELECT country FROM ip2nation WHERE ip < ? ORDER BY ip DESC LIMIT 0,1", CONNECTION_SYNCH); PrepareStatement(LOGIN_UPD_FAILEDLOGINS, "UPDATE account SET failed_logins = failed_logins + 1 WHERE username = ?", CONNECTION_ASYNC); - PrepareStatement(LOGIN_SEL_FAILEDLOGINS, "SELECT id, failed_logins FROM account WHERE username = ?", CONNECTION_SYNCH); PrepareStatement(LOGIN_SEL_ACCOUNT_ID_BY_NAME, "SELECT id FROM account WHERE username = ?", CONNECTION_SYNCH); PrepareStatement(LOGIN_SEL_ACCOUNT_LIST_BY_NAME, "SELECT id, username FROM account WHERE username = ?", CONNECTION_SYNCH); PrepareStatement(LOGIN_SEL_ACCOUNT_INFO_BY_NAME, "SELECT a.id, a.sessionkey, a.last_ip, a.locked, a.lock_country, a.expansion, a.mutetime, a.locale, a.recruiter, a.os, aa.gmLevel, " "ab.unbandate > UNIX_TIMESTAMP() OR ab.unbandate = ab.bandate, r.id FROM account a LEFT JOIN account_access aa ON a.id = aa.id AND aa.RealmID IN (-1, ?) " "LEFT JOIN account_banned ab ON a.id = ab.id AND ab.active = 1 LEFT JOIN account r ON a.id = r.recruiter WHERE a.username = ? ORDER BY aa.RealmID DESC LIMIT 1", CONNECTION_ASYNC); PrepareStatement(LOGIN_SEL_ACCOUNT_LIST_BY_EMAIL, "SELECT id, username FROM account WHERE email = ?", CONNECTION_SYNCH); - PrepareStatement(LOGIN_SEL_NUM_CHARS_ON_REALM, "SELECT numchars FROM realmcharacters WHERE realmid = ? AND acctid= ?", CONNECTION_SYNCH); + PrepareStatement(LOGIN_SEL_REALM_CHARACTER_COUNTS, "SELECT realmid, numchars FROM realmcharacters WHERE acctid = ?", CONNECTION_ASYNC); PrepareStatement(LOGIN_SEL_ACCOUNT_BY_IP, "SELECT id, username FROM account WHERE last_ip = ?", CONNECTION_SYNCH); PrepareStatement(LOGIN_SEL_ACCOUNT_BY_ID, "SELECT 1 FROM account WHERE id = ?", CONNECTION_SYNCH); PrepareStatement(LOGIN_INS_IP_BANNED, "INSERT INTO ip_banned (ip, bandate, unbandate, bannedby, banreason) VALUES (?, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()+?, ?, ?)", CONNECTION_ASYNC); diff --git a/src/server/database/Database/Implementation/LoginDatabase.h b/src/server/database/Database/Implementation/LoginDatabase.h index 69c2e758551..a3789fa2557 100644 --- a/src/server/database/Database/Implementation/LoginDatabase.h +++ b/src/server/database/Database/Implementation/LoginDatabase.h @@ -33,25 +33,22 @@ enum LoginDatabaseStatements LOGIN_DEL_EXPIRED_IP_BANS, LOGIN_UPD_EXPIRED_ACCOUNT_BANS, LOGIN_SEL_IP_INFO, - LOGIN_SEL_IP_BANNED, LOGIN_INS_IP_AUTO_BANNED, - LOGIN_SEL_ACCOUNT_BANNED, LOGIN_SEL_ACCOUNT_BANNED_ALL, LOGIN_SEL_ACCOUNT_BANNED_BY_USERNAME, LOGIN_INS_ACCOUNT_AUTO_BANNED, LOGIN_DEL_ACCOUNT_BANNED, - LOGIN_SEL_SESSIONKEY, LOGIN_UPD_VS, LOGIN_UPD_LOGONPROOF, LOGIN_SEL_LOGONCHALLENGE, + LOGIN_SEL_RECONNECTCHALLENGE, LOGIN_SEL_LOGON_COUNTRY, LOGIN_UPD_FAILEDLOGINS, - LOGIN_SEL_FAILEDLOGINS, LOGIN_SEL_ACCOUNT_ID_BY_NAME, LOGIN_SEL_ACCOUNT_LIST_BY_NAME, LOGIN_SEL_ACCOUNT_INFO_BY_NAME, LOGIN_SEL_ACCOUNT_LIST_BY_EMAIL, - LOGIN_SEL_NUM_CHARS_ON_REALM, + LOGIN_SEL_REALM_CHARACTER_COUNTS, LOGIN_SEL_ACCOUNT_BY_IP, LOGIN_INS_IP_BANNED, LOGIN_DEL_IP_NOT_BANNED, diff --git a/src/server/database/Database/MySQLConnection.cpp b/src/server/database/Database/MySQLConnection.cpp index 41dd61d3c3a..93d2a35f310 100644 --- a/src/server/database/Database/MySQLConnection.cpp +++ b/src/server/database/Database/MySQLConnection.cpp @@ -37,7 +37,6 @@ MySQLConnection::MySQLConnection(MySQLConnectionInfo& connInfo) : m_reconnecting(false), m_prepareError(false), m_queue(NULL), -m_worker(NULL), m_Mysql(NULL), m_connectionInfo(connInfo), m_connectionFlags(CONNECTION_SYNCH) { } @@ -50,24 +49,26 @@ m_Mysql(NULL), m_connectionInfo(connInfo), m_connectionFlags(CONNECTION_ASYNC) { - m_worker = new DatabaseWorker(m_queue, this); + m_worker = Trinity::make_unique<DatabaseWorker>(m_queue, this); } MySQLConnection::~MySQLConnection() { - delete m_worker; - - for (size_t i = 0; i < m_stmts.size(); ++i) - delete m_stmts[i]; - - if (m_Mysql) - mysql_close(m_Mysql); + Close(); } void MySQLConnection::Close() { - /// Only close us if we're not operating - delete this; + // Stop the worker thread before the statements are cleared + m_worker.reset(); + + m_stmts.clear(); + + if (m_Mysql) + { + mysql_close(m_Mysql); + m_Mysql = nullptr; + } } uint32 MySQLConnection::Open() @@ -412,7 +413,7 @@ int MySQLConnection::ExecuteTransaction(SQLTransaction& transaction) MySQLPreparedStatement* MySQLConnection::GetPreparedStatement(uint32 index) { ASSERT(index < m_stmts.size()); - MySQLPreparedStatement* ret = m_stmts[index]; + MySQLPreparedStatement* ret = m_stmts[index].get(); if (!ret) TC_LOG_ERROR("sql.sql", "Could not fetch prepared statement %u on database `%s`, connection type: %s.", index, m_connectionInfo.database.c_str(), (m_connectionFlags & CONNECTION_ASYNC) ? "asynchronous" : "synchronous"); @@ -424,16 +425,12 @@ void MySQLConnection::PrepareStatement(uint32 index, const char* sql, Connection { m_queries.insert(PreparedStatementMap::value_type(index, std::make_pair(sql, flags))); - // For reconnection case - if (m_reconnecting) - delete m_stmts[index]; - // Check if specified query should be prepared on this connection // i.e. don't prepare async statements on synchronous connections // to save memory that will not be used. if (!(m_connectionFlags & flags)) { - m_stmts[index] = NULL; + m_stmts[index].reset(); return; } @@ -455,8 +452,7 @@ void MySQLConnection::PrepareStatement(uint32 index, const char* sql, Connection } else { - MySQLPreparedStatement* mStmt = new MySQLPreparedStatement(stmt); - m_stmts[index] = mStmt; + m_stmts[index] = Trinity::make_unique<MySQLPreparedStatement>(stmt); } } } @@ -477,7 +473,7 @@ PreparedResultSet* MySQLConnection::Query(PreparedStatement* stmt) return new PreparedResultSet(stmt->m_stmt->GetSTMT(), result, rowCount, fieldCount); } -bool MySQLConnection::_HandleMySQLErrno(uint32 errNo) +bool MySQLConnection::_HandleMySQLErrno(uint32 errNo, uint8 attempts /*= 5*/) { switch (errNo) { @@ -486,9 +482,21 @@ bool MySQLConnection::_HandleMySQLErrno(uint32 errNo) case CR_INVALID_CONN_HANDLE: case CR_SERVER_LOST_EXTENDED: { + if (m_Mysql) + { + TC_LOG_ERROR("sql.sql", "Lost the connection to the MySQL server!"); + + mysql_close(GetHandle()); + m_Mysql = nullptr; + } + + /*no break*/ + } + case CR_CONN_HOST_ERROR: + { + TC_LOG_INFO("sql.sql", "Attempting to reconnect to the MySQL server..."); + m_reconnecting = true; - uint64 oldThreadId = mysql_thread_id(GetHandle()); - mysql_close(GetHandle()); uint32 const lErrno = Open(); if (!lErrno) @@ -496,24 +504,37 @@ bool MySQLConnection::_HandleMySQLErrno(uint32 errNo) // Don't remove 'this' pointer unless you want to skip loading all prepared statements... if (!this->PrepareStatements()) { - TC_LOG_ERROR("sql.sql", "Could not re-prepare statements!"); - Close(); - return false; + TC_LOG_FATAL("sql.sql", "Could not re-prepare statements!"); + std::this_thread::sleep_for(std::chrono::seconds(10)); + std::abort(); } - TC_LOG_INFO("sql.sql", "Connection to the MySQL server is active."); - if (oldThreadId != mysql_thread_id(GetHandle())) - TC_LOG_INFO("sql.sql", "Successfully reconnected to %s @%s:%s (%s).", - m_connectionInfo.database.c_str(), m_connectionInfo.host.c_str(), m_connectionInfo.port_or_socket.c_str(), - (m_connectionFlags & CONNECTION_ASYNC) ? "asynchronous" : "synchronous"); + TC_LOG_INFO("sql.sql", "Successfully reconnected to %s @%s:%s (%s).", + m_connectionInfo.database.c_str(), m_connectionInfo.host.c_str(), m_connectionInfo.port_or_socket.c_str(), + (m_connectionFlags & CONNECTION_ASYNC) ? "asynchronous" : "synchronous"); m_reconnecting = false; return true; } - // It's possible this attempted reconnect throws 2006 at us. To prevent crazy recursive calls, sleep here. - std::this_thread::sleep_for(std::chrono::seconds(3)); // Sleep 3 seconds - return _HandleMySQLErrno(lErrno); // Call self (recursive) + if ((--attempts) == 0) + { + // Shut down the server when the mysql server isn't + // reachable for some time + TC_LOG_FATAL("sql.sql", "Failed to reconnect to the MySQL server, " + "terminating the server to prevent data corruption!"); + + // We could also initiate a shutdown through using std::raise(SIGTERM) + std::this_thread::sleep_for(std::chrono::seconds(10)); + std::abort(); + } + else + { + // It's possible this attempted reconnect throws 2006 at us. + // To prevent crazy recursive calls, sleep here. + std::this_thread::sleep_for(std::chrono::seconds(3)); // Sleep 3 seconds + return _HandleMySQLErrno(lErrno, attempts); // Call self (recursive) + } } case ER_LOCK_DEADLOCK: diff --git a/src/server/database/Database/MySQLConnection.h b/src/server/database/Database/MySQLConnection.h index a981caa607e..a0b908593df 100644 --- a/src/server/database/Database/MySQLConnection.h +++ b/src/server/database/Database/MySQLConnection.h @@ -116,18 +116,18 @@ class MySQLConnection virtual void DoPrepareStatements() = 0; protected: - std::vector<MySQLPreparedStatement*> m_stmts; //! PreparedStatements storage + std::vector<std::unique_ptr<MySQLPreparedStatement>> m_stmts; //! PreparedStatements storage PreparedStatementMap m_queries; //! Query storage bool m_reconnecting; //! Are we reconnecting? bool m_prepareError; //! Was there any error while preparing statements? private: - bool _HandleMySQLErrno(uint32 errNo); + bool _HandleMySQLErrno(uint32 errNo, uint8 attempts = 5); private: ProducerConsumerQueue<SQLOperation*>* m_queue; //! Queue shared with other asynchronous connections. - DatabaseWorker* m_worker; //! Core worker task. - MYSQL * m_Mysql; //! MySQL Handle. + std::unique_ptr<DatabaseWorker> m_worker; //! Core worker task. + MYSQL* m_Mysql; //! MySQL Handle. MySQLConnectionInfo& m_connectionInfo; //! Connection info (used for logging) ConnectionFlags m_connectionFlags; //! Connection flags (for preparing relevant statements) std::mutex m_Mutex; diff --git a/src/server/database/Updater/DBUpdater.cpp b/src/server/database/Updater/DBUpdater.cpp index 170954a86f4..b18d6c67612 100644 --- a/src/server/database/Updater/DBUpdater.cpp +++ b/src/server/database/Updater/DBUpdater.cpp @@ -21,6 +21,7 @@ #include "UpdateFetcher.h" #include "DatabaseLoader.h" #include "Config.h" +#include "BuiltInConfig.h" #include <fstream> #include <iostream> @@ -35,23 +36,17 @@ using namespace boost::process; using namespace boost::process::initializers; using namespace boost::iostreams; -std::string DBUpdaterUtil::GetMySqlCli() +std::string DBUpdaterUtil::GetCorrectedMySQLExecutable() { if (!corrected_path().empty()) return corrected_path(); else - { - std::string const entry = sConfigMgr->GetStringDefault("Updates.MySqlCLIPath", ""); - if (!entry.empty()) - return entry; - else - return GitRevision::GetMySQLExecutable(); - } + return BuiltInConfig::GetMySQLExecutable(); } bool DBUpdaterUtil::CheckExecutable() { - boost::filesystem::path exe(GetMySqlCli()); + boost::filesystem::path exe(GetCorrectedMySQLExecutable()); if (!exists(exe)) { exe.clear(); @@ -85,16 +80,6 @@ std::string& DBUpdaterUtil::corrected_path() return path; } -template<class T> -std::string DBUpdater<T>::GetSourceDirectory() -{ - std::string const entry = sConfigMgr->GetStringDefault("Updates.SourcePath", ""); - if (!entry.empty()) - return entry; - else - return GitRevision::GetSourceDirectory(); -} - // Auth Database template<> std::string DBUpdater<LoginDatabaseConnection>::GetConfigEntry() @@ -111,7 +96,8 @@ std::string DBUpdater<LoginDatabaseConnection>::GetTableName() template<> std::string DBUpdater<LoginDatabaseConnection>::GetBaseFile() { - return DBUpdater<LoginDatabaseConnection>::GetSourceDirectory() + "/sql/base/auth_database.sql"; + return BuiltInConfig::GetSourceDirectory() + + "/sql/base/auth_database.sql"; } template<> @@ -169,7 +155,8 @@ std::string DBUpdater<CharacterDatabaseConnection>::GetTableName() template<> std::string DBUpdater<CharacterDatabaseConnection>::GetBaseFile() { - return DBUpdater<CharacterDatabaseConnection>::GetSourceDirectory() + "/sql/base/characters_database.sql"; + return BuiltInConfig::GetSourceDirectory() + + "/sql/base/characters_database.sql"; } template<> @@ -239,7 +226,7 @@ bool DBUpdater<T>::Update(DatabaseWorkerPool<T>& pool) TC_LOG_INFO("sql.updates", "Updating %s database...", DBUpdater<T>::GetTableName().c_str()); - Path const sourceDirectory(GetSourceDirectory()); + Path const sourceDirectory(BuiltInConfig::GetSourceDirectory()); if (!is_directory(sourceDirectory)) { @@ -410,7 +397,7 @@ void DBUpdater<T>::ApplyFile(DatabaseWorkerPool<T>& pool, std::string const& hos boost::process::pipe errPipe = create_pipe(); child c = execute(run_exe( - boost::filesystem::absolute(DBUpdaterUtil::GetMySqlCli()).generic_string()), + boost::filesystem::absolute(DBUpdaterUtil::GetCorrectedMySQLExecutable()).generic_string()), set_args(args), bind_stdin(source), throw_on_error(), bind_stdout(file_descriptor_sink(outPipe.sink, close_handle)), bind_stderr(file_descriptor_sink(errPipe.sink, close_handle))); diff --git a/src/server/database/Updater/DBUpdater.h b/src/server/database/Updater/DBUpdater.h index c9792ffe060..dbb897d2527 100644 --- a/src/server/database/Updater/DBUpdater.h +++ b/src/server/database/Updater/DBUpdater.h @@ -57,7 +57,7 @@ struct UpdateResult class DBUpdaterUtil { public: - static std::string GetMySqlCli(); + static std::string GetCorrectedMySQLExecutable(); static bool CheckExecutable(); @@ -71,8 +71,6 @@ class DBUpdater public: using Path = boost::filesystem::path; - static std::string GetSourceDirectory(); - static inline std::string GetConfigEntry(); static inline std::string GetTableName(); diff --git a/src/server/database/Updater/UpdateFetcher.cpp b/src/server/database/Updater/UpdateFetcher.cpp index fd0dbdd4b5a..2d60cdb92ef 100644 --- a/src/server/database/Updater/UpdateFetcher.cpp +++ b/src/server/database/Updater/UpdateFetcher.cpp @@ -137,24 +137,33 @@ UpdateFetcher::AppliedFileStorage UpdateFetcher::ReceiveAppliedFiles() const return map; } -UpdateFetcher::SQLUpdate UpdateFetcher::ReadSQLUpdate(boost::filesystem::path const& file) const +std::string UpdateFetcher::ReadSQLUpdate(boost::filesystem::path const& file) const { std::ifstream in(file.c_str()); - WPFatal(in.is_open(), "Could not read an update file."); + if (!in.is_open()) + { + TC_LOG_FATAL("sql.updates", "Failed to open the sql update \"%s\" for reading! " + "Stopping the server to keep the database integrity, " + "try to identify and solve the issue or disabled the database updater.", + file.generic_string().c_str()); - auto const start_pos = in.tellg(); - in.ignore(std::numeric_limits<std::streamsize>::max()); - auto const char_count = in.gcount(); - in.seekg(start_pos); + throw UpdateException("Opening the sql update failed!"); + } - SQLUpdate const update(new std::string(char_count, char{})); + auto update = [&in] { + std::ostringstream ss; + ss << in.rdbuf(); + return ss.str(); + }(); - in.read(&(*update)[0], update->size()); in.close(); return update; } -UpdateResult UpdateFetcher::Update(bool const redundancyChecks, bool const allowRehash, bool const archivedRedundancy, int32 const cleanDeadReferencesMaxCount) const +UpdateResult UpdateFetcher::Update(bool const redundancyChecks, + bool const allowRehash, + bool const archivedRedundancy, + int32 const cleanDeadReferencesMaxCount) const { LocaleFileStorage const available = GetFileList(); AppliedFileStorage applied = ReceiveAppliedFiles(); @@ -200,11 +209,9 @@ UpdateResult UpdateFetcher::Update(bool const redundancyChecks, bool const allow } } - // Read update from file - SQLUpdate const update = ReadSQLUpdate(availableQuery.first); - // Calculate hash - std::string const hash = CalculateHash(update); + std::string const hash = + CalculateHash(ReadSQLUpdate(availableQuery.first)); UpdateMode mode = MODE_APPLY; @@ -327,11 +334,11 @@ UpdateResult UpdateFetcher::Update(bool const redundancyChecks, bool const allow return UpdateResult(importedUpdates, countRecentUpdates, countArchivedUpdates); } -std::string UpdateFetcher::CalculateHash(SQLUpdate const& query) const +std::string UpdateFetcher::CalculateHash(std::string const& query) const { // Calculate a Sha1 hash based on query content. unsigned char digest[SHA_DIGEST_LENGTH]; - SHA1((unsigned char*)query->c_str(), query->length(), (unsigned char*)&digest); + SHA1((unsigned char*)query.c_str(), query.length(), (unsigned char*)&digest); return ByteArrayToHexStr(digest, SHA_DIGEST_LENGTH); } diff --git a/src/server/database/Updater/UpdateFetcher.h b/src/server/database/Updater/UpdateFetcher.h index 22a0d08c7f8..c87efea2b02 100644 --- a/src/server/database/Updater/UpdateFetcher.h +++ b/src/server/database/Updater/UpdateFetcher.h @@ -103,16 +103,16 @@ private: typedef std::unordered_map<std::string, std::string> HashToFileNameStorage; typedef std::unordered_map<std::string, AppliedFileEntry> AppliedFileStorage; typedef std::vector<UpdateFetcher::DirectoryEntry> DirectoryStorage; - typedef std::shared_ptr<std::string> SQLUpdate; LocaleFileStorage GetFileList() const; - void FillFileListRecursively(Path const& path, LocaleFileStorage& storage, State const state, uint32 const depth) const; + void FillFileListRecursively(Path const& path, LocaleFileStorage& storage, + State const state, uint32 const depth) const; DirectoryStorage ReceiveIncludedDirectories() const; AppliedFileStorage ReceiveAppliedFiles() const; - SQLUpdate ReadSQLUpdate(Path const& file) const; - std::string CalculateHash(SQLUpdate const& query) const; + std::string ReadSQLUpdate(Path const& file) const; + std::string CalculateHash(std::string const& query) const; uint32 Apply(Path const& path) const; diff --git a/src/server/game/AI/CoreAI/UnitAI.cpp b/src/server/game/AI/CoreAI/UnitAI.cpp index a3a5e7f7663..3aadf6e59a0 100644 --- a/src/server/game/AI/CoreAI/UnitAI.cpp +++ b/src/server/game/AI/CoreAI/UnitAI.cpp @@ -259,36 +259,6 @@ void UnitAI::FillAISpellInfo() } } -//Enable PlayerAI when charmed -void PlayerAI::OnCharmed(bool apply) -{ - me->IsAIEnabled = apply; -} - -void SimpleCharmedAI::UpdateAI(const uint32 /*diff*/) -{ - Creature* charmer = me->GetCharmer()->ToCreature(); - - //kill self if charm aura has infinite duration - if (charmer->IsInEvadeMode()) - { - Unit::AuraEffectList const& auras = me->GetAuraEffectsByType(SPELL_AURA_MOD_CHARM); - for (Unit::AuraEffectList::const_iterator iter = auras.begin(); iter != auras.end(); ++iter) - if ((*iter)->GetCasterGUID() == charmer->GetGUID() && (*iter)->GetBase()->IsPermanent()) - { - charmer->Kill(me); - return; - } - } - - if (!charmer->IsInCombat()) - me->GetMotionMaster()->MoveFollow(charmer, PET_FOLLOW_DIST, me->GetFollowAngle()); - - Unit* target = me->GetVictim(); - if (!target || !charmer->IsValidAttackTarget(target)) - AttackStart(charmer->SelectNearestTargetInAttackDistance()); -} - SpellTargetSelector::SpellTargetSelector(Unit* caster, uint32 spellId) : _caster(caster), _spellInfo(sSpellMgr->GetSpellForDifficultyFromSpell(sSpellMgr->GetSpellInfo(spellId), caster)) { diff --git a/src/server/game/AI/CoreAI/UnitAI.h b/src/server/game/AI/CoreAI/UnitAI.h index 5dc5946b226..766e747d998 100644 --- a/src/server/game/AI/CoreAI/UnitAI.h +++ b/src/server/game/AI/CoreAI/UnitAI.h @@ -268,21 +268,4 @@ class UnitAI UnitAI& operator=(UnitAI const& right) = delete; }; -class PlayerAI : public UnitAI -{ - protected: - Player* const me; - public: - explicit PlayerAI(Player* player) : UnitAI((Unit*)player), me(player) { } - - void OnCharmed(bool apply) override; -}; - -class SimpleCharmedAI : public PlayerAI -{ - public: - void UpdateAI(uint32 diff) override; - SimpleCharmedAI(Player* player): PlayerAI(player) { } -}; - #endif diff --git a/src/server/game/AI/CreatureAI.cpp b/src/server/game/AI/CreatureAI.cpp index c254a9124c1..352ae635878 100644 --- a/src/server/game/AI/CreatureAI.cpp +++ b/src/server/game/AI/CreatureAI.cpp @@ -133,7 +133,7 @@ void CreatureAI::MoveInLineOfSight(Unit* who) if (me->GetCreatureType() == CREATURE_TYPE_NON_COMBAT_PET) // non-combat pets should just stand there and look good;) return; - if (me->CanStartAttack(who, false)) + if (me->HasReactState(REACT_AGGRESSIVE) && me->CanStartAttack(who, false)) AttackStart(who); //else if (who->GetVictim() && me->IsFriendlyTo(who) // && me->IsWithinDistInMap(who, sWorld->getIntConfig(CONFIG_CREATURE_FAMILY_ASSISTANCE_RADIUS)) @@ -350,7 +350,7 @@ int32 CreatureAI::VisualizeBoundary(uint32 duration, Unit* owner, bool fill) con return boundsWarning ? LANG_CREATURE_MOVEMENT_MAYBE_UNBOUNDED : 0; } -bool CreatureAI::CheckBoundary(Position* who) const +bool CreatureAI::CheckBoundary(Position const* who) const { if (!who) who = me; diff --git a/src/server/game/AI/CreatureAI.h b/src/server/game/AI/CreatureAI.h index f250a79ea25..e009e2ed0b6 100644 --- a/src/server/game/AI/CreatureAI.h +++ b/src/server/game/AI/CreatureAI.h @@ -28,6 +28,7 @@ class WorldObject; class Unit; class Creature; class Player; +class PlayerAI; class SpellInfo; #define TIME_INTERVAL_LOOK 5000 @@ -79,7 +80,7 @@ class CreatureAI : public UnitAI Creature* DoSummon(uint32 entry, WorldObject* obj, float radius = 5.0f, uint32 despawnTime = 30000, TempSummonType summonType = TEMPSUMMON_CORPSE_TIMED_DESPAWN); Creature* DoSummonFlyer(uint32 entry, WorldObject* obj, float flightZ, float radius = 5.0f, uint32 despawnTime = 30000, TempSummonType summonType = TEMPSUMMON_CORPSE_TIMED_DESPAWN); - bool CheckBoundary(Position* who = nullptr) const; + bool CheckBoundary(Position const* who = nullptr) const; void SetBoundary(CreatureBoundary const* boundary) { _boundary = boundary; me->DoImmediateBoundaryCheck(); } public: enum EvadeReason @@ -186,6 +187,11 @@ class CreatureAI : public UnitAI virtual bool CanSeeAlways(WorldObject const* /*obj*/) { return false; } + // Called when a player is charmed by the creature + // If a PlayerAI* is returned, that AI is placed on the player instead of the default charm AI + // Object destruction is handled by Unit::RemoveCharmedBy + virtual PlayerAI* GetAIForCharmedPlayer(Player* /*who*/) { return nullptr; } + // intended for encounter design/debugging. do not use for other purposes. expensive. int32 VisualizeBoundary(uint32 duration, Unit* owner=nullptr, bool fill=false) const; virtual bool CheckInRoom(); diff --git a/src/server/game/AI/PlayerAI/PlayerAI.cpp b/src/server/game/AI/PlayerAI/PlayerAI.cpp new file mode 100644 index 00000000000..bafa1a0ecf7 --- /dev/null +++ b/src/server/game/AI/PlayerAI/PlayerAI.cpp @@ -0,0 +1,224 @@ +/* + * Copyright (C) 2016-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "PlayerAI.h" +#include "SpellAuras.h" +#include "SpellAuraEffects.h" + +enum Spells +{ + /* Generic */ + SPELL_AUTO_SHOT = 75, + SPELL_SHOOT = 3018, + SPELL_THROW = 2764, + SPELL_SHOOT_WAND = 5019, + + /* Paladin */ + PASSIVE_ILLUMINATION = 20215, + + /* Priest */ + SPELL_SOUL_WARDING = 63574, + SPELL_SPIRIT_REDEMPTION = 20711, + SPELL_SHADOWFORM = 15473, + + /* Shaman */ + SPELL_TIDAL_FORCE = 582, + SPELL_MANA_TIDE_TOTEM = 590, + SPELL_SHA_NATURE_SWIFT = 591, + SPELL_STORMSTRIKE = 17364, + + /* Druid */ + SPELL_MOONKIN_FORM = 24858, + SPELL_SWIFTMEND = 18562, + SPELL_DRU_NATURE_SWIFT = 17116, + SPELL_TREE_OF_LIFE = 33891 +}; + +bool PlayerAI::IsPlayerHealer(Player const* who) +{ + switch (who->getClass()) + { + case CLASS_WARRIOR: + case CLASS_HUNTER: + case CLASS_ROGUE: + case CLASS_DEATH_KNIGHT: + case CLASS_MAGE: + case CLASS_WARLOCK: + default: + return false; + case CLASS_PALADIN: + return who->HasSpell(PASSIVE_ILLUMINATION); + case CLASS_PRIEST: + return who->HasSpell(SPELL_SOUL_WARDING) || who->HasSpell(SPELL_SPIRIT_REDEMPTION); + case CLASS_SHAMAN: + return who->HasSpell(SPELL_MANA_TIDE_TOTEM) || who->HasSpell(SPELL_SHA_NATURE_SWIFT) || who->HasSpell(SPELL_TIDAL_FORCE); + case CLASS_DRUID: + return who->HasSpell(SPELL_SWIFTMEND) || who->HasSpell(SPELL_DRU_NATURE_SWIFT) || who->HasSpell(SPELL_TREE_OF_LIFE); + } +} + +bool PlayerAI::IsPlayerRangedAttacker(Player const* who) +{ + switch (who->getClass()) + { + case CLASS_WARRIOR: + case CLASS_PALADIN: + case CLASS_ROGUE: + case CLASS_DEATH_KNIGHT: + default: + return false; + case CLASS_MAGE: + case CLASS_WARLOCK: + return true; + case CLASS_HUNTER: + { + // check if we have a ranged weapon equipped + Item const* rangedSlot = who->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_RANGED); + if (ItemTemplate const* rangedTemplate = rangedSlot ? rangedSlot->GetTemplate() : nullptr) + if ((1 << rangedTemplate->SubClass) & ITEM_SUBCLASS_MASK_WEAPON_RANGED) + return true; + return false; + } + case CLASS_PRIEST: + return who->HasSpell(SPELL_SHADOWFORM); + case CLASS_SHAMAN: + return !who->HasSpell(SPELL_STORMSTRIKE); + case CLASS_DRUID: + return who->HasSpell(SPELL_MOONKIN_FORM); + } +} + +void PlayerAI::DoRangedAttackIfReady() +{ + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + if (!me->isAttackReady(RANGED_ATTACK)) + return; + + Unit* victim = me->GetVictim(); + if (!victim) + return; + + uint32 rangedAttackSpell = 0; + + Item const* rangedItem = me->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_RANGED); + if (ItemTemplate const* rangedTemplate = rangedItem ? rangedItem->GetTemplate() : nullptr) + { + switch (rangedTemplate->SubClass) + { + case ITEM_SUBCLASS_WEAPON_BOW: + case ITEM_SUBCLASS_WEAPON_GUN: + case ITEM_SUBCLASS_WEAPON_CROSSBOW: + rangedAttackSpell = SPELL_SHOOT; + break; + case ITEM_SUBCLASS_WEAPON_THROWN: + rangedAttackSpell = SPELL_THROW; + break; + case ITEM_SUBCLASS_WEAPON_WAND: + rangedAttackSpell = SPELL_SHOOT_WAND; + break; + } + } + + if (!rangedAttackSpell) + return; + + me->CastSpell(victim, rangedAttackSpell, TRIGGERED_CAST_DIRECTLY); + me->resetAttackTimer(RANGED_ATTACK); +} + +void PlayerAI::DoAutoAttackIfReady() +{ + if (IsRangedAttacker()) + DoRangedAttackIfReady(); + else + DoMeleeAttackIfReady(); +} + +struct UncontrolledTargetSelectPredicate : public std::unary_function<Unit*, bool> +{ + bool operator()(Unit const* target) const + { + return !target->HasBreakableByDamageCrowdControlAura(); + } +}; +Unit* SimpleCharmedPlayerAI::SelectAttackTarget() const +{ + if (Unit* charmer = me->GetCharmer()) + return charmer->IsAIEnabled ? charmer->GetAI()->SelectTarget(SELECT_TARGET_RANDOM, 0, UncontrolledTargetSelectPredicate()) : charmer->GetVictim(); + return nullptr; +} + +void SimpleCharmedPlayerAI::UpdateAI(const uint32 /*diff*/) +{ + Creature* charmer = me->GetCharmer() ? me->GetCharmer()->ToCreature() : nullptr; + + //kill self if charm aura has infinite duration + if (charmer->IsInEvadeMode()) + { + Player::AuraEffectList const& auras = me->GetAuraEffectsByType(SPELL_AURA_MOD_CHARM); + for (Player::AuraEffectList::const_iterator iter = auras.begin(); iter != auras.end(); ++iter) + if ((*iter)->GetCasterGUID() == charmer->GetGUID() && (*iter)->GetBase()->IsPermanent()) + { + me->Kill(me); + return; + } + } + + if (charmer->IsInCombat()) + { + Unit* target = me->GetVictim(); + if (!target || !charmer->IsValidAttackTarget(target) || target->HasBreakableByDamageCrowdControlAura()) + { + target = SelectAttackTarget(); + if (!target) + return; + + if (IsRangedAttacker()) + AttackStartCaster(target, 28.0f); + else + AttackStart(target); + } + DoAutoAttackIfReady(); + } + else + { + me->AttackStop(); + me->CastStop(); + me->StopMoving(); + me->GetMotionMaster()->Clear(); + me->GetMotionMaster()->MoveFollow(charmer, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); + } +} + +void SimpleCharmedPlayerAI::OnCharmed(bool apply) +{ + if (apply) + { + me->CastStop(); + me->AttackStop(); + } + else + { + me->CastStop(); + me->AttackStop(); + // @todo only voluntary movement (don't cancel stuff like death grip or charge mid-animation) + me->GetMotionMaster()->Clear(); + me->StopMoving(); + } +} diff --git a/src/server/game/AI/PlayerAI/PlayerAI.h b/src/server/game/AI/PlayerAI/PlayerAI.h new file mode 100644 index 00000000000..1820bcf11c0 --- /dev/null +++ b/src/server/game/AI/PlayerAI/PlayerAI.h @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2016-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef TRINITY_PLAYERAI_H +#define TRINITY_PLAYERAI_H + +#include "UnitAI.h" +#include "Player.h" +#include "Creature.h" + +class PlayerAI : public UnitAI +{ + public: + explicit PlayerAI(Player* player) : UnitAI(static_cast<Unit*>(player)), me(player), _isSelfHealer(PlayerAI::IsPlayerHealer(player)), _isSelfRangedAttacker(PlayerAI::IsPlayerRangedAttacker(player)) { } + + void OnCharmed(bool /*apply*/) override { } // charm AI application for players is handled by Unit::SetCharmedBy / Unit::RemoveCharmedBy + + // helper functions to determine player info + static bool IsPlayerHealer(Player const* who); + bool IsHealer(Player const* who = nullptr) const { return (!who || who == me) ? _isSelfHealer : IsPlayerHealer(who); } + static bool IsPlayerRangedAttacker(Player const* who); + bool IsRangedAttacker(Player const* who = nullptr) const { return (!who || who == me) ? _isSelfRangedAttacker : IsPlayerRangedAttacker(who); } + + protected: + Player* const me; + void SetIsRangedAttacker(bool state) { _isSelfRangedAttacker = state; } // this allows overriding of the default ranged attacker detection + + virtual Unit* SelectAttackTarget() const { return me->GetCharmer() ? me->GetCharmer()->GetVictim() : nullptr; } + void DoRangedAttackIfReady(); + void DoAutoAttackIfReady(); + + private: + bool _isSelfHealer; + bool _isSelfRangedAttacker; +}; + +class SimpleCharmedPlayerAI : public PlayerAI +{ + public: + SimpleCharmedPlayerAI(Player* player) : PlayerAI(player) { } + void UpdateAI(uint32 diff) override; + void OnCharmed(bool apply) override; + Unit* SelectAttackTarget() const override; +}; + +#endif diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp index 8a1be33cc2b..2fc87347364 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp @@ -547,6 +547,29 @@ void BossAI::UpdateAI(uint32 diff) DoMeleeAttackIfReady(); } +void BossAI::_DespawnAtEvade(uint32 delayToRespawn) +{ + if (delayToRespawn < 2) + { + TC_LOG_ERROR("scripts", "_DespawnAtEvade called with delay of %u seconds, defaulting to 2.", delayToRespawn); + delayToRespawn = 2; + } + + uint32 corpseDelay = me->GetCorpseDelay(); + uint32 respawnDelay = me->GetRespawnDelay(); + + me->SetCorpseDelay(1); + me->SetRespawnDelay(delayToRespawn - 1); + + me->DespawnOrUnsummon(); + + me->SetCorpseDelay(corpseDelay); + me->SetRespawnDelay(respawnDelay); + + if(instance) + instance->SetBossState(_bossId, FAIL); +} + // WorldBossAI - for non-instanced bosses WorldBossAI::WorldBossAI(Creature* creature) : diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.h b/src/server/game/AI/ScriptedAI/ScriptedCreature.h index 448ddc7dc73..5452a033a17 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.h +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.h @@ -360,11 +360,14 @@ class BossAI : public ScriptedAI void JustDied(Unit* /*killer*/) override { _JustDied(); } void JustReachedHome() override { _JustReachedHome(); } + bool CanAIAttack(Unit const* target) const override { return CheckBoundary(target); } + protected: void _Reset(); void _EnterCombat(); void _JustDied(); void _JustReachedHome() { me->setActive(false); } + void _DespawnAtEvade(uint32 delayToRespawn = 30); void TeleportCheaters(); diff --git a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp index 68cb8d346d0..fa80634e0f0 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp @@ -105,7 +105,7 @@ bool npc_escortAI::AssistPlayerInCombat(Unit* who) void npc_escortAI::MoveInLineOfSight(Unit* who) { - if (!me->HasUnitState(UNIT_STATE_STUNNED) && who->isTargetableForAttack() && who->isInAccessiblePlaceFor(me)) + if (me->HasReactState(REACT_AGGRESSIVE) && !me->HasUnitState(UNIT_STATE_STUNNED) && who->isTargetableForAttack() && who->isInAccessiblePlaceFor(me)) { if (HasEscortState(STATE_ESCORT_ESCORTING) && AssistPlayerInCombat(who)) return; diff --git a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp index dc9f6d2681e..778edf8cab5 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp @@ -102,7 +102,7 @@ bool FollowerAI::AssistPlayerInCombat(Unit* who) void FollowerAI::MoveInLineOfSight(Unit* who) { - if (!me->HasUnitState(UNIT_STATE_STUNNED) && who->isTargetableForAttack() && who->isInAccessiblePlaceFor(me)) + if (me->HasReactState(REACT_AGGRESSIVE) && !me->HasUnitState(UNIT_STATE_STUNNED) && who->isTargetableForAttack() && who->isInAccessiblePlaceFor(me)) { if (HasFollowState(STATE_FOLLOW_INPROGRESS) && AssistPlayerInCombat(who)) return; diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index eca327e770e..361bb1a5b1d 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -466,6 +466,9 @@ bool SmartAI::CanAIAttack(const Unit* /*who*/) const bool SmartAI::AssistPlayerInCombat(Unit* who) { + if (me->HasReactState(REACT_PASSIVE)) + return false; + if (!who || !who->GetVictim()) return false; diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 01f47582926..859282891fb 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -1998,7 +1998,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (Creature* creature = (*itr)->ToCreature()) { creature->GetMotionMaster()->Clear(); - creature->GetMotionMaster()->MoveJump(e.target.x, e.target.y, e.target.z, (float)e.action.jump.speedxy, (float)e.action.jump.speedz); + creature->GetMotionMaster()->MoveJump(e.target.x, e.target.y, e.target.z, 0.0f, (float)e.action.jump.speedxy, (float)e.action.jump.speedz); // @todo add optional jump orientation support? } } /// @todo Resume path when reached jump location diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index 6f424003006..3fe6fcdb4ae 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -468,7 +468,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry %d SourceType %u Event %u Action %u uses non-existent Map entry %u, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.event.respawn.map); return false; } - if (e.event.respawn.type == SMART_SCRIPT_RESPAWN_CONDITION_AREA && !GetAreaEntryByAreaID(e.event.respawn.area)) + if (e.event.respawn.type == SMART_SCRIPT_RESPAWN_CONDITION_AREA && !sAreaTableStore.LookupEntry(e.event.respawn.area)) { TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry %d SourceType %u Event %u Action %u uses non-existent Area entry %u, skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), e.event.respawn.area); return false; diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index 4ebd3ae7042..3f5db56558b 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -670,8 +670,8 @@ enum RBACPermissions RBAC_PERM_COMMAND_WP_UNLOAD = 772, RBAC_PERM_COMMAND_WP_RELOAD = 773, RBAC_PERM_COMMAND_WP_SHOW = 774, - RBAC_PERM_COMMAND_MODIFY_CURRENCY = 775, // only 4.3.4 - RBAC_PERM_COMMAND_DEBUG_PHASE = 776, // only 4.3.4 + RBAC_PERM_COMMAND_MODIFY_CURRENCY = 775, // only 6.x + RBAC_PERM_COMMAND_DEBUG_PHASE = 776, // only 6.x RBAC_PERM_COMMAND_MAILBOX = 777, RBAC_PERM_COMMAND_AHBOT = 778, RBAC_PERM_COMMAND_AHBOT_ITEMS = 779, diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 90e61826e35..40cb643bbb5 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -46,7 +46,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) { if (dataType >= MAX_ACHIEVEMENT_CRITERIA_DATA_TYPE) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` for criteria (Entry: %u) has wrong data type (%u), ignored.", criteria->ID, dataType); + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` for criteria (Entry: %u) contains a wrong data type (%u), ignored.", criteria->ID, dataType); return false; } @@ -81,7 +81,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) default: if (dataType != ACHIEVEMENT_CRITERIA_DATA_TYPE_SCRIPT) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` has data for non-supported criteria type (Entry: %u Type: %u), ignored.", criteria->ID, criteria->requiredType); + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` contains data for a non-supported criteria type (Entry: %u Type: %u), ignored.", criteria->ID, criteria->requiredType); return false; } break; @@ -96,7 +96,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_CREATURE: if (!creature.id || !sObjectMgr->GetCreatureTemplate(creature.id)) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_CREATURE (%u) has non-existing creature id in value1 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_CREATURE (%u) contains a non-existing creature id in value1 (%u), ignored.", criteria->ID, criteria->requiredType, dataType, creature.id); return false; } @@ -104,13 +104,13 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_CLASS_RACE: if (classRace.class_id && ((1 << (classRace.class_id-1)) & CLASSMASK_ALL_PLAYABLE) == 0) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_CLASS_RACE (%u) has non-existing class in value1 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_CLASS_RACE (%u) contains a non-existing class in value1 (%u), ignored.", criteria->ID, criteria->requiredType, dataType, classRace.class_id); return false; } if (classRace.race_id && ((1 << (classRace.race_id-1)) & RACEMASK_ALL_PLAYABLE) == 0) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_CLASS_RACE (%u) has non-existing race in value2 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_CLASS_RACE (%u) contains a non-existing race in value2 (%u), ignored.", criteria->ID, criteria->requiredType, dataType, classRace.race_id); return false; } @@ -118,7 +118,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_LESS_HEALTH: if (health.percent < 1 || health.percent > 100) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_PLAYER_LESS_HEALTH (%u) has wrong percent value in value1 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_PLAYER_LESS_HEALTH (%u) contains a wrong percent value in value1 (%u), ignored.", criteria->ID, criteria->requiredType, dataType, health.percent); return false; } @@ -126,7 +126,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_DEAD: if (player_dead.own_team_flag > 1) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_DEAD (%u) has wrong boolean value1 (%u).", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_DEAD (%u) contains a wrong boolean value1 (%u).", criteria->ID, criteria->requiredType, dataType, player_dead.own_team_flag); return false; } @@ -137,28 +137,28 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) SpellInfo const* spellEntry = sSpellMgr->GetSpellInfo(aura.spell_id); if (!spellEntry) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type %s (%u) has wrong spell id in value1 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type %s (%u) contains a wrong spell id in value1 (%u), ignored.", criteria->ID, criteria->requiredType, (dataType == ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AURA?"ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AURA":"ACHIEVEMENT_CRITERIA_DATA_TYPE_T_AURA"), dataType, aura.spell_id); return false; } if (aura.effect_idx >= 3) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type %s (%u) has wrong spell effect index in value2 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type %s (%u) contains a wrong spell effect index in value2 (%u), ignored.", criteria->ID, criteria->requiredType, (dataType == ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AURA?"ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AURA":"ACHIEVEMENT_CRITERIA_DATA_TYPE_T_AURA"), dataType, aura.effect_idx); return false; } if (!spellEntry->Effects[aura.effect_idx].ApplyAuraName) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type %s (%u) has non-aura spell effect (ID: %u Effect: %u), ignores.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type %s (%u) contains a non-aura spell effect (ID: %u Effect: %u), ignored.", criteria->ID, criteria->requiredType, (dataType == ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AURA?"ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AURA":"ACHIEVEMENT_CRITERIA_DATA_TYPE_T_AURA"), dataType, aura.spell_id, aura.effect_idx); return false; } return true; } case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AREA: - if (!GetAreaEntryByAreaID(area.id)) + if (!sAreaTableStore.LookupEntry(area.id)) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AREA (%u) has wrong area id in value1 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AREA (%u) contains a wrong area id in value1 (%u), ignored.", criteria->ID, criteria->requiredType, dataType, area.id); return false; } @@ -166,7 +166,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_VALUE: if (value.compType >= COMP_TYPE_MAX) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_VALUE (%u) has wrong ComparisionType in value2 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_VALUE (%u) contains a wrong ComparisionType in value2 (%u), ignored.", criteria->ID, criteria->requiredType, dataType, value.compType); return false; } @@ -174,7 +174,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_LEVEL: if (level.minlevel > STRONG_MAX_LEVEL) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_T_LEVEL (%u) has wrong minlevel in value1 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_T_LEVEL (%u) contains a wrong minlevel in value1 (%u), ignored.", criteria->ID, criteria->requiredType, dataType, level.minlevel); return false; } @@ -182,7 +182,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_GENDER: if (gender.gender > GENDER_NONE) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_T_GENDER (%u) has wrong gender in value1 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_T_GENDER (%u) contains a wrong gender value in value1 (%u), ignored.", criteria->ID, criteria->requiredType, dataType, gender.gender); return false; } @@ -190,7 +190,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_SCRIPT: if (!ScriptId) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_SCRIPT (%u) does not have ScriptName set, ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_SCRIPT (%u) does not have a ScriptName set, ignored.", criteria->ID, criteria->requiredType, dataType); return false; } @@ -198,7 +198,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_DIFFICULTY: if (difficulty.difficulty >= MAX_DIFFICULTY) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_DIFFICULTY (%u) has wrong difficulty in value1 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_DIFFICULTY (%u) contains a wrong difficulty value in value1 (%u), ignored.", criteria->ID, criteria->requiredType, dataType, difficulty.difficulty); return false; } @@ -206,7 +206,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_PLAYER_COUNT: if (map_players.maxcount <= 0) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_PLAYER_COUNT (%u) has wrong max players count in value1 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_PLAYER_COUNT (%u) contains a wrong max players count in value1 (%u), ignored.", criteria->ID, criteria->requiredType, dataType, map_players.maxcount); return false; } @@ -214,7 +214,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_TEAM: if (team.team != ALLIANCE && team.team != HORDE) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_T_TEAM (%u) has unknown team in value1 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_T_TEAM (%u) contains an unknown team value in value1 (%u), ignored.", criteria->ID, criteria->requiredType, dataType, team.team); return false; } @@ -222,7 +222,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_DRUNK: if (drunk.state >= MAX_DRUNKEN) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_S_DRUNK (%u) has unknown drunken state in value1 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_S_DRUNK (%u) contains an unknown drunken state value in value1 (%u), ignored.", criteria->ID, criteria->requiredType, dataType, drunk.state); return false; } @@ -230,7 +230,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_HOLIDAY: if (!sHolidaysStore.LookupEntry(holiday.id)) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_HOLIDAY (%u) has unknown holiday in value1 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_HOLIDAY (%u) contains an unknown holiday entry in value1 (%u), ignored.", criteria->ID, criteria->requiredType, dataType, holiday.id); return false; } @@ -240,7 +240,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPED_ITEM: if (equipped_item.item_quality >= MAX_ITEM_QUALITY) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPED_ITEM (%u) has unknown quality state in value1 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPED_ITEM (%u) contains an unknown quality state value in value1 (%u), ignored.", criteria->ID, criteria->requiredType, dataType, equipped_item.item_quality); return false; } @@ -248,7 +248,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_ID: if (!sMapStore.LookupEntry(map_id.mapId)) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_ID (%u) has unknown map id in value1 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_ID (%u) contains an unknown map id in value1 (%u), ignored.", criteria->ID, criteria->requiredType, dataType, map_id.mapId); return false; } @@ -256,19 +256,19 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE: if (!classRace.class_id && !classRace.race_id) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE (%u) must not have 0 in either value field, ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE (%u) should not have 0 in either value field. Ignored.", criteria->ID, criteria->requiredType, dataType); return false; } if (classRace.class_id && ((1 << (classRace.class_id-1)) & CLASSMASK_ALL_PLAYABLE) == 0) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE (%u) has non-existing class in value1 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE (%u) contains a non-existing class entry in value1 (%u), ignored.", criteria->ID, criteria->requiredType, dataType, classRace.class_id); return false; } if (classRace.race_id && ((1 << (classRace.race_id-1)) & RACEMASK_ALL_PLAYABLE) == 0) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE (%u) has non-existing race in value2 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE (%u) contains a non-existing race entry in value2 (%u), ignored.", criteria->ID, criteria->requiredType, dataType, classRace.race_id); return false; } @@ -276,13 +276,13 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_KNOWN_TITLE: if (!sCharTitlesStore.LookupEntry(known_title.title_id)) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_S_KNOWN_TITLE (%u) have unknown title_id in value1 (%u), ignore.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_S_KNOWN_TITLE (%u) contains an unknown title_id in value1 (%u), ignore.", criteria->ID, criteria->requiredType, dataType, known_title.title_id); return false; } return true; default: - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) has data for non-supported data type (%u), ignored.", criteria->ID, criteria->requiredType, dataType); + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) contains data of a non-supported data type (%u), ignored.", criteria->ID, criteria->requiredType, dataType); return false; } } @@ -377,14 +377,14 @@ bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, Un Map* map = source->GetMap(); if (!map->IsDungeon()) { - TC_LOG_ERROR("achievement", "Achievement system call ACHIEVEMENT_CRITERIA_DATA_TYPE_INSTANCE_SCRIPT (%u) for achievement criteria %u for non-dungeon/non-raid map %u", + TC_LOG_ERROR("achievement", "Achievement system call ACHIEVEMENT_CRITERIA_DATA_TYPE_INSTANCE_SCRIPT (%u) for achievement criteria %u in a non-dungeon/non-raid map %u", dataType, criteria_id, map->GetId()); return false; } InstanceScript* instance = map->ToInstanceMap()->GetInstanceScript(); if (!instance) { - TC_LOG_ERROR("achievement", "Achievement system call ACHIEVEMENT_CRITERIA_DATA_TYPE_INSTANCE_SCRIPT (%u) for achievement criteria %u for map %u but map does not have a instance script", + TC_LOG_ERROR("achievement", "Achievement system call ACHIEVEMENT_CRITERIA_DATA_TYPE_INSTANCE_SCRIPT (%u) for achievement criteria %u in map %u, but the map does not have an instance script.", dataType, criteria_id, map->GetId()); return false; } @@ -601,8 +601,8 @@ void AchievementMgr::LoadFromDB(PreparedQueryResult achievementResult, PreparedQ AchievementCriteriaEntry const* criteria = sAchievementMgr->GetAchievementCriteria(id); if (!criteria) { - // we will remove not existed criteria for all characters - TC_LOG_ERROR("achievement", "Non-existing achievement criteria %u data removed from table `character_achievement_progress`.", id); + // Removing non-existing criteria data for all characters + TC_LOG_ERROR("achievement", "Non-existing achievement criteria %u data has been removed from the table `character_achievement_progress`.", id); PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_INVALID_ACHIEV_PROGRESS_CRITERIA); @@ -1066,7 +1066,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui break; } - // std case: not exist in DBC, not triggered in code as result + // std case: does not exist in DBC, not triggered in code as result case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALTH: case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_SPELLPOWER: case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_ARMOR: @@ -1404,7 +1404,7 @@ void AchievementMgr::SetCriteriaProgress(AchievementCriteriaEntry const* entry, if (entry->timeLimit) { - // has to exist else we wouldn't be here + // has to exist, otherwise we wouldn't be here timedCompleted = IsCompletedCriteria(entry, sAchievementMgr->GetAchievement(entry->referredAchievement)); // Client expects this in packet timeElapsed = entry->timeLimit - (timedIter->second/IN_MILLISECONDS); @@ -1655,14 +1655,14 @@ bool AchievementMgr::CanUpdateCriteria(AchievementCriteriaEntry const* criteria, if (!RequirementsSatisfied(criteria, achievement, miscValue1, miscValue2, unit)) { - TC_LOG_TRACE("achievement", "CanUpdateCriteria: (Id: %u Type %s) Requirements not satisfied", + TC_LOG_TRACE("achievement", "CanUpdateCriteria: (Id: %u Type %s) Requirements have not been satisfied", criteria->ID, AchievementGlobalMgr::GetCriteriaTypeString(criteria->requiredType)); return false; } if (!ConditionsSatisfied(criteria)) { - TC_LOG_TRACE("achievement", "CanUpdateCriteria: (Id: %u Type %s) Conditions not satisfied", + TC_LOG_TRACE("achievement", "CanUpdateCriteria: (Id: %u Type %s) Conditions have not been satisfied", criteria->ID, AchievementGlobalMgr::GetCriteriaTypeString(criteria->requiredType)); return false; } @@ -1905,17 +1905,15 @@ bool AchievementMgr::RequirementsSatisfied(AchievementCriteriaEntry const* achie bool matchFound = false; for (int j = 0; j < MAX_WORLD_MAP_OVERLAY_AREA_IDX; ++j) { - uint32 area_id = worldOverlayEntry->areatableID[j]; - if (!area_id) // array have 0 only in empty tail + AreaTableEntry const* area = sAreaTableStore.LookupEntry(worldOverlayEntry->areatableID[j]); + if (!area) break; - int32 exploreFlag = GetAreaFlagByAreaID(area_id); - if (exploreFlag < 0) + uint32 playerIndexOffset = uint32(area->exploreFlag) / 32; + if (playerIndexOffset >= PLAYER_EXPLORED_ZONES_SIZE) continue; - uint32 playerIndexOffset = uint32(exploreFlag) / 32; - uint32 mask = 1 << (uint32(exploreFlag) % 32); - + uint32 mask = 1 << (uint32(area->exploreFlag) % 32); if (GetPlayer()->GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + playerIndexOffset) & mask) { matchFound = true; @@ -2275,7 +2273,7 @@ void AchievementGlobalMgr::LoadAchievementCriteriaList() ++loaded; } - TC_LOG_INFO("server.loading", ">> Loaded %u achievement criteria in %u ms", loaded, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u achievement criteria in %u ms.", loaded, GetMSTimeDiffToNow(oldMSTime)); } void AchievementGlobalMgr::LoadAchievementReferenceList() @@ -2304,7 +2302,7 @@ void AchievementGlobalMgr::LoadAchievementReferenceList() if (AchievementEntry const* achievement = sAchievementMgr->GetAchievement(4539)) const_cast<AchievementEntry*>(achievement)->mapID = 631; // Correct map requirement (currently has Ulduar) - TC_LOG_INFO("server.loading", ">> Loaded %u achievement references in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u achievement references in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } void AchievementGlobalMgr::LoadAchievementCriteriaData() @@ -2332,7 +2330,7 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData() if (!criteria) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` has data for non-existing criteria (Entry: %u), ignore.", criteria_id); + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` contains data for non-existing criteria (Entry: %u). Ignored.", criteria_id); continue; } @@ -2342,7 +2340,7 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData() if (scriptName.length()) // not empty { if (dataType != ACHIEVEMENT_CRITERIA_DATA_TYPE_SCRIPT) - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` has ScriptName set for non-scripted data type (Entry: %u, type %u), useless data.", criteria_id, dataType); + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` contains a ScriptName for non-scripted data type (Entry: %u, type %u), useless data.", criteria_id, dataType); else scriptId = sObjectMgr->GetScriptId(scriptName); } @@ -2398,7 +2396,7 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData() if (!achievement) continue; - // exist many achievements with this criteria, use at this moment hardcoded check to skil simple case + // There are many achievements with these criteria, use hardcoded check at this moment to pick a simple case if (achievement->ID == 1282) break; @@ -2435,7 +2433,7 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData() } if (!GetCriteriaDataSet(criteria) && !DisableMgr::IsDisabledFor(DISABLE_TYPE_ACHIEVEMENT_CRITERIA, entryId, NULL)) - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` does not have expected data for criteria (Entry: %u Type: %u) for achievement %u.", criteria->ID, criteria->requiredType, criteria->referredAchievement); + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` does not contain expected data for criteria (Entry: %u Type: %u) for achievement %u.", criteria->ID, criteria->requiredType, criteria->referredAchievement); } TC_LOG_INFO("server.loading", ">> Loaded %u additional achievement criteria data in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); @@ -2461,8 +2459,8 @@ void AchievementGlobalMgr::LoadCompletedAchievements() const AchievementEntry* achievement = sAchievementMgr->GetAchievement(achievementId); if (!achievement) { - // Remove non existent achievements from all characters - TC_LOG_ERROR("achievement", "Non-existing achievement %u data removed from table `character_achievement`.", achievementId); + // Remove non-existing achievements from all characters + TC_LOG_ERROR("achievement", "Non-existing achievement %u data has been removed from the table `character_achievement`.", achievementId); PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_INVALID_ACHIEVMENT); stmt->setUInt16(0, uint16(achievementId)); @@ -2475,7 +2473,7 @@ void AchievementGlobalMgr::LoadCompletedAchievements() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %lu realm first completed achievements in %u ms", (unsigned long)m_allCompletedAchievements.size(), GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %lu realm first completed achievements in %u ms.", (unsigned long)m_allCompletedAchievements.size(), GetMSTimeDiffToNow(oldMSTime)); } void AchievementGlobalMgr::LoadRewards() @@ -2502,7 +2500,7 @@ void AchievementGlobalMgr::LoadRewards() AchievementEntry const* achievement = GetAchievement(entry); if (!achievement) { - TC_LOG_ERROR("sql.sql", "Table `achievement_reward` has wrong achievement (Entry: %u), ignored.", entry); + TC_LOG_ERROR("sql.sql", "Table `achievement_reward` contains a wrong achievement entry (Entry: %u), ignored.", entry); continue; } @@ -2518,19 +2516,19 @@ void AchievementGlobalMgr::LoadRewards() // must be title or mail at least if (!reward.titleId[0] && !reward.titleId[1] && !reward.sender) { - TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) does not have title or item reward data, ignored.", entry); + TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) does not contain title or item reward data. Ignored.", entry); continue; } if (achievement->requiredFaction == ACHIEVEMENT_FACTION_ANY && (!reward.titleId[0] ^ !reward.titleId[1])) - TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) has title (A: %u H: %u) for only one team.", entry, reward.titleId[0], reward.titleId[1]); + TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) contains the title (A: %u H: %u) for only one team.", entry, reward.titleId[0], reward.titleId[1]); if (reward.titleId[0]) { CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(reward.titleId[0]); if (!titleEntry) { - TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) has invalid title id (%u) in `title_A`, set to 0", entry, reward.titleId[0]); + TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) contains an invalid title id (%u) in `title_A`, set to 0", entry, reward.titleId[0]); reward.titleId[0] = 0; } } @@ -2540,7 +2538,7 @@ void AchievementGlobalMgr::LoadRewards() CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(reward.titleId[1]); if (!titleEntry) { - TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) has invalid title id (%u) in `title_H`, set to 0", entry, reward.titleId[1]); + TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) contains an invalid title id (%u) in `title_H`, set to 0", entry, reward.titleId[1]); reward.titleId[1] = 0; } } @@ -2550,41 +2548,41 @@ void AchievementGlobalMgr::LoadRewards() { if (!sObjectMgr->GetCreatureTemplate(reward.sender)) { - TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) has invalid creature entry %u as sender, mail reward skipped.", entry, reward.sender); + TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) contains an invalid creature entry %u as sender, mail reward skipped.", entry, reward.sender); reward.sender = 0; } } else { if (reward.itemId) - TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) does not have sender data but has item reward, item will not be rewarded.", entry); + TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) does not have sender data, but contains an item reward. Item will not be rewarded.", entry); if (!reward.subject.empty()) - TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) does not have sender data but has mail subject.", entry); + TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) does not have sender data, but contains a mail subject.", entry); if (!reward.text.empty()) - TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) does not have sender data but has mail text.", entry); + TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) does not have sender data, but contains mail text.", entry); if (reward.mailTemplate) - TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) does not have sender data but has mailTemplate.", entry); + TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) does not have sender data, but has a mailTemplate.", entry); } if (reward.mailTemplate) { if (!sMailTemplateStore.LookupEntry(reward.mailTemplate)) { - TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) has invalid mailTemplate (%u).", entry, reward.mailTemplate); + TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) is using an invalid mailTemplate (%u).", entry, reward.mailTemplate); reward.mailTemplate = 0; } else if (!reward.subject.empty() || !reward.text.empty()) - TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) has mailTemplate (%u) and mail subject/text.", entry, reward.mailTemplate); + TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) is using mailTemplate (%u) and mail subject/text.", entry, reward.mailTemplate); } if (reward.itemId) { if (!sObjectMgr->GetItemTemplate(reward.itemId)) { - TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) has invalid item id %u, reward mail will not contain item.", entry, reward.itemId); + TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) contains an invalid item id %u, reward mail will not contain the rewarded item.", entry, reward.itemId); reward.itemId = 0; } } @@ -2594,7 +2592,7 @@ void AchievementGlobalMgr::LoadRewards() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u achievement rewards in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u achievement rewards in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } void AchievementGlobalMgr::LoadRewardLocales() @@ -2609,7 +2607,7 @@ void AchievementGlobalMgr::LoadRewardLocales() if (!result) { - TC_LOG_INFO("server.loading", ">> Loaded 0 achievement reward locale strings. DB table `locales_achievement_reward` is empty"); + TC_LOG_INFO("server.loading", ">> Loaded 0 achievement reward locale strings. DB table `locales_achievement_reward` is empty."); return; } @@ -2621,7 +2619,7 @@ void AchievementGlobalMgr::LoadRewardLocales() if (m_achievementRewards.find(entry) == m_achievementRewards.end()) { - TC_LOG_ERROR("sql.sql", "Table `locales_achievement_reward` (Entry: %u) has locale strings for non-existing achievement reward.", entry); + TC_LOG_ERROR("sql.sql", "Table `locales_achievement_reward` (Entry: %u) contains locale strings for a non-existing achievement reward.", entry); continue; } @@ -2636,7 +2634,7 @@ void AchievementGlobalMgr::LoadRewardLocales() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u achievement reward locale strings in %u ms", uint32(m_achievementRewardLocales.size()), GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u achievement reward locale strings in %u ms.", uint32(m_achievementRewardLocales.size()), GetMSTimeDiffToNow(oldMSTime)); } AchievementEntry const* AchievementGlobalMgr::GetAchievement(uint32 achievementId) const diff --git a/src/server/game/Battlefield/Battlefield.cpp b/src/server/game/Battlefield/Battlefield.cpp index 34326d09e2f..e69d0f3085c 100644 --- a/src/server/game/Battlefield/Battlefield.cpp +++ b/src/server/game/Battlefield/Battlefield.cpp @@ -285,7 +285,7 @@ void Battlefield::InitStalker(uint32 entry, Position const& pos) if (Creature* creature = SpawnCreature(entry, pos, TEAM_NEUTRAL)) StalkerGuid = creature->GetGUID(); else - TC_LOG_ERROR("bg.battlefield", "Battlefield::InitStalker: could not spawn Stalker (Creature entry %u), zone messeges will be un-available", entry); + TC_LOG_ERROR("bg.battlefield", "Battlefield::InitStalker: Could not spawn Stalker (Creature entry %u), zone messages will be unavailable!", entry); } void Battlefield::KickAfkPlayers() @@ -544,10 +544,10 @@ BfGraveyard* Battlefield::GetGraveyardById(uint32 id) const if (BfGraveyard* graveyard = m_GraveyardList.at(id)) return graveyard; else - TC_LOG_ERROR("bg.battlefield", "Battlefield::GetGraveyardById Id:%u not existed", id); + TC_LOG_ERROR("bg.battlefield", "Battlefield::GetGraveyardById Id:%u does not exist.", id); } else - TC_LOG_ERROR("bg.battlefield", "Battlefield::GetGraveyardById Id:%u cant be found", id); + TC_LOG_ERROR("bg.battlefield", "Battlefield::GetGraveyardById Id:%u could not be found.", id); return NULL; } @@ -765,7 +765,7 @@ Creature* Battlefield::SpawnCreature(uint32 entry, float x, float y, float z, fl Map* map = sMapMgr->CreateBaseMap(m_MapId); if (!map) { - TC_LOG_ERROR("bg.battlefield", "Battlefield::SpawnCreature: Can't create creature entry: %u map not found", entry); + TC_LOG_ERROR("bg.battlefield", "Battlefield::SpawnCreature: Can't create creature entry: %u, map not found.", entry); return nullptr; } @@ -782,7 +782,7 @@ Creature* Battlefield::SpawnCreature(uint32 entry, float x, float y, float z, fl CreatureTemplate const* cinfo = sObjectMgr->GetCreatureTemplate(entry); if (!cinfo) { - TC_LOG_ERROR("bg.battlefield", "Battlefield::SpawnCreature: entry %u does not exist.", entry); + TC_LOG_ERROR("bg.battlefield", "Battlefield::SpawnCreature: Entry %u does not exist.", entry); return nullptr; } @@ -805,8 +805,8 @@ GameObject* Battlefield::SpawnGameObject(uint32 entry, float x, float y, float z GameObject* go = new GameObject; if (!go->Create(map->GenerateLowGuid<HighGuid::GameObject>(), entry, map, PHASEMASK_NORMAL, x, y, z, o, 0, 0, 0, 0, 100, GO_STATE_READY)) { - TC_LOG_ERROR("bg.battlefield", "Battlefield::SpawnGameObject: Gameobject template %u not found in database! Battlefield not created!", entry); - TC_LOG_ERROR("bg.battlefield", "Battlefield::SpawnGameObject: Cannot create gameobject template %u! Battlefield not created!", entry); + TC_LOG_ERROR("bg.battlefield", "Battlefield::SpawnGameObject: Gameobject template %u could not be found in the database! Battlefield has not been created!", entry); + TC_LOG_ERROR("bg.battlefield", "Battlefield::SpawnGameObject: Could not create gameobject template %u! Battlefield has not been created!", entry); delete go; return NULL; } @@ -907,7 +907,7 @@ bool BfCapturePoint::SetCapturePointData(GameObject* capturePoint) GameObjectTemplate const* goinfo = capturePoint->GetGOInfo(); if (goinfo->type != GAMEOBJECT_TYPE_CAPTURE_POINT) { - TC_LOG_ERROR("misc", "OutdoorPvP: GO %u is not capture point!", capturePoint->GetEntry()); + TC_LOG_ERROR("misc", "OutdoorPvP: GO %u is not a capture point!", capturePoint->GetEntry()); return false; } diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp index 062d4702d43..8942ca7a18e 100644 --- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp +++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp @@ -536,7 +536,7 @@ void BattlegroundMgr::LoadBattlegroundTemplates() BattlemasterListEntry const* bl = sBattlemasterListStore.LookupEntry(bgTypeId); if (!bl) { - TC_LOG_ERROR("bg.battleground", "Battleground ID %u not found in BattlemasterList.dbc. Battleground not created.", bgTypeId); + TC_LOG_ERROR("bg.battleground", "Battleground ID %u could not be found in BattlemasterList.dbc. The battleground was not created.", bgTypeId); continue; } @@ -554,14 +554,14 @@ void BattlegroundMgr::LoadBattlegroundTemplates() if (bgTemplate.MaxPlayersPerTeam == 0 || bgTemplate.MinPlayersPerTeam > bgTemplate.MaxPlayersPerTeam) { - TC_LOG_ERROR("sql.sql", "Table `battleground_template` for id %u has bad values for MinPlayersPerTeam (%u) and MaxPlayersPerTeam(%u)", + TC_LOG_ERROR("sql.sql", "Table `battleground_template` for id %u contains bad values for MinPlayersPerTeam (%u) and MaxPlayersPerTeam(%u).", bgTemplate.Id, bgTemplate.MinPlayersPerTeam, bgTemplate.MaxPlayersPerTeam); continue; } if (bgTemplate.MinLevel == 0 || bgTemplate.MaxLevel == 0 || bgTemplate.MinLevel > bgTemplate.MaxLevel) { - TC_LOG_ERROR("sql.sql", "Table `battleground_template` for id %u has bad values for MinLevel (%u) and MaxLevel (%u)", + TC_LOG_ERROR("sql.sql", "Table `battleground_template` for id %u contains bad values for MinLevel (%u) and MaxLevel (%u).", bgTemplate.Id, bgTemplate.MinLevel, bgTemplate.MaxLevel); continue; } @@ -575,7 +575,7 @@ void BattlegroundMgr::LoadBattlegroundTemplates() } else { - TC_LOG_ERROR("sql.sql", "Table `battleground_template` for id %u has non-existed WorldSafeLocs.dbc id %u in field `AllianceStartLoc`. BG not created.", bgTemplate.Id, startId); + TC_LOG_ERROR("sql.sql", "Table `battleground_template` for id %u contains a non-existing WorldSafeLocs.dbc id %u in field `AllianceStartLoc`. BG not created.", bgTemplate.Id, startId); continue; } @@ -586,7 +586,7 @@ void BattlegroundMgr::LoadBattlegroundTemplates() } else { - TC_LOG_ERROR("sql.sql", "Table `battleground_template` for id %u has non-existed WorldSafeLocs.dbc id %u in field `HordeStartLoc`. BG not created.", bgTemplate.Id, startId); + TC_LOG_ERROR("sql.sql", "Table `battleground_template` for id %u contains a non-existing WorldSafeLocs.dbc id %u in field `HordeStartLoc`. BG not created.", bgTemplate.Id, startId); continue; } } @@ -788,7 +788,7 @@ BattlegroundTypeId BattlegroundMgr::BGTemplateId(BattlegroundQueueTypeId bgQueue case BATTLEGROUND_QUEUE_5v5: return BATTLEGROUND_AA; default: - return BattlegroundTypeId(0); // used for unknown template (it existed and do nothing) + return BattlegroundTypeId(0); // used for unknown template (it exists and does nothing) } } @@ -892,7 +892,7 @@ void BattlegroundMgr::LoadBattleMastersEntry() uint32 bgTypeId = fields[1].GetUInt32(); if (!sBattlemasterListStore.LookupEntry(bgTypeId)) { - TC_LOG_ERROR("sql.sql", "Table `battlemaster_entry` contain entry %u for not existed battleground type %u, ignored.", entry, bgTypeId); + TC_LOG_ERROR("sql.sql", "Table `battlemaster_entry` contains entry %u for a non-existing battleground type %u, ignored.", entry, bgTypeId); continue; } @@ -912,7 +912,7 @@ void BattlegroundMgr::CheckBattleMasters() { if ((itr->second.npcflag & UNIT_NPC_FLAG_BATTLEMASTER) && mBattleMastersMap.find(itr->second.Entry) == mBattleMastersMap.end()) { - TC_LOG_ERROR("sql.sql", "CreatureTemplate (Entry: %u) has UNIT_NPC_FLAG_BATTLEMASTER but no data in `battlemaster_entry` table. Removing flag!", itr->second.Entry); + TC_LOG_ERROR("sql.sql", "Creature_Template Entry: %u has UNIT_NPC_FLAG_BATTLEMASTER, but no data in the `battlemaster_entry` table. Removing flag.", itr->second.Entry); const_cast<CreatureTemplate*>(&itr->second)->npcflag &= ~UNIT_NPC_FLAG_BATTLEMASTER; } } diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp index 626bcacbf27..e52106a8efe 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp @@ -171,7 +171,7 @@ void BattlegroundEY::CheckSomeoneJoinedPoint() Player* player = ObjectAccessor::FindPlayer(m_PlayersNearPoint[EY_POINTS_MAX][j]); if (!player) { - TC_LOG_ERROR("bg.battleground", "BattlegroundEY:CheckSomeoneJoinedPoint: Player (%s) not found!", m_PlayersNearPoint[EY_POINTS_MAX][j].ToString().c_str()); + TC_LOG_ERROR("bg.battleground", "BattlegroundEY:CheckSomeoneJoinedPoint: Player (%s) could not be found!", m_PlayersNearPoint[EY_POINTS_MAX][j].ToString().c_str()); ++j; continue; } @@ -212,8 +212,8 @@ void BattlegroundEY::CheckSomeoneLeftPoint() Player* player = ObjectAccessor::FindPlayer(m_PlayersNearPoint[i][j]); if (!player) { - TC_LOG_ERROR("bg.battleground", "BattlegroundEY:CheckSomeoneLeftPoint Player (%s) not found!", m_PlayersNearPoint[i][j].ToString().c_str()); - //move not existed player to "free space" - this will cause many error showing in log, but it is a very important bug + TC_LOG_ERROR("bg.battleground", "BattlegroundEY:CheckSomeoneLeftPoint Player (%s) could not be found!", m_PlayersNearPoint[i][j].ToString().c_str()); + //move non-existing players to "free space" - this will cause many errors showing in log, but it is a very important bug m_PlayersNearPoint[EY_POINTS_MAX].push_back(m_PlayersNearPoint[i][j]); m_PlayersNearPoint[i].erase(m_PlayersNearPoint[i].begin() + j); continue; @@ -498,7 +498,7 @@ bool BattlegroundEY::SetupBattleground() || !AddObject(BG_EY_OBJECT_TOWER_CAP_MAGE_TOWER, BG_OBJECT_HU_TOWER_CAP_EY_ENTRY, 2282.121582f, 1760.006958f, 1189.707153f, 1.919862f, 0, 0, 0.819152f, 0.573576f, RESPAWN_ONE_DAY) ) { - TC_LOG_ERROR("sql.sql", "BatteGroundEY: Failed to spawn some object Battleground not created!"); + TC_LOG_ERROR("sql.sql", "BatteGroundEY: Failed to spawn some objects. The battleground was not created."); return false; } @@ -515,21 +515,21 @@ bool BattlegroundEY::SetupBattleground() || !AddObject(BG_EY_OBJECT_SPEEDBUFF_FEL_REAVER + i * 3 + 1, Buff_Entries[1], at->x, at->y, at->z, 0.907571f, 0, 0, 0.438371f, 0.898794f, RESPAWN_ONE_DAY) || !AddObject(BG_EY_OBJECT_SPEEDBUFF_FEL_REAVER + i * 3 + 2, Buff_Entries[2], at->x, at->y, at->z, 0.907571f, 0, 0, 0.438371f, 0.898794f, RESPAWN_ONE_DAY) ) - TC_LOG_ERROR("bg.battleground", "BattlegroundEY: Cannot spawn buff"); + TC_LOG_ERROR("bg.battleground", "BattlegroundEY: Could not spawn Speedbuff Fel Reaver."); } WorldSafeLocsEntry const* sg = NULL; sg = sWorldSafeLocsStore.LookupEntry(EY_GRAVEYARD_MAIN_ALLIANCE); if (!sg || !AddSpiritGuide(EY_SPIRIT_MAIN_ALLIANCE, sg->x, sg->y, sg->z, 3.124139f, TEAM_ALLIANCE)) { - TC_LOG_ERROR("sql.sql", "BatteGroundEY: Failed to spawn spirit guide! Battleground not created!"); + TC_LOG_ERROR("sql.sql", "BatteGroundEY: Failed to spawn spirit guide. The battleground was not created."); return false; } sg = sWorldSafeLocsStore.LookupEntry(EY_GRAVEYARD_MAIN_HORDE); if (!sg || !AddSpiritGuide(EY_SPIRIT_MAIN_HORDE, sg->x, sg->y, sg->z, 3.193953f, TEAM_HORDE)) { - TC_LOG_ERROR("sql.sql", "BatteGroundEY: Failed to spawn spirit guide! Battleground not created!"); + TC_LOG_ERROR("sql.sql", "BatteGroundEY: Failed to spawn spirit guide. The battleground was not created."); return false; } @@ -595,7 +595,7 @@ void BattlegroundEY::RespawnFlagAfterDrop() if (obj) obj->Delete(); else - TC_LOG_ERROR("bg.battleground", "BattlegroundEY: Unknown dropped flag (%s)", GetDroppedFlagGUID().ToString().c_str()); + TC_LOG_ERROR("bg.battleground", "BattlegroundEY: Unknown dropped flag (%s).", GetDroppedFlagGUID().ToString().c_str()); SetDroppedFlagGUID(ObjectGuid::Empty); } @@ -767,7 +767,7 @@ void BattlegroundEY::EventTeamCapturedPoint(Player* player, uint32 Point) WorldSafeLocsEntry const* sg = NULL; sg = sWorldSafeLocsStore.LookupEntry(m_CapturingPointTypes[Point].GraveYardId); if (!sg || !AddSpiritGuide(Point, sg->x, sg->y, sg->z, 3.124139f, GetTeamIndexByTeamId(Team))) - TC_LOG_ERROR("bg.battleground", "BatteGroundEY: Failed to spawn spirit guide! point: %u, team: %u, graveyard_id: %u", + TC_LOG_ERROR("bg.battleground", "BatteGroundEY: Failed to spawn spirit guide. point: %u, team: %u, graveyard_id: %u", Point, Team, m_CapturingPointTypes[Point].GraveYardId); // SpawnBGCreature(Point, RESPAWN_IMMEDIATELY); @@ -917,7 +917,7 @@ WorldSafeLocsEntry const* BattlegroundEY::GetClosestGraveYard(Player* player) if (!entry) { - TC_LOG_ERROR("bg.battleground", "BattlegroundEY: Not found the main team graveyard. Graveyard system isn't working!"); + TC_LOG_ERROR("bg.battleground", "BattlegroundEY: The main team graveyard could not be found. The graveyard system will not be operational!"); return NULL; } @@ -934,7 +934,7 @@ WorldSafeLocsEntry const* BattlegroundEY::GetClosestGraveYard(Player* player) { entry = sWorldSafeLocsStore.LookupEntry(m_CapturingPointTypes[i].GraveYardId); if (!entry) - TC_LOG_ERROR("bg.battleground", "BattlegroundEY: Not found graveyard: %u", m_CapturingPointTypes[i].GraveYardId); + TC_LOG_ERROR("bg.battleground", "BattlegroundEY: Graveyard %u could not be found.", m_CapturingPointTypes[i].GraveYardId); else { distance = (entry->x - plr_x)*(entry->x - plr_x) + (entry->y - plr_y)*(entry->y - plr_y) + (entry->z - plr_z)*(entry->z - plr_z); diff --git a/src/server/game/CMakeLists.txt b/src/server/game/CMakeLists.txt index aae5b4874d8..4d41fbc32eb 100644 --- a/src/server/game/CMakeLists.txt +++ b/src/server/game/CMakeLists.txt @@ -108,6 +108,7 @@ include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/Addons ${CMAKE_CURRENT_SOURCE_DIR}/AI ${CMAKE_CURRENT_SOURCE_DIR}/AI/CoreAI + ${CMAKE_CURRENT_SOURCE_DIR}/AI/PlayerAI ${CMAKE_CURRENT_SOURCE_DIR}/AI/ScriptedAI ${CMAKE_CURRENT_SOURCE_DIR}/AI/SmartScripts ${CMAKE_CURRENT_SOURCE_DIR}/AuctionHouse diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp index 011b68a2bb3..aa0f6ce09fc 100644 --- a/src/server/game/Chat/Chat.cpp +++ b/src/server/game/Chat/Chat.cpp @@ -296,11 +296,11 @@ bool ChatHandler::ExecuteCommandInTable(std::vector<ChatCommand> const& table, c uint32 areaId = player->GetAreaId(); std::string areaName = "Unknown"; std::string zoneName = "Unknown"; - if (AreaTableEntry const* area = GetAreaEntryByAreaID(areaId)) + if (AreaTableEntry const* area = sAreaTableStore.LookupEntry(areaId)) { int locale = GetSessionDbcLocale(); areaName = area->area_name[locale]; - if (AreaTableEntry const* zone = GetAreaEntryByAreaID(area->zone)) + if (AreaTableEntry const* zone = sAreaTableStore.LookupEntry(area->zone)) zoneName = zone->area_name[locale]; } @@ -360,7 +360,7 @@ bool ChatHandler::SetDataForCommandInTable(std::vector<ChatCommand>& table, char // expected subcommand by full name DB content else if (*text) { - TC_LOG_ERROR("sql.sql", "Table `command` have unexpected subcommand '%s' in command '%s', skip.", text, fullcommand.c_str()); + TC_LOG_ERROR("sql.sql", "Table `command` contains an unexpected subcommand '%s' in command '%s', skipped.", text, fullcommand.c_str()); return false; } @@ -376,9 +376,9 @@ bool ChatHandler::SetDataForCommandInTable(std::vector<ChatCommand>& table, char if (!cmd.empty()) { if (&table == &getCommandTable()) - TC_LOG_ERROR("sql.sql", "Table `command` have not existed command '%s', skip.", cmd.c_str()); + TC_LOG_ERROR("sql.sql", "Table `command` contains a non-existing command '%s', skipped.", cmd.c_str()); else - TC_LOG_ERROR("sql.sql", "Table `command` have not existed subcommand '%s' in command '%s', skip.", cmd.c_str(), fullcommand.c_str()); + TC_LOG_ERROR("sql.sql", "Table `command` contains a non-existing subcommand '%s' in command '%s', skipped.", cmd.c_str(), fullcommand.c_str()); } return false; @@ -486,7 +486,7 @@ bool ChatHandler::ShowHelpForSubCommands(std::vector<ChatCommand> const& table, std::string list; for (uint32 i = 0; i < table.size(); ++i) { - // must be available (ignore handler existence for show command with possible available subcommands) + // must be available (ignore handler existence to show command with possible available subcommands) if (!isAvailable(table[i])) continue; @@ -525,7 +525,7 @@ bool ChatHandler::ShowHelpForCommand(std::vector<ChatCommand> const& table, cons { for (uint32 i = 0; i < table.size(); ++i) { - // must be available (ignore handler existence for show command with possible available subcommands) + // must be available (ignore handler existence to show command with possible available subcommands) if (!isAvailable(table[i])) continue; @@ -555,7 +555,7 @@ bool ChatHandler::ShowHelpForCommand(std::vector<ChatCommand> const& table, cons { for (uint32 i = 0; i < table.size(); ++i) { - // must be available (ignore handler existence for show command with possible available subcommands) + // must be available (ignore handler existence to show command with possible available subcommands) if (!isAvailable(table[i])) continue; @@ -1100,7 +1100,7 @@ bool ChatHandler::extractPlayerTarget(char* args, Player** player, ObjectGuid* p *player_name = pl ? pl->GetName() : ""; } - // some from req. data must be provided (note: name is empty if player not exist) + // some from req. data must be provided (note: name is empty if player does not exist) if ((!player || !*player) && (!player_guid || !*player_guid) && (!player_name || player_name->empty())) { SendSysMessage(LANG_PLAYER_NOT_FOUND); diff --git a/src/server/game/Combat/ThreatManager.cpp b/src/server/game/Combat/ThreatManager.cpp index 588e7b1a93b..9767d69e2aa 100644 --- a/src/server/game/Combat/ThreatManager.cpp +++ b/src/server/game/Combat/ThreatManager.cpp @@ -335,7 +335,7 @@ HostileReference* ThreatContainer::selectNextVictim(Creature* attacker, HostileR { // current victim is a second choice target, so don't compare threat with it below if (currentRef == currentVictim) - currentVictim = NULL; + currentVictim = nullptr; ++iter; continue; } @@ -437,12 +437,15 @@ void ThreatManager::_addThreat(Unit* victim, float threat) if (!ref) // there was no ref => create a new one { + bool isFirst = iThreatContainer.empty(); // threat has to be 0 here HostileReference* hostileRef = new HostileReference(victim, this, 0); iThreatContainer.addReference(hostileRef); hostileRef->addThreat(threat); // now we add the real threat if (victim->GetTypeId() == TYPEID_PLAYER && victim->ToPlayer()->IsGameMaster()) hostileRef->setOnlineOfflineState(false); // GM is always offline + else if (isFirst) + setCurrentVictim(hostileRef); } } diff --git a/src/server/game/Combat/ThreatManager.h b/src/server/game/Combat/ThreatManager.h index 7d20e99c128..0f4efdbeab9 100644 --- a/src/server/game/Combat/ThreatManager.h +++ b/src/server/game/Combat/ThreatManager.h @@ -169,7 +169,7 @@ class ThreatContainer HostileReference* getMostHated() const { - return iThreatList.empty() ? NULL : iThreatList.front(); + return iThreatList.empty() ? nullptr : iThreatList.front(); } HostileReference* getReferenceByTarget(Unit* victim) const; diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index d5367e919a3..6da83aad1a8 100644 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -55,7 +55,8 @@ char const* const ConditionMgr::StaticSourceTypeData[CONDITION_SOURCE_TYPE_MAX] "SmartScript", "Npc Vendor", "Spell Proc", - "Phase Def" + "Terrain Swap", + "Phase" }; ConditionMgr::ConditionTypeInfo const ConditionMgr::StaticConditionTypeData[CONDITION_MAX] = @@ -100,7 +101,9 @@ ConditionMgr::ConditionTypeInfo const ConditionMgr::StaticConditionTypeData[COND { "Health Value", true, true, false }, { "Health Pct", true, true, false }, { "Realm Achievement", true, false, false }, - { "In Water", false, false, false } + { "In Water", false, false, false }, + { "Terrain Swap", false, false, false }, + { "Sit/stand state", true, true, false } }; // Checks if object meets the condition @@ -432,6 +435,19 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo) const condMeets = unit->IsInWater(); break; } + case CONDITION_STAND_STATE: + { + if (Unit* unit = object->ToUnit()) + { + if (ConditionValue1 == 0) + condMeets = (unit->getStandState() == ConditionValue2); + else if (ConditionValue2 == 0) + condMeets = unit->IsStandState(); + else if (ConditionValue2 == 1) + condMeets = unit->IsSitState(); + } + break; + } default: condMeets = false; break; @@ -602,6 +618,9 @@ uint32 Condition::GetSearcherTypeMaskForCondition() const case CONDITION_IN_WATER: mask |= GRID_MAP_TYPE_MASK_CREATURE | GRID_MAP_TYPE_MASK_PLAYER; break; + case CONDITION_STAND_STATE: + mask |= GRID_MAP_TYPE_MASK_CREATURE | GRID_MAP_TYPE_MASK_PLAYER; + break; default: ASSERT(false && "Condition::GetSearcherTypeMaskForCondition - missing condition handling!"); break; @@ -1633,9 +1652,14 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond) const } break; } - case CONDITION_SOURCE_TYPE_PHASE_DEFINITION: + case CONDITION_SOURCE_TYPE_TERRAIN_SWAP: + { + TC_LOG_ERROR("sql.sql", "CONDITION_SOURCE_TYPE_TERRAIN_SWAP: is only for 6.x branch, skipped"); + return false; + } + case CONDITION_SOURCE_TYPE_PHASE: { - TC_LOG_ERROR("sql.sql", "CONDITION_SOURCE_TYPE_PHASE_DEFINITION:: is only for 4.3.4 branch, skipped"); + TC_LOG_ERROR("sql.sql", "CONDITION_SOURCE_TYPE_PHASE: is only for 6.x branch, skipped"); return false; } case CONDITION_SOURCE_TYPE_GOSSIP_MENU: @@ -1653,7 +1677,7 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) const { if (cond->ConditionType == CONDITION_NONE || cond->ConditionType >= CONDITION_MAX) { - TC_LOG_ERROR("sql.sql", "%s Invalid ConditionType in `condition` table, ignoring.", cond->ToString().c_str()); + TC_LOG_ERROR("sql.sql", "%s Invalid ConditionType in `condition` table, ignoring.", cond->ToString(true).c_str()); return false; } @@ -1708,7 +1732,7 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) const } case CONDITION_ZONEID: { - AreaTableEntry const* areaEntry = GetAreaEntryByAreaID(cond->ConditionValue1); + AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(cond->ConditionValue1); if (!areaEntry) { TC_LOG_ERROR("sql.sql", "%s Area (%u) does not exist, skipped.", cond->ToString(true).c_str(), cond->ConditionValue1); @@ -2090,6 +2114,31 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) const } case CONDITION_IN_WATER: break; + case CONDITION_TERRAIN_SWAP: + TC_LOG_ERROR("sql.sql", "%s is not valid for this branch, skipped.", cond->ToString(true).c_str()); + return false; + case CONDITION_STAND_STATE: + { + bool valid = false; + switch (cond->ConditionValue1) + { + case 0: + valid = cond->ConditionValue2 <= UNIT_STAND_STATE_SUBMERGED; + break; + case 1: + valid = cond->ConditionValue2 <= 1; + break; + default: + valid = false; + break; + } + if (!valid) + { + TC_LOG_ERROR("sql.sql", "%s has non-existing stand state (%u,%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue1, cond->ConditionValue2); + return false; + } + break; + } default: break; } diff --git a/src/server/game/Conditions/ConditionMgr.h b/src/server/game/Conditions/ConditionMgr.h index 35096ae18ff..7dc4592a6a9 100644 --- a/src/server/game/Conditions/ConditionMgr.h +++ b/src/server/game/Conditions/ConditionMgr.h @@ -71,7 +71,9 @@ enum ConditionTypes CONDITION_HP_PCT = 38, // hpPct ComparisonType 0 true if unit's hp matches given pct CONDITION_REALM_ACHIEVEMENT = 39, // achievement_id 0 0 true if realm achievement is complete CONDITION_IN_WATER = 40, // 0 0 0 true if unit in water - CONDITION_MAX = 41 // MAX + CONDITION_TERRAIN_SWAP = 41, // only for 6.x + CONDITION_STAND_STATE = 42, // stateType state 0 true if unit matches specified sitstate (0,x: has exactly state x; 1,0: any standing state; 1,1: any sitting state;) + CONDITION_MAX = 43 // MAX }; /*! Documentation on implementing a new ConditionSourceType: @@ -128,8 +130,9 @@ enum ConditionSourceType CONDITION_SOURCE_TYPE_SMART_EVENT = 22, CONDITION_SOURCE_TYPE_NPC_VENDOR = 23, CONDITION_SOURCE_TYPE_SPELL_PROC = 24, - CONDITION_SOURCE_TYPE_PHASE_DEFINITION = 25, // only 4.3.4 - CONDITION_SOURCE_TYPE_MAX = 26 // MAX + CONDITION_SOURCE_TYPE_TERRAIN_SWAP = 25, // only 6.x + CONDITION_SOURCE_TYPE_PHASE = 26, // only 6.x + CONDITION_SOURCE_TYPE_MAX = 27 // MAX }; enum RelationType diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp index c73350872cc..6c51c71fe7b 100644 --- a/src/server/game/DataStores/DBCStores.cpp +++ b/src/server/game/DataStores/DBCStores.cpp @@ -51,11 +51,9 @@ struct WMOAreaTableTripple typedef std::map<WMOAreaTableTripple, WMOAreaTableEntry const*> WMOAreaInfoByTripple; typedef std::multimap<uint32, CharSectionsEntry const*> CharSectionsMap; -DBCStorage <AreaTableEntry> sAreaStore(AreaTableEntryfmt); +DBCStorage <AreaTableEntry> sAreaTableStore(AreaTableEntryfmt); DBCStorage <AreaGroupEntry> sAreaGroupStore(AreaGroupEntryfmt); DBCStorage <AreaPOIEntry> sAreaPOIStore(AreaPOIEntryfmt); -static AreaFlagByAreaID sAreaFlagByAreaID; -static AreaFlagByMapID sAreaFlagByMapID; // for instances without generated *.map files static WMOAreaInfoByTripple sWMOAreaInfoByTripple; @@ -286,21 +284,7 @@ void LoadDBCStores(const std::string& dataPath) StoreProblemList bad_dbc_files; uint32 availableDbcLocales = 0xFFFFFFFF; - LoadDBC(availableDbcLocales, bad_dbc_files, sAreaStore, dbcPath, "AreaTable.dbc"); - - // must be after sAreaStore loading - for (uint32 i = 0; i < sAreaStore.GetNumRows(); ++i) // areaflag numbered from 0 - { - if (AreaTableEntry const* area = sAreaStore.LookupEntry(i)) - { - // fill AreaId->DBC records - sAreaFlagByAreaID.insert(AreaFlagByAreaID::value_type(uint16(area->ID), area->exploreFlag)); - - // fill MapId->DBC records (skip sub zones and continents) - if (area->zone == 0 && area->mapid != 0 && area->mapid != 1 && area->mapid != 530 && area->mapid != 571) - sAreaFlagByMapID.insert(AreaFlagByMapID::value_type(area->mapid, area->exploreFlag)); - } - } + LoadDBC(availableDbcLocales, bad_dbc_files, sAreaTableStore, dbcPath, "AreaTable.dbc"); LoadDBC(availableDbcLocales, bad_dbc_files, sAchievementStore, dbcPath, "Achievement.dbc", &CustomAchievementfmt, &CustomAchievementIndex); LoadDBC(availableDbcLocales, bad_dbc_files, sAchievementCriteriaStore, dbcPath, "Achievement_Criteria.dbc"); @@ -721,7 +705,7 @@ void LoadDBCStores(const std::string& dataPath) } // Check loaded DBC files proper version - if (!sAreaStore.LookupEntry(3617) || // last area (areaflag) added in 3.3.5a + if (!sAreaTableStore.LookupEntry(4987) || // last area added in 3.3.5a !sCharTitlesStore.LookupEntry(177) || // last char title added in 3.3.5a !sGemPropertiesStore.LookupEntry(1629) || // last added spell in 3.3.5a !sItemStore.LookupEntry(56806) || // last gem property added in 3.3.5a @@ -773,41 +757,13 @@ uint32 GetTalentSpellCost(uint32 spellId) return 0; } -int32 GetAreaFlagByAreaID(uint32 area_id) -{ - AreaFlagByAreaID::iterator i = sAreaFlagByAreaID.find(area_id); - if (i == sAreaFlagByAreaID.end()) - return -1; - - return i->second; -} WMOAreaTableEntry const* GetWMOAreaTableEntryByTripple(int32 rootid, int32 adtid, int32 groupid) { WMOAreaInfoByTripple::iterator i = sWMOAreaInfoByTripple.find(WMOAreaTableTripple(rootid, adtid, groupid)); - if (i == sWMOAreaInfoByTripple.end()) - return NULL; - return i->second; -} - -AreaTableEntry const* GetAreaEntryByAreaID(uint32 area_id) -{ - int32 areaflag = GetAreaFlagByAreaID(area_id); - if (areaflag < 0) + if (i == sWMOAreaInfoByTripple.end()) return NULL; - - return sAreaStore.LookupEntry(areaflag); -} - -AreaTableEntry const* GetAreaEntryByAreaFlagAndMap(uint32 area_flag, uint32 map_id) -{ - if (area_flag) - return sAreaStore.LookupEntry(area_flag); - - if (MapEntry const* mapEntry = sMapStore.LookupEntry(map_id)) - return GetAreaEntryByAreaID(mapEntry->linked_zone); - - return NULL; + return i->second; } char const* GetRaceName(uint8 race, uint8 locale) @@ -822,15 +778,6 @@ char const* GetClassName(uint8 class_, uint8 locale) return classEntry ? classEntry->name[locale] : NULL; } -uint32 GetAreaFlagByMapId(uint32 mapid) -{ - AreaFlagByMapID::iterator i = sAreaFlagByMapID.find(mapid); - if (i == sAreaFlagByMapID.end()) - return 0; - else - return i->second; -} - uint32 GetVirtualMapForMapAndZone(uint32 mapid, uint32 zoneId) { if (mapid != 530 && mapid != 571) // speed for most cases diff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h index 14f59b04e6d..56ee1f618dd 100644 --- a/src/server/game/DataStores/DBCStores.h +++ b/src/server/game/DataStores/DBCStores.h @@ -33,11 +33,6 @@ char* GetPetName(uint32 petfamily, uint32 dbclang); uint32 GetTalentSpellCost(uint32 spellId); TalentSpellPos const* GetTalentSpellPos(uint32 spellId); -int32 GetAreaFlagByAreaID(uint32 area_id); // -1 if not found -AreaTableEntry const* GetAreaEntryByAreaID(uint32 area_id); -AreaTableEntry const* GetAreaEntryByAreaFlagAndMap(uint32 area_flag, uint32 map_id); -uint32 GetAreaFlagByMapId(uint32 mapid); - char const* GetRaceName(uint8 race, uint8 locale); char const* GetClassName(uint8 class_, uint8 locale); @@ -86,7 +81,7 @@ EmotesTextSoundEntry const* FindTextSoundEmoteFor(uint32 emote, uint32 race, uin extern DBCStorage <AchievementEntry> sAchievementStore; extern DBCStorage <AchievementCriteriaEntry> sAchievementCriteriaStore; -extern DBCStorage <AreaTableEntry> sAreaStore;// recommend access using functions +extern DBCStorage <AreaTableEntry> sAreaTableStore; extern DBCStorage <AreaGroupEntry> sAreaGroupStore; extern DBCStorage <AreaPOIEntry> sAreaPOIStore; extern DBCStorage <AreaTriggerEntry> sAreaTriggerStore; diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index 2f4820d0353..b5dc4489148 100644 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -509,7 +509,7 @@ struct AreaTableEntry uint32 ID; // 0 uint32 mapid; // 1 uint32 zone; // 2 if 0 then it's zone, else it's zone id of this area - uint32 exploreFlag; // 3, main index + uint32 exploreFlag; // 3 uint32 flags; // 4, unknown value but 312 for all cities // 5-9 unused int32 area_level; // 10 diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h index 22a01dae9f0..c61ec997bc2 100644 --- a/src/server/game/DataStores/DBCfmt.h +++ b/src/server/game/DataStores/DBCfmt.h @@ -23,7 +23,7 @@ char const Achievementfmt[] = "niixssssssssssssssssxxxxxxxxxxxxxxxxxxiixixxxxxxx const std::string CustomAchievementfmt = "pppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapapaaaaaaaaaaaaaaaaaapp"; const std::string CustomAchievementIndex = "ID"; char const AchievementCriteriafmt[] = "niiiiiiiixxxxxxxxxxxxxxxxxiiiix"; -char const AreaTableEntryfmt[] = "iiinixxxxxissssssssssssssssxiiiiixxx"; +char const AreaTableEntryfmt[] = "niiiixxxxxissssssssssssssssxiiiiixxx"; char const AreaGroupEntryfmt[] = "niiiiiii"; char const AreaPOIEntryfmt[] = "niiiiiiiiiiifffixixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxix"; char const AreaTriggerEntryfmt[] = "niffffffff"; diff --git a/src/server/game/Entities/Corpse/Corpse.cpp b/src/server/game/Entities/Corpse/Corpse.cpp index 8f700cc636f..22bb9bca712 100644 --- a/src/server/game/Entities/Corpse/Corpse.cpp +++ b/src/server/game/Entities/Corpse/Corpse.cpp @@ -147,7 +147,7 @@ bool Corpse::LoadCorpseFromDB(ObjectGuid::LowType guid, Field* fields) SetObjectScale(1.0f); SetUInt32Value(CORPSE_FIELD_DISPLAY_ID, fields[5].GetUInt32()); - _LoadIntoDataField(fields[6].GetCString(), CORPSE_FIELD_ITEM, EQUIPMENT_SLOT_END); + _LoadIntoDataField(fields[6].GetString(), CORPSE_FIELD_ITEM, EQUIPMENT_SLOT_END); SetUInt32Value(CORPSE_FIELD_BYTES_1, fields[7].GetUInt32()); SetUInt32Value(CORPSE_FIELD_BYTES_2, fields[8].GetUInt32()); SetUInt32Value(CORPSE_FIELD_GUILD, fields[9].GetUInt32()); diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 8711cd1a5f5..9562f8424c1 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -578,7 +578,8 @@ void Creature::Update(uint32 diff) IsAIEnabled = true; if (!IsInEvadeMode() && LastCharmerGUID) if (Unit* charmer = ObjectAccessor::GetUnit(*this, LastCharmerGUID)) - i_AI->AttackStart(charmer); + if (CanStartAttack(charmer, true)) + i_AI->AttackStart(charmer); LastCharmerGUID.Clear(); } @@ -2149,6 +2150,11 @@ bool Creature::CanCreatureAttack(Unit const* victim, bool /*force*/) const if (GetMap()->IsDungeon()) return true; + // if the mob is actively being damaged, do not reset due to distance unless it's a world boss + if (!isWorldBoss()) + if (time(NULL) - GetLastDamagedTime() <= MAX_AGGRO_RESET_TIME) + return true; + //Use AttackDistance in distance check if threat radius is lower. This prevents creature bounce in and out of combat every update tick. float dist = std::max(GetAttackDistance(victim), sWorld->getFloatConfig(CONFIG_THREAT_RADIUS)) + m_CombatDistance; diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 49bd854ef2f..0803345f4f0 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -479,7 +479,7 @@ class Creature : public Unit, public GridObject<Creature>, public MapObject bool AIM_Initialize(CreatureAI* ai = NULL); void Motion_Initialize(); - CreatureAI* AI() const { return (CreatureAI*)i_AI; } + CreatureAI* AI() const { return reinterpret_cast<CreatureAI*>(i_AI); } bool SetWalk(bool enable) override; bool SetDisableGravity(bool disable, bool packetOnly = false) override; diff --git a/src/server/game/Entities/Creature/TemporarySummon.cpp b/src/server/game/Entities/Creature/TemporarySummon.cpp index 8bf3a1e2846..12e3af3c290 100644 --- a/src/server/game/Entities/Creature/TemporarySummon.cpp +++ b/src/server/game/Entities/Creature/TemporarySummon.cpp @@ -227,6 +227,11 @@ void TempSummon::InitSummon() } } +void TempSummon::UpdateObjectVisibilityOnCreate() +{ + WorldObject::UpdateObjectVisibility(true); +} + void TempSummon::SetTempSummonType(TempSummonType type) { m_type = type; diff --git a/src/server/game/Entities/Creature/TemporarySummon.h b/src/server/game/Entities/Creature/TemporarySummon.h index 6d058f405a8..b80e7d3e2bc 100644 --- a/src/server/game/Entities/Creature/TemporarySummon.h +++ b/src/server/game/Entities/Creature/TemporarySummon.h @@ -45,6 +45,7 @@ class TempSummon : public Creature void Update(uint32 time) override; virtual void InitStats(uint32 lifetime); virtual void InitSummon(); + void UpdateObjectVisibilityOnCreate() override; virtual void UnSummon(uint32 msTime = 0); void RemoveFromWorld() override; void SetTempSummonType(TempSummonType type); diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index b030f42bef7..1acfeacbf83 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -1399,7 +1399,10 @@ void GameObject::Use(Unit* user) player->SendCinematicStart(info->camera.cinematicId); if (info->camera.eventID) + { GetMap()->ScriptsStart(sEventScripts, info->camera.eventID, player, this); + EventInform(info->camera.eventID, user); + } return; } diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 70fa4714547..773d5a05772 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -447,8 +447,7 @@ bool Item::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid owner_guid, Field* fi need_save = true; } - std::string enchants = fields[6].GetString(); - _LoadIntoDataField(enchants.c_str(), ITEM_FIELD_ENCHANTMENT_1_1, MAX_ENCHANTMENT_SLOT * MAX_ENCHANTMENT_OFFSET); + _LoadIntoDataField(fields[6].GetString(), ITEM_FIELD_ENCHANTMENT_1_1, MAX_ENCHANTMENT_SLOT * MAX_ENCHANTMENT_OFFSET); SetInt32Value(ITEM_FIELD_RANDOM_PROPERTIES_ID, fields[7].GetInt16()); // recalculate suffix factor if (GetItemRandomPropertyId() < 0) diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 4877ff094e1..836a041abc3 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -1878,7 +1878,9 @@ TempSummon* Map::SummonCreature(uint32 entry, Position const& pos, SummonPropert AddToMap(summon->ToCreature()); summon->InitSummon(); - //ObjectAccessor::UpdateObjectVisibility(summon); + // call MoveInLineOfSight for nearby creatures + Trinity::AIRelocationNotifier notifier(*summon); + summon->VisitNearbyObject(GetVisibilityRange(), notifier); return summon; } diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 419044081e3..ba03c16fa1e 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -555,6 +555,11 @@ class WorldObject : public Object, public WorldLocation void DestroyForNearbyPlayers(); virtual void UpdateObjectVisibility(bool forced = true); + virtual void UpdateObjectVisibilityOnCreate() + { + UpdateObjectVisibility(true); + } + void BuildUpdate(UpdateDataMapType&) override; void AddToObjectUpdate() override; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 8ce78f88906..f3d45b005d8 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -213,7 +213,7 @@ void PlayerTaxi::AppendTaximaskTo(ByteBuffer& data, bool all) if (all) { for (uint8 i = 0; i < TaxiMaskSize; ++i) - data << uint32(sTaxiNodesMask[i]); // all existed nodes + data << uint32(sTaxiNodesMask[i]); // all existing nodes } else { @@ -605,7 +605,7 @@ bool Player::Create(ObjectGuid::LowType guidlow, CharacterCreateInfo* createInfo PlayerInfo const* info = sObjectMgr->GetPlayerInfo(createInfo->Race, createInfo->Class); if (!info) { - TC_LOG_ERROR("entities.player", "Player::Create: Possible hacking-attempt: Account %u tried creating a character named '%s' with an invalid race/class pair (%u/%u) - refusing to do so.", + TC_LOG_ERROR("entities.player", "Player::Create: Possible hacking attempt: Account %u tried to create a character named '%s' with an invalid race/class pair (%u/%u) - refusing to do so.", GetSession()->GetAccountId(), m_name.c_str(), createInfo->Race, createInfo->Class); return false; } @@ -618,7 +618,7 @@ bool Player::Create(ObjectGuid::LowType guidlow, CharacterCreateInfo* createInfo ChrClassesEntry const* cEntry = sChrClassesStore.LookupEntry(createInfo->Class); if (!cEntry) { - TC_LOG_ERROR("entities.player", "Player::Create: Possible hacking-attempt: Account %u tried creating a character named '%s' with an invalid character class (%u) - refusing to do so (wrong DBC-files?)", + TC_LOG_ERROR("entities.player", "Player::Create: Possible hacking attempt: Account %u tried to create a character named '%s' with an invalid character class (%u) - refusing to do so (wrong DBC-files?)", GetSession()->GetAccountId(), m_name.c_str(), createInfo->Class); return false; } @@ -633,14 +633,14 @@ bool Player::Create(ObjectGuid::LowType guidlow, CharacterCreateInfo* createInfo if (!IsValidGender(createInfo->Gender)) { - TC_LOG_ERROR("entities.player", "Player::Create: Possible hacking-attempt: Account %u tried creating a character named '%s' with an invalid gender (%u) - refusing to do so", + TC_LOG_ERROR("entities.player", "Player::Create: Possible hacking attempt: Account %u tried to create a character named '%s' with an invalid gender (%u) - refusing to do so", GetSession()->GetAccountId(), m_name.c_str(), createInfo->Gender); return false; } if (!ValidateAppearance(createInfo->Race, createInfo->Class, createInfo->Gender, createInfo->HairStyle, createInfo->HairColor, createInfo->Face, createInfo->FacialHair, createInfo->Skin, true)) { - TC_LOG_ERROR("entities.player", "Player::Create: Possible hacking-attempt: Account %u tried creating a character named '%s' with invalid appearance attributes - refusing to do so", + TC_LOG_ERROR("entities.player", "Player::Create: Possible hacking attempt: Account %u tried to create a character named '%s' with invalid appearance attributes - refusing to do so", GetSession()->GetAccountId(), m_name.c_str()); return false; } @@ -962,9 +962,9 @@ uint32 Player::EnvironmentalDamage(EnviromentalDamage type, uint32 damage) if (!IsAlive()) { - if (type == DAMAGE_FALL) // DealDamage not apply item durability loss at self damage + if (type == DAMAGE_FALL) // DealDamage does not apply item durability loss from self-induced damage. { - TC_LOG_DEBUG("entities.player", "We are fall to death, loosing 10 percents durability"); + TC_LOG_DEBUG("entities.player", "You have died from falling, losing 10 percent total armor durability."); DurabilityLossAll(0.10f, false); // durability lost message WorldPacket data2(SMSG_DURABILITY_DAMAGE_DEATH, 0); @@ -1237,13 +1237,14 @@ void Player::Update(uint32 p_time) UpdateAfkReport(now); - if (IsCharmed()) - if (Unit* charmer = GetCharmer()) - if (charmer->GetTypeId() == TYPEID_UNIT && charmer->IsAlive()) - UpdateCharmedAI(); - - if (GetAI() && IsAIEnabled) + if (IsAIEnabled && GetAI()) GetAI()->UpdateAI(p_time); + else if (NeedChangeAI) + { + UpdateCharmAI(); + NeedChangeAI = false; + IsAIEnabled = (GetAI() != nullptr); + } // Update items that have just a limited lifetime if (now > m_Last_tick) @@ -1551,7 +1552,7 @@ void Player::setDeathState(DeathState s) { if (!cur) { - TC_LOG_ERROR("entities.player", "setDeathState: attempt to kill a dead player %s(%d)", GetName().c_str(), GetGUID().GetCounter()); + TC_LOG_ERROR("entities.player", "setDeathState: Attempted to kill a dead player %s(%d)", GetName().c_str(), GetGUID().GetCounter()); return; } @@ -1824,7 +1825,7 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati // client without expansion support if (GetSession()->Expansion() < mEntry->Expansion()) { - TC_LOG_DEBUG("maps", "Player %s using client without required expansion tried teleport to non accessible map %u", GetName().c_str(), mapid); + TC_LOG_DEBUG("maps", "Player %s using client without required expansion tried teleporting to non accessible map %u", GetName().c_str(), mapid); if (Transport* transport = GetTransport()) { @@ -3164,12 +3165,12 @@ bool Player::AddTalent(uint32 spellId, uint8 spec, bool learning) // do character spell book cleanup (all characters) if (!IsInWorld() && !learning) // spell load case { - TC_LOG_ERROR("spells", "Player::addSpell: Non-existed in SpellStore spell #%u request, deleting for all characters in `character_spell`.", spellId); + TC_LOG_ERROR("spells", "Player::addSpell: Non-existing spell #%u requested from SpellStore. Deleting spell for all characters in `character_spell`.", spellId); DeleteSpellFromAllPlayers(spellId); } else - TC_LOG_ERROR("spells", "Player::addSpell: Non-existed in SpellStore spell #%u request.", spellId); + TC_LOG_ERROR("spells", "Player::addSpell: Non-existing spell #%u requested from SpellStore.", spellId); return false; } @@ -3179,12 +3180,12 @@ bool Player::AddTalent(uint32 spellId, uint8 spec, bool learning) // do character spell book cleanup (all characters) if (!IsInWorld() && !learning) // spell load case { - TC_LOG_ERROR("spells", "Player::addTalent: Broken spell #%u learning not allowed, deleting for all characters in `character_talent`.", spellId); + TC_LOG_ERROR("spells", "Player::addTalent: Broken spell #%u, learning this spell is not allowed. Deleting this spell for all characters in `character_talent`.", spellId); DeleteSpellFromAllPlayers(spellId); } else - TC_LOG_ERROR("spells", "Player::addTalent: Broken spell #%u learning not allowed.", spellId); + TC_LOG_ERROR("spells", "Player::addTalent: Broken spell #%u, learning this spell is not allowed.", spellId); return false; } @@ -3229,12 +3230,12 @@ bool Player::AddSpell(uint32 spellId, bool active, bool learning, bool dependent // do character spell book cleanup (all characters) if (!IsInWorld() && !learning) // spell load case { - TC_LOG_ERROR("spells", "Player::addSpell: Non-existed in SpellStore spell #%u request, deleting for all characters in `character_spell`.", spellId); + TC_LOG_ERROR("spells", "Player::addSpell: Non-existing spell #%u requested from SpellStore. Deleting for all characters in `character_spell`.", spellId); DeleteSpellFromAllPlayers(spellId); } else - TC_LOG_ERROR("spells", "Player::addSpell: Non-existed in SpellStore spell #%u request.", spellId); + TC_LOG_ERROR("spells", "Player::addSpell: Non-existing spell #%u requested from SpellStore.", spellId); return false; } @@ -3244,12 +3245,12 @@ bool Player::AddSpell(uint32 spellId, bool active, bool learning, bool dependent // do character spell book cleanup (all characters) if (!IsInWorld() && !learning) // spell load case { - TC_LOG_ERROR("spells", "Player::addSpell: Broken spell #%u learning not allowed, deleting for all characters in `character_spell`.", spellId); + TC_LOG_ERROR("spells", "Player::addSpell: Broken spell #%u, learning this spell is not allowed. Deleting this spell for all characters in `character_spell`.", spellId); DeleteSpellFromAllPlayers(spellId); } else - TC_LOG_ERROR("spells", "Player::addSpell: Broken spell #%u learning not allowed.", spellId); + TC_LOG_ERROR("spells", "Player::addSpell: Broken spell #%u, learning this spell is not allowed.", spellId); return false; } @@ -3966,7 +3967,7 @@ bool Player::ResetTalents(bool no_cost) for (int8 rank = MAX_TALENT_RANK-1; rank >= 0; --rank) { - // skip non-existant talent ranks + // skip non-existing talent ranks if (talentInfo->RankID[rank] == 0) continue; const SpellInfo* _spellEntry = sSpellMgr->GetSpellInfo(talentInfo->RankID[rank]); @@ -4682,6 +4683,7 @@ void Player::ResurrectPlayer(float restore_percent, bool applySickness) // remove death flag + set aura SetByteValue(UNIT_FIELD_BYTES_1, 3, 0x00); + RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_IS_OUT_OF_BOUNDS); // This must be called always even on Players with race != RACE_NIGHTELF in case of faction change RemoveAurasDueToSpell(20584); // RACE_NIGHTELF speed bonuses @@ -4816,7 +4818,7 @@ void Player::OfflineResurrect(ObjectGuid const& guid, SQLTransaction& trans) Corpse* Player::CreateCorpse() { - // prevent existence 2 corpse for player + // prevent the existence of 2 corpses for one player SpawnCorpseBones(); uint32 _pb, _pb2, _cfb1, _cfb2; @@ -5041,7 +5043,7 @@ uint32 Player::DurabilityRepair(uint16 pos, bool cost, float discountMod, bool g DurabilityCostsEntry const* dcost = sDurabilityCostsStore.LookupEntry(ditemProto->ItemLevel); if (!dcost) { - TC_LOG_ERROR("entities.player.items", "RepairDurability: Wrong item lvl %u", ditemProto->ItemLevel); + TC_LOG_ERROR("entities.player.items", "RepairDurability: Wrong item level %u", ditemProto->ItemLevel); return TotalCost; } @@ -5065,7 +5067,7 @@ uint32 Player::DurabilityRepair(uint16 pos, bool cost, float discountMod, bool g { if (GetGuildId() == 0) { - TC_LOG_DEBUG("entities.player.items", "You are not member of a guild"); + TC_LOG_DEBUG("entities.player.items", "You are not member of a guild."); return TotalCost; } @@ -5080,7 +5082,7 @@ uint32 Player::DurabilityRepair(uint16 pos, bool cost, float discountMod, bool g } else if (!HasEnoughMoney(costs)) { - TC_LOG_DEBUG("entities.player.items", "You do not have enough money"); + TC_LOG_DEBUG("entities.player.items", "You do not have enough money."); return TotalCost; } else @@ -5102,10 +5104,10 @@ void Player::RepopAtGraveyard() // note: this can be called also when the player is alive // for example from WorldSession::HandleMovementOpcodes - AreaTableEntry const* zone = GetAreaEntryByAreaID(GetAreaId()); + AreaTableEntry const* zone = sAreaTableStore.LookupEntry(GetAreaId()); // Such zones are considered unreachable as a ghost and the player must be automatically revived - if ((!IsAlive() && zone && zone->flags & AREA_FLAG_NEED_FLY) || GetTransport() || GetPositionZ() < -500.0f) + if ((!IsAlive() && zone && zone->flags & AREA_FLAG_NEED_FLY) || GetTransport() || GetPositionZ() < GetMap()->GetMinHeight(GetPositionX(), GetPositionY())) { ResurrectPlayer(0.5f); SpawnCorpseBones(); @@ -5142,8 +5144,10 @@ void Player::RepopAtGraveyard() GetSession()->SendPacket(&data); } } - else if (GetPositionZ() < -500.0f) + else if (GetPositionZ() < GetMap()->GetMinHeight(GetPositionX(), GetPositionY())) TeleportTo(m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, GetOrientation()); + + RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_IS_OUT_OF_BOUNDS); } bool Player::CanJoinConstantChannelInZone(ChatChannelsEntry const* channel, AreaTableEntry const* zone) @@ -5188,7 +5192,7 @@ void Player::UpdateLocalChannels(uint32 newZone) if (GetSession()->PlayerLoading() && !IsBeingTeleportedFar()) return; // The client handles it automatically after loading, but not after teleporting - AreaTableEntry const* current_zone = GetAreaEntryByAreaID(newZone); + AreaTableEntry const* current_zone = sAreaTableStore.LookupEntry(newZone); if (!current_zone) return; @@ -5288,7 +5292,7 @@ void Player::HandleBaseModValue(BaseModGroup modGroup, BaseModType modType, floa { if (modGroup >= BASEMOD_END || modType >= MOD_END) { - TC_LOG_ERROR("spells", "ERROR in HandleBaseModValue(): non existed BaseModGroup of wrong BaseModType!"); + TC_LOG_ERROR("spells", "ERROR in HandleBaseModValue(): Non-existing BaseModGroup or wrong BaseModType!"); return; } @@ -5314,7 +5318,7 @@ float Player::GetBaseModValue(BaseModGroup modGroup, BaseModType modType) const { if (modGroup >= BASEMOD_END || modType >= MOD_END) { - TC_LOG_ERROR("spells", "trial to access non existed BaseModGroup or wrong BaseModType!"); + TC_LOG_ERROR("spells", "Attempt to access non-existing BaseModGroup or wrong BaseModType!"); return 0.0f; } @@ -5328,7 +5332,7 @@ float Player::GetTotalBaseModValue(BaseModGroup modGroup) const { if (modGroup >= BASEMOD_END) { - TC_LOG_ERROR("spells", "wrong BaseModGroup in GetTotalBaseModValue()!"); + TC_LOG_ERROR("spells", "Wrong BaseModGroup in GetTotalBaseModValue()!"); return 0.0f; } @@ -6266,20 +6270,20 @@ bool Player::IsActionButtonDataValid(uint8 button, uint32 action, uint8 type) case ACTION_BUTTON_SPELL: if (!sSpellMgr->GetSpellInfo(action)) { - TC_LOG_DEBUG("entities.player", "Spell action %u not added into button %u for player %s (GUID: %u): spell not exist", action, button, GetName().c_str(), GetGUID().GetCounter()); + TC_LOG_DEBUG("entities.player", "Spell action %u not added into button %u for player %s (GUID: %u): spell does not exist", action, button, GetName().c_str(), GetGUID().GetCounter()); return false; } if (!HasSpell(action)) { - TC_LOG_DEBUG("entities.player", "Spell action %u not added into button %u for player %s (GUID: %u): player don't known this spell", action, button, GetName().c_str(), GetGUID().GetCounter()); + TC_LOG_DEBUG("entities.player", "Spell action %u not added into button %u for player %s (GUID: %u): player does not know this spell", action, button, GetName().c_str(), GetGUID().GetCounter()); return false; } break; case ACTION_BUTTON_ITEM: if (!sObjectMgr->GetItemTemplate(action)) { - TC_LOG_DEBUG("entities.player", "Item action %u not added into button %u for player %s (GUID: %u): item not exist", action, button, GetName().c_str(), GetGUID().GetCounter()); + TC_LOG_DEBUG("entities.player", "Item action %u not added into button %u for player %s (GUID: %u): item does not exist", action, button, GetName().c_str(), GetGUID().GetCounter()); return false; } break; @@ -6301,7 +6305,7 @@ ActionButton* Player::addActionButton(uint8 button, uint32 action, uint8 type) if (!IsActionButtonDataValid(button, action, type)) return NULL; - // it create new button (NEW state) if need or return existed + // it create new button (NEW state) if need or return existing ActionButton& ab = m_actionButtons[button]; // set data and update to CHANGED if not NEW @@ -6429,22 +6433,32 @@ void Player::CheckAreaExploreAndOutdoor() return; bool isOutdoor; - uint16 areaFlag = GetBaseMap()->GetAreaFlag(GetPositionX(), GetPositionY(), GetPositionZ(), &isOutdoor); + uint32 areaId = GetBaseMap()->GetAreaId(GetPositionX(), GetPositionY(), GetPositionZ(), &isOutdoor); + AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(areaId); if (sWorld->getBoolConfig(CONFIG_VMAP_INDOOR_CHECK) && !isOutdoor) RemoveAurasWithAttribute(SPELL_ATTR0_OUTDOORS_ONLY); - if (areaFlag == 0xffff) + if (!areaId) return; - int offset = areaFlag / 32; + + if (!areaEntry) + { + TC_LOG_ERROR("entities.player", "Player '%s' (%s) discovered unknown area (x: %f y: %f z: %f map: %u)", + GetName().c_str(), GetGUID().ToString().c_str(), GetPositionX(), GetPositionY(), GetPositionZ(), GetMapId()); + return; + } + + uint32 offset = areaEntry->exploreFlag / 32; if (offset >= PLAYER_EXPLORED_ZONES_SIZE) { - TC_LOG_ERROR("entities.player", "Wrong area flag %u in map data for (X: %f Y: %f) point to field PLAYER_EXPLORED_ZONES_1 + %u ( %u must be < %u ).", areaFlag, GetPositionX(), GetPositionY(), offset, offset, PLAYER_EXPLORED_ZONES_SIZE); + TC_LOG_ERROR("entities.player", "Player::CheckAreaExploreAndOutdoor: Wrong area flag %u in map data for (X: %f Y: %f) point to field PLAYER_EXPLORED_ZONES_1 + %u ( %u must be < %u ).", + areaEntry->exploreFlag, GetPositionX(), GetPositionY(), offset, offset, PLAYER_EXPLORED_ZONES_SIZE); return; } - uint32 val = (uint32)(1 << (areaFlag % 32)); + uint32 val = (uint32)(1 << (areaEntry->exploreFlag % 32)); uint32 currFields = GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset); if (!(currFields & val)) @@ -6453,19 +6467,11 @@ void Player::CheckAreaExploreAndOutdoor() UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA); - AreaTableEntry const* areaEntry = GetAreaEntryByAreaFlagAndMap(areaFlag, GetMapId()); - if (!areaEntry) - { - TC_LOG_ERROR("entities.player", "Player %u discovered unknown area (x: %f y: %f z: %f map: %u", GetGUID().GetCounter(), GetPositionX(), GetPositionY(), GetPositionZ(), GetMapId()); - return; - } - if (areaEntry->area_level > 0) { - uint32 area = areaEntry->ID; if (getLevel() >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)) { - SendExplorationExperience(area, 0); + SendExplorationExperience(areaId, 0); } else { @@ -6489,9 +6495,9 @@ void Player::CheckAreaExploreAndOutdoor() } GiveXP(XP, NULL); - SendExplorationExperience(area, XP); + SendExplorationExperience(areaId, XP); } - TC_LOG_DEBUG("entities.player", "Player %u discovered a new area: %u", GetGUID().GetCounter(), area); + TC_LOG_DEBUG("entities.player", "Player '%s' (%s) discovered a new area: %u", GetName().c_str(),GetGUID().ToString().c_str(), areaId); } } } @@ -7061,7 +7067,7 @@ void Player::UpdateArea(uint32 newArea) // so apply them accordingly m_areaUpdateId = newArea; - AreaTableEntry const* area = GetAreaEntryByAreaID(newArea); + AreaTableEntry const* area = sAreaTableStore.LookupEntry(newArea); pvpInfo.IsInFFAPvPArea = area && (area->flags & AREA_FLAG_ARENA); UpdatePvPState(true); @@ -7109,7 +7115,7 @@ void Player::UpdateZone(uint32 newZone, uint32 newArea) // zone changed, so area changed as well, update it UpdateArea(newArea); - AreaTableEntry const* zone = GetAreaEntryByAreaID(newZone); + AreaTableEntry const* zone = sAreaTableStore.LookupEntry(newZone); if (!zone) return; @@ -7945,7 +7951,7 @@ void Player::CastItemCombatSpell(Unit* target, WeaponAttackType attType, uint32 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellData.SpellId); if (!spellInfo) { - TC_LOG_ERROR("entities.player.items", "WORLD: unknown Item spellid %i", spellData.SpellId); + TC_LOG_ERROR("entities.player.items", "WORLD: Unknown item spellid %i", spellData.SpellId); continue; } @@ -8045,7 +8051,7 @@ void Player::CastItemUseSpell(Item* item, SpellCastTargets const& targets, uint8 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(learn_spell_id); if (!spellInfo) { - TC_LOG_ERROR("entities.player", "Player::CastItemUseSpell: Item (Entry: %u) in have wrong spell id %u, ignoring ", proto->ItemId, learn_spell_id); + TC_LOG_ERROR("entities.player", "Player::CastItemUseSpell: Item (Entry: %u) has wrong spell id %u, ignoring.", proto->ItemId, learn_spell_id); SendEquipError(EQUIP_ERR_NONE, item, NULL); return; } @@ -8074,7 +8080,7 @@ void Player::CastItemUseSpell(Item* item, SpellCastTargets const& targets, uint8 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellData.SpellId); if (!spellInfo) { - TC_LOG_ERROR("entities.player", "Player::CastItemUseSpell: Item (Entry: %u) in have wrong spell id %u, ignoring", proto->ItemId, spellData.SpellId); + TC_LOG_ERROR("entities.player", "Player::CastItemUseSpell: Item (Entry: %u) has wrong spell id %u, ignoring.", proto->ItemId, spellData.SpellId); continue; } @@ -8101,7 +8107,7 @@ void Player::CastItemUseSpell(Item* item, SpellCastTargets const& targets, uint8 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(pEnchant->spellid[s]); if (!spellInfo) { - TC_LOG_ERROR("entities.player", "Player::CastItemUseSpell Enchant %i, cast unknown spell %i", pEnchant->ID, pEnchant->spellid[s]); + TC_LOG_ERROR("entities.player", "Player::CastItemUseSpell Enchant %i casts unknown spell %i.", pEnchant->ID, pEnchant->spellid[s]); continue; } @@ -9357,7 +9363,7 @@ uint32 Player::GetXPRestBonus(uint32 xp) SetRestBonus(GetRestBonus() - rested_bonus); - TC_LOG_DEBUG("entities.player", "GetXPRestBonus: Player %s (%u) gain %u xp (+%u Rested Bonus). Rested points=%f", GetName().c_str(), GetGUID().GetCounter(), xp+rested_bonus, rested_bonus, GetRestBonus()); + TC_LOG_DEBUG("entities.player", "GetXPRestBonus: Player %s (%u) gains %u xp (+%u Rested Bonus). Rested points=%f", GetName().c_str(), GetGUID().GetCounter(), xp+rested_bonus, rested_bonus, GetRestBonus()); return rested_bonus; } @@ -9389,7 +9395,7 @@ void Player::ResetPetTalents() CharmInfo* charmInfo = pet->GetCharmInfo(); if (!charmInfo) { - TC_LOG_ERROR("entities.player", "Object (GUID: %u TypeId: %u) is considered pet-like but doesn't have a charminfo!", pet->GetGUID().GetCounter(), pet->GetTypeId()); + TC_LOG_ERROR("entities.player", "Object (GUID: %u TypeId: %u) is considered pet-like, but doesn't have charm info!", pet->GetGUID().GetCounter(), pet->GetTypeId()); return; } pet->resetTalents(); @@ -10306,7 +10312,7 @@ InventoryResult Player::CanStoreItem_InBag(uint8 bag, ItemPosCountVec &dest, Ite if (bag == skip_bag) return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG; - // skip not existed bag or self targeted bag + // skip non-existing bag or self targeted bag Bag* pBag = GetBagByPos(bag); if (!pBag || pBag == pSrcItem) return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG; @@ -11291,7 +11297,7 @@ InventoryResult Player::CanUnequipItem(uint16 pos, bool swap) const Item* pItem = GetItemByPos(pos); - // Applied only to existed equipped item + // Applied only to existing equipped item if (!pItem) return EQUIP_ERR_OK; @@ -11972,7 +11978,7 @@ Item* Player::EquipItem(uint16 pos, Item* pItem, bool update) SpellInfo const* spellProto = sSpellMgr->GetSpellInfo(cooldownSpell); if (!spellProto) - TC_LOG_ERROR("entities.player", "Weapon switch cooldown spell %u couldn't be found in Spell.dbc", cooldownSpell); + TC_LOG_ERROR("entities.player", "Weapon switch cooldown spell %u could not be found in Spell.dbc", cooldownSpell); else { m_weaponChangeTimer = spellProto->StartRecoveryTime; @@ -12220,7 +12226,7 @@ void Player::MoveItemToInventory(ItemPosCountVec const& dest, Item* pItem, bool // store item Item* pLastItem = StoreItem(dest, pItem, update); - // only set if not merged to existed stack (pItem can be deleted already but we can compare pointers any way) + // only set if not merged to existing stack (pItem can be deleted already but we can compare pointers any way) if (pLastItem == pItem) { // update owner for last item (this can be original item with wrong owner @@ -12666,7 +12672,7 @@ void Player::SplitItem(uint16 src, uint16 dst, uint32 count) return; } - // not let split more existed items (can be only at cheating) + // not let split more existing items (can be only at cheating) if (pSrcItem->GetCount() < count) { SendEquipError(EQUIP_ERR_TRIED_TO_SPLIT_MORE_THAN_COUNT, pSrcItem, NULL); @@ -13962,7 +13968,7 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId /*= 0*/, bool VendorItemData const* vendorItems = creature->GetVendorItems(); if (!vendorItems || vendorItems->Empty()) { - TC_LOG_ERROR("sql.sql", "Creature %s (Entry: %u GUID: %u DB GUID: %u) has UNIT_NPC_FLAG_VENDOR set but has an empty trading item list.", creature->GetName().c_str(), creature->GetEntry(), creature->GetGUID().GetCounter(), creature->GetSpawnId()); + TC_LOG_ERROR("sql.sql", "Creature %s (Entry: %u GUID: %u DB GUID: %u) has UNIT_NPC_FLAG_VENDOR set, but has an empty trading item list.", creature->GetName().c_str(), creature->GetEntry(), creature->GetGUID().GetCounter(), creature->GetSpawnId()); canTalk = false; } break; @@ -13996,7 +14002,7 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId /*= 0*/, bool break; case GOSSIP_OPTION_TRAINER: if (getClass() != creature->GetCreatureTemplate()->trainer_class && creature->GetCreatureTemplate()->trainer_type == TRAINER_TYPE_CLASS) - TC_LOG_ERROR("sql.sql", "GOSSIP_OPTION_TRAINER:: Player %s (GUID: %u) request wrong gossip menu: %u with wrong class: %u at Creature: %s (Entry: %u, Trainer Class: %u)", + TC_LOG_ERROR("sql.sql", "GOSSIP_OPTION_TRAINER:: Player %s (GUID: %u) requested wrong gossip menu: %u with wrong class: %u at Creature: %s (Entry: %u, Trainer Class: %u)", GetName().c_str(), GetGUID().GetCounter(), menu->GetGossipMenu().GetMenuId(), getClass(), creature->GetName().c_str(), creature->GetEntry(), creature->GetCreatureTemplate()->trainer_class); // no break; case GOSSIP_OPTION_GOSSIP: @@ -14012,7 +14018,7 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId /*= 0*/, bool canTalk = false; break; default: - TC_LOG_ERROR("sql.sql", "Creature entry %u has unknown gossip option %u for menu %u", creature->GetEntry(), itr->second.OptionType, itr->second.MenuId); + TC_LOG_ERROR("sql.sql", "Creature entry %u has unknown gossip option %u for menu %u.", creature->GetEntry(), itr->second.OptionType, itr->second.MenuId); canTalk = false; break; } @@ -14053,14 +14059,14 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId /*= 0*/, bool if (!optionBroadcastText) { /// Find localizations from database. - if (GossipMenuItemsLocale const* gossipMenuLocale = sObjectMgr->GetGossipMenuItemsLocale(MAKE_PAIR32(menuId, menuId))) + if (GossipMenuItemsLocale const* gossipMenuLocale = sObjectMgr->GetGossipMenuItemsLocale(MAKE_PAIR32(menuId, itr->second.OptionIndex))) ObjectMgr::GetLocaleString(gossipMenuLocale->OptionText, locale, strOptionText); } if (!boxBroadcastText) { /// Find localizations from database. - if (GossipMenuItemsLocale const* gossipMenuLocale = sObjectMgr->GetGossipMenuItemsLocale(MAKE_PAIR32(menuId, menuId))) + if (GossipMenuItemsLocale const* gossipMenuLocale = sObjectMgr->GetGossipMenuItemsLocale(MAKE_PAIR32(menuId, itr->second.OptionIndex))) ObjectMgr::GetLocaleString(gossipMenuLocale->BoxText, locale, strBoxText); } } @@ -14125,7 +14131,7 @@ void Player::OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 men { if (gossipOptionId > GOSSIP_OPTION_QUESTGIVER) { - TC_LOG_ERROR("entities.player", "Player guid %u request invalid gossip option for GameObject entry %u", GetGUID().GetCounter(), source->GetEntry()); + TC_LOG_ERROR("entities.player", "Player guid %u requested invalid gossip option for GameObject entry %u.", GetGUID().GetCounter(), source->GetEntry()); return; } } @@ -14229,7 +14235,7 @@ void Player::OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 men if (bgTypeId == BATTLEGROUND_TYPE_NONE) { - TC_LOG_ERROR("entities.player", "a user (guid %u) requested battlegroundlist from a npc who is no battlemaster", GetGUID().GetCounter()); + TC_LOG_ERROR("entities.player", "User (guid %u) requested battlegroundlist from an NPC who is not a battlemaster.", GetGUID().GetCounter()); return; } @@ -15188,7 +15194,7 @@ bool Player::SatisfyQuestPreviousQuest(Quest const* qInfo, bool msg) if (msg) { SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - TC_LOG_DEBUG("misc", "SatisfyQuestPreviousQuest: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have required quest (1).", qInfo->GetQuestId()); + TC_LOG_DEBUG("misc", "SatisfyQuestPreviousQuest: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have the required quest(s) (1).", qInfo->GetQuestId()); } return false; } @@ -15221,7 +15227,7 @@ bool Player::SatisfyQuestPreviousQuest(Quest const* qInfo, bool msg) if (msg) { SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - TC_LOG_DEBUG("misc", "SatisfyQuestPreviousQuest: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have required quest (2).", qInfo->GetQuestId()); + TC_LOG_DEBUG("misc", "SatisfyQuestPreviousQuest: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have the required quest(s) (2).", qInfo->GetQuestId()); } return false; @@ -15237,7 +15243,7 @@ bool Player::SatisfyQuestPreviousQuest(Quest const* qInfo, bool msg) if (msg) { SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - TC_LOG_DEBUG("misc", "SatisfyQuestPreviousQuest: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have required quest (3).", qInfo->GetQuestId()); + TC_LOG_DEBUG("misc", "SatisfyQuestPreviousQuest: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have the required quest(s) (3).", qInfo->GetQuestId()); } return false; @@ -15255,7 +15261,7 @@ bool Player::SatisfyQuestClass(Quest const* qInfo, bool msg) const if (msg) { SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - TC_LOG_DEBUG("misc", "SatisfyQuestClass: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have required class.", qInfo->GetQuestId()); + TC_LOG_DEBUG("misc", "SatisfyQuestClass: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player is not (one of) the required class(es).", qInfo->GetQuestId()); } return false; @@ -15274,7 +15280,7 @@ bool Player::SatisfyQuestRace(Quest const* qInfo, bool msg) if (msg) { SendCanTakeQuestResponse(INVALIDREASON_QUEST_FAILED_WRONG_RACE); - TC_LOG_DEBUG("misc", "SatisfyQuestRace: Sent INVALIDREASON_QUEST_FAILED_WRONG_RACE (questId: %u) because player does not have required race.", qInfo->GetQuestId()); + TC_LOG_DEBUG("misc", "SatisfyQuestRace: Sent INVALIDREASON_QUEST_FAILED_WRONG_RACE (questId: %u) because player is not (one of) the required race(s).", qInfo->GetQuestId()); } return false; @@ -15290,7 +15296,7 @@ bool Player::SatisfyQuestReputation(Quest const* qInfo, bool msg) if (msg) { SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - TC_LOG_DEBUG("misc", "SatisfyQuestReputation: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have required reputation (min).", qInfo->GetQuestId()); + TC_LOG_DEBUG("misc", "SatisfyQuestReputation: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have the required reputation (min).", qInfo->GetQuestId()); } return false; } @@ -15301,7 +15307,7 @@ bool Player::SatisfyQuestReputation(Quest const* qInfo, bool msg) if (msg) { SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - TC_LOG_DEBUG("misc", "SatisfyQuestReputation: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have required reputation (max).", qInfo->GetQuestId()); + TC_LOG_DEBUG("misc", "SatisfyQuestReputation: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have the required reputation (max).", qInfo->GetQuestId()); } return false; } @@ -15314,7 +15320,7 @@ bool Player::SatisfyQuestReputation(Quest const* qInfo, bool msg) if (msg) { SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - TC_LOG_DEBUG("misc", "SatisfyQuestReputation: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have required reputation (ReputationObjective2).", qInfo->GetQuestId()); + TC_LOG_DEBUG("misc", "SatisfyQuestReputation: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have the required reputation (ReputationObjective2).", qInfo->GetQuestId()); } return false; } @@ -15343,7 +15349,7 @@ bool Player::SatisfyQuestConditions(Quest const* qInfo, bool msg) if (msg) { SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - TC_LOG_DEBUG("misc", "SatisfyQuestConditions: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not meet conditions.", qInfo->GetQuestId()); + TC_LOG_DEBUG("misc", "SatisfyQuestConditions: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not meet the conditions.", qInfo->GetQuestId()); } TC_LOG_DEBUG("condition", "Player::SatisfyQuestConditions: conditions not met for quest %u", qInfo->GetQuestId()); return false; @@ -15389,7 +15395,7 @@ bool Player::SatisfyQuestExclusiveGroup(Quest const* qInfo, bool msg) if (msg) { SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - TC_LOG_DEBUG("misc", "SatisfyQuestExclusiveGroup: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player already did daily quests in exclusive group.", qInfo->GetQuestId()); + TC_LOG_DEBUG("misc", "SatisfyQuestExclusiveGroup: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player already did all daily quests in exclusive group.", qInfo->GetQuestId()); } return false; @@ -15401,7 +15407,7 @@ bool Player::SatisfyQuestExclusiveGroup(Quest const* qInfo, bool msg) if (msg) { SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - TC_LOG_DEBUG("misc", "SatisfyQuestExclusiveGroup: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player already did quest in exclusive group.", qInfo->GetQuestId()); + TC_LOG_DEBUG("misc", "SatisfyQuestExclusiveGroup: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player has already taken one or more quests in the exclusive group.", qInfo->GetQuestId()); } return false; } @@ -15470,7 +15476,7 @@ bool Player::SatisfyQuestDay(Quest const* qInfo, bool msg) if (qInfo->IsDFQuest()) { - if (!m_DFQuests.empty()) + if (m_DFQuests.find(qInfo->GetQuestId()) != m_DFQuests.end()) return false; return true; @@ -16781,7 +16787,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) { std::string name = "<unknown>"; sObjectMgr->GetPlayerNameByGUID(guid, name); - TC_LOG_ERROR("entities.player", "Player %s %s not found in table `characters`, can't load. ", name.c_str(), guid.ToString().c_str()); + TC_LOG_ERROR("entities.player", "Player %s %s not found in table `characters`, can't load.", name.c_str(), guid.ToString().c_str()); return false; } @@ -16793,7 +16799,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) // player should be able to load/delete character only with correct account! if (dbAccountId != GetSession()->GetAccountId()) { - TC_LOG_ERROR("entities.player", "Player %s loading from wrong account (is: %u, should be: %u)", guid.ToString().c_str(), GetSession()->GetAccountId(), dbAccountId); + TC_LOG_ERROR("entities.player", "Player %s attempts to load from wrong account (current: %u, should be: %u)", guid.ToString().c_str(), GetSession()->GetAccountId(), dbAccountId); return false; } @@ -16825,7 +16831,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) uint8 gender = fields[5].GetUInt8(); if (!IsValidGender(gender)) { - TC_LOG_ERROR("entities.player", "Player %s has wrong gender (%u), can't be loaded.", guid.ToString().c_str(), gender); + TC_LOG_ERROR("entities.player", "Player %s is the wrong gender (%u) and can't be loaded.", guid.ToString().c_str(), gender); return false; } @@ -16840,15 +16846,15 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(), getClass()); if (!info) { - TC_LOG_ERROR("entities.player", "Player %s has wrong race/class (%u/%u), can't be loaded.", guid.ToString().c_str(), getRace(), getClass()); + TC_LOG_ERROR("entities.player", "Player %s has an invalid race/class combination (%u/%u) and can't be loaded.", guid.ToString().c_str(), getRace(), getClass()); return false; } SetUInt32Value(UNIT_FIELD_LEVEL, fields[6].GetUInt8()); SetUInt32Value(PLAYER_XP, fields[7].GetUInt32()); - _LoadIntoDataField(fields[61].GetCString(), PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE); - _LoadIntoDataField(fields[64].GetCString(), PLAYER__FIELD_KNOWN_TITLES, KNOWN_TITLES_SIZE*2); + _LoadIntoDataField(fields[61].GetString(), PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE); + _LoadIntoDataField(fields[64].GetString(), PLAYER__FIELD_KNOWN_TITLES, KNOWN_TITLES_SIZE * 2); SetObjectScale(1.0f); SetFloatValue(UNIT_FIELD_HOVERHEIGHT, 1.0f); @@ -16875,7 +16881,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) GetByteValue(PLAYER_BYTES_2, 0), // facial hair GetByteValue(PLAYER_BYTES, 0))) // skin color { - TC_LOG_ERROR("entities.player", "Player %s has wrong Appearance values (Hair/Skin/Color), can't be loaded.", guid.ToString().c_str()); + TC_LOG_ERROR("entities.player", "Player %s has wrong Appearance values (Hair/Skin/Color) and can't be loaded.", guid.ToString().c_str()); return false; } @@ -16891,7 +16897,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) InitDisplayIds(); - // cleanup inventory related item value fields (its will be filled correctly in _LoadInventory) + // cleanup inventory related item value fields (it will be filled correctly in _LoadInventory) for (uint8 slot = EQUIPMENT_SLOT_START; slot < EQUIPMENT_SLOT_END; ++slot) { SetGuidValue(PLAYER_FIELD_INV_SLOT_HEAD + (slot * 2), ObjectGuid::Empty); @@ -16901,7 +16907,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) m_items[slot] = NULL; } - TC_LOG_DEBUG("entities.player.loading", "Load Basic value of player %s is: ", m_name.c_str()); + TC_LOG_DEBUG("entities.player.loading", "Load Basic values of player %s: ", m_name.c_str()); outDebugValues(); //Need to call it to initialize m_team (m_team can be calculated from race) @@ -16970,7 +16976,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) MapEntry const* mapEntry = sMapStore.LookupEntry(mapId); if (!mapEntry || !IsPositionValid()) { - TC_LOG_ERROR("entities.player", "Player %s have invalid coordinates (MapId: %u X: %f Y: %f Z: %f O: %f). Teleport to default race/class locations.", + TC_LOG_ERROR("entities.player", "Player %s has invalid coordinates (MapId: %u X: %f Y: %f Z: %f O: %f). Teleporting player to default race/class location.", guid.ToString().c_str(), mapId, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation()); RelocateToHomebind(); } @@ -17011,7 +17017,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) //if (mapId == MAPID_INVALID) -- code kept for reference if (int16(mapId) == int16(-1)) // Battleground Entry Point not found (???) { - TC_LOG_ERROR("entities.player", "Player %s was in BG in database, but BG was not found, and entry point was invalid! Teleport to default race/class locations.", + TC_LOG_ERROR("entities.player", "Player %s was in BG in database, but BG was not found and entry point was invalid! Teleporting to default race/class locations.", guid.ToString().c_str()); RelocateToHomebind(); } @@ -17043,7 +17049,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) std::fabs(m_movementInfo.transport.pos.GetPositionY()) > 250.0f || std::fabs(m_movementInfo.transport.pos.GetPositionZ()) > 250.0f) { - TC_LOG_ERROR("entities.player", "Player %s have invalid transport coordinates (X: %f Y: %f Z: %f O: %f). Teleport to bind location.", + TC_LOG_ERROR("entities.player", "Player %s has invalid transport coordinates (X: %f Y: %f Z: %f O: %f). Teleporting player to bind location.", guid.ToString().c_str(), x, y, z, o); m_movementInfo.transport.Reset(); @@ -17060,7 +17066,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) } else { - TC_LOG_ERROR("entities.player", "Player %s have problems with transport guid (%u). Teleport to bind location.", + TC_LOG_ERROR("entities.player", "Player %s has problems with transport guid (%u). Teleporting to bind location.", guid.ToString().c_str(), transLowGUID); RelocateToHomebind(); @@ -17084,14 +17090,14 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) if (uint32 node_id = m_taxi.GetTaxiSource()) nodeEntry = sTaxiNodesStore.LookupEntry(node_id); - if (!nodeEntry) // don't know taxi start node, to homebind + if (!nodeEntry) // don't know taxi start node, teleport to homebind { - TC_LOG_ERROR("entities.player", "Character %u have wrong data in taxi destination list, teleport to homebind.", GetGUID().GetCounter()); + TC_LOG_ERROR("entities.player", "Character %u has wrong data in taxi destination list. Teleporting player to homebind.", GetGUID().GetCounter()); RelocateToHomebind(); } - else // have start node, to it + else // has start node, teleport to it { - TC_LOG_ERROR("entities.player", "Character %u have too short taxi destination list, teleport to original node.", GetGUID().GetCounter()); + TC_LOG_ERROR("entities.player", "Character %u has too short taxi destination list. Teleporting player to original node.", GetGUID().GetCounter()); mapId = nodeEntry->map_id; Relocate(nodeEntry->x, nodeEntry->y, nodeEntry->z, 0.0f); } @@ -17120,7 +17126,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) { if (GetSession()->Expansion() < mapEntry->Expansion()) { - TC_LOG_DEBUG("entities.player.loading", "Player %s using client without required expansion tried login at non accessible map %u", GetName().c_str(), mapId); + TC_LOG_DEBUG("entities.player.loading", "Player %s is using client without required expansion, tried to log in to inaccessible map %u.", GetName().c_str(), mapId); RelocateToHomebind(); } @@ -17250,7 +17256,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) m_stableSlots = fields[32].GetUInt8(); if (m_stableSlots > MAX_PET_STABLES) { - TC_LOG_ERROR("entities.player", "Player can have not more %u stable slots, but have in DB %u", MAX_PET_STABLES, uint32(m_stableSlots)); + TC_LOG_ERROR("entities.player", "Player can not have more than %u stable slots, but has %u in DB.", MAX_PET_STABLES, uint32(m_stableSlots)); m_stableSlots = MAX_PET_STABLES; } @@ -17258,7 +17264,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) if (HasAtLoginFlag(AT_LOGIN_RENAME)) { - TC_LOG_ERROR("entities.player", "Player (GUID: %u) tried to login while forced to rename, can't load.'", GetGUID().GetCounter()); + TC_LOG_ERROR("entities.player", "Player (GUID: %u) tried to login while forced to rename, could not load player.", GetGUID().GetCounter()); return false; } @@ -17545,9 +17551,9 @@ void Player::_LoadActions(PreparedQueryResult result) ab->uState = ACTIONBUTTON_UNCHANGED; else { - TC_LOG_ERROR("entities.player", " ...at loading, and will deleted in DB also"); + TC_LOG_ERROR("entities.player", " ...at loading, and will also be deleted in DB."); - // Will deleted in DB at next save (it can create data until save but marked as deleted) + // Will be deleted in DB at next save (it can create data until save but marked as deleted). m_actionButtons[button].uState = ACTIONBUTTON_DELETED; } } while (result->NextRow()); @@ -17556,7 +17562,7 @@ void Player::_LoadActions(PreparedQueryResult result) void Player::_LoadAuras(PreparedQueryResult result, uint32 timediff) { - TC_LOG_DEBUG("entities.player.loading", "Loading auras for player %u", GetGUID().GetCounter()); + TC_LOG_DEBUG("entities.player.loading", "Loading auras for player %u.", GetGUID().GetCounter()); /* 0 1 2 3 4 5 6 7 8 9 10 QueryResult* result = CharacterDatabase.PQuery("SELECT casterGuid, spell, effectMask, recalculateMask, stackCount, amount0, amount1, amount2, base_amount0, base_amount1, base_amount2, @@ -17589,7 +17595,7 @@ void Player::_LoadAuras(PreparedQueryResult result, uint32 timediff) SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellid); if (!spellInfo) { - TC_LOG_ERROR("entities.player", "Unknown aura (spellid %u), ignore.", spellid); + TC_LOG_ERROR("entities.player", "Unknown aura (spellid %u), ignored.", spellid); continue; } @@ -17623,7 +17629,7 @@ void Player::_LoadAuras(PreparedQueryResult result, uint32 timediff) aura->SetLoadedState(maxduration, remaintime, remaincharges, stackcount, recalculatemask, &damage[0]); aura->ApplyForTargets(); - TC_LOG_DEBUG("entities.player", "Added aura spellid %u, effectmask %u", spellInfo->Id, effmask); + TC_LOG_DEBUG("entities.player", "Added aura spellid %u, effectmask %u.", spellInfo->Id, effmask); } } while (result->NextRow()); @@ -17649,10 +17655,10 @@ void Player::_LoadGlyphAuras() TC_LOG_ERROR("entities.player", "Player %s has glyph with typeflags %u in slot with typeflags %u, removing.", m_name.c_str(), gp->TypeFlags, gs->TypeFlags); } else - TC_LOG_ERROR("entities.player", "Player %s has not existing glyph slot entry %u on index %u", m_name.c_str(), GetGlyphSlot(i), i); + TC_LOG_ERROR("entities.player", "Player %s has non-existing glyph slot entry %u on index %u.", m_name.c_str(), GetGlyphSlot(i), i); } else - TC_LOG_ERROR("entities.player", "Player %s has not existing glyph entry %u on index %u", m_name.c_str(), glyph, i); + TC_LOG_ERROR("entities.player", "Player %s has non-existing glyph entry %u on index %u.", m_name.c_str(), glyph, i); // On any error remove glyph SetGlyph(i, 0); @@ -17782,7 +17788,7 @@ void Player::_LoadInventory(PreparedQueryResult result, uint32 timeDiff) item->SetState(ITEM_UNCHANGED, this); else { - TC_LOG_ERROR("entities.player", "Player::_LoadInventory: player (GUID: %u, name: '%s') has item (GUID: %u, entry: %u) which can't be loaded into inventory (Bag GUID: %u, slot: %u) by reason %u. Item will be sent by mail.", + TC_LOG_ERROR("entities.player", "Player::_LoadInventory: player (GUID: %u, name: '%s') has item (GUID: %u, entry: %u) which can't be loaded into inventory (Bag GUID: %u, slot: %u) for reason %u. Item will be sent by mail.", GetGUID().GetCounter(), GetName().c_str(), item->GetGUID().GetCounter(), item->GetEntry(), bagGuid, slot, err); item->DeleteFromInventoryDB(trans); problematicItems.push_back(item); @@ -17915,7 +17921,7 @@ Item* Player::_LoadItem(SQLTransaction& trans, uint32 zoneId, uint32 timeDiff, F } else { - TC_LOG_ERROR("entities.player", "Player::_LoadInventory: player (GUID: %u, name: '%s') has broken item (GUID: %u, entry: %u) in inventory. Deleting item.", + TC_LOG_ERROR("entities.player", "Player::_LoadInventory: player (GUID: %u, name: '%s') has a broken item (GUID: %u, entry: %u) in inventory. Deleting item.", GetGUID().GetCounter(), GetName().c_str(), itemGuid, itemEntry); remove = true; } @@ -17930,7 +17936,7 @@ Item* Player::_LoadItem(SQLTransaction& trans, uint32 zoneId, uint32 timeDiff, F } else { - TC_LOG_ERROR("entities.player", "Player::_LoadInventory: player (GUID: %u, name: '%s') has unknown item (entry: %u) in inventory. Deleting item.", + TC_LOG_ERROR("entities.player", "Player::_LoadInventory: player (GUID: %u, name: '%s') has an unknown item (entry: %u) in inventory. Deleting item.", GetGUID().GetCounter(), GetName().c_str(), itemEntry); Item::DeleteFromInventoryDB(trans, itemGuid); Item::DeleteFromDB(trans, itemGuid); @@ -17961,7 +17967,7 @@ void Player::_LoadMailedItems(Mail* mail) if (!proto) { - TC_LOG_ERROR("entities.player", "Player %u has unknown item_template (ProtoType) in mailed items(GUID: %u template: %u) in mail (%u), deleted.", GetGUID().GetCounter(), itemGuid, itemTemplate, mail->messageID); + TC_LOG_ERROR("entities.player", "Player %u has an unknown item_template (ProtoType) in mailed items(GUID: %u template: %u) in mail (%u), deleted.", GetGUID().GetCounter(), itemGuid, itemTemplate, mail->messageID); stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_INVALID_MAIL_ITEM); stmt->setUInt32(0, itemGuid); @@ -17977,7 +17983,7 @@ void Player::_LoadMailedItems(Mail* mail) if (!item->LoadFromDB(itemGuid, ObjectGuid(HighGuid::Player, fields[13].GetUInt32()), fields, itemTemplate)) { - TC_LOG_ERROR("entities.player", "Player::_LoadMailedItems - Item in mail (%u) doesn't exist !!!! - item guid: %u, deleted from mail", mail->messageID, itemGuid); + TC_LOG_ERROR("entities.player", "Player::_LoadMailedItems - Item in mail (%u) doesn't exist!!! - item guid: %u, deleted from mail.", mail->messageID, itemGuid); stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM); stmt->setUInt32(0, itemGuid); @@ -18040,7 +18046,7 @@ void Player::_LoadMail() if (m->mailTemplateId && !sMailTemplateStore.LookupEntry(m->mailTemplateId)) { - TC_LOG_ERROR("entities.player", "Player::_LoadMail - Mail (%u) have not existed MailTemplateId (%u), remove at load", m->messageID, m->mailTemplateId); + TC_LOG_ERROR("entities.player", "Player::_LoadMail - Mail (%u) contains a non-existing MailTemplateId (%u), removing at load.", m->messageID, m->mailTemplateId); m->mailTemplateId = 0; } @@ -18221,7 +18227,7 @@ void Player::_LoadDailyQuestStatus(PreparedQueryResult result) if (quest_daily_idx >= PLAYER_MAX_DAILY_QUESTS) // max amount with exist data in query { - TC_LOG_ERROR("entities.player", "Player (GUID: %u) have more 25 daily quest records in `charcter_queststatus_daily`", GetGUID().GetCounter()); + TC_LOG_ERROR("entities.player", "Player (GUID: %u) has more than 25 daily quest records in `charcter_queststatus_daily`", GetGUID().GetCounter()); break; } @@ -18370,8 +18376,9 @@ void Player::_LoadBoundInstances(PreparedQueryResult result) uint32 mapId = fields[2].GetUInt16(); uint32 instanceId = fields[0].GetUInt32(); uint8 difficulty = fields[3].GetUInt8(); + BindExtensionState extendState = BindExtensionState(fields[4].GetUInt8()); - time_t resetTime = time_t(fields[4].GetUInt32()); + time_t resetTime = time_t(fields[5].GetUInt32()); // the resettime for normal instances is only saved when the InstanceSave is unloaded // so the value read from the DB may be wrong here but only if the InstanceSave is loaded // and in that case it is not used @@ -18383,12 +18390,12 @@ void Player::_LoadBoundInstances(PreparedQueryResult result) if (!mapEntry || !mapEntry->IsDungeon()) { - TC_LOG_ERROR("entities.player", "_LoadBoundInstances: player %s(%d) has bind to not existed or not dungeon map %d (%s)", GetName().c_str(), GetGUID().GetCounter(), mapId, mapname.c_str()); + TC_LOG_ERROR("entities.player", "_LoadBoundInstances: player %s(%d) has bind to a non-existing or non-dungeon map %d (%s).", GetName().c_str(), GetGUID().GetCounter(), mapId, mapname.c_str()); deleteInstance = true; } else if (difficulty >= MAX_DIFFICULTY) { - TC_LOG_ERROR("entities.player", "_LoadBoundInstances: player %s(%d) has bind to not existed difficulty %d instance for map %u (%s)", GetName().c_str(), GetGUID().GetCounter(), difficulty, mapId, mapname.c_str()); + TC_LOG_ERROR("entities.player", "_LoadBoundInstances: player %s(%d) has a bind to a non-existing difficulty %d instance for map %u (%s)", GetName().c_str(), GetGUID().GetCounter(), difficulty, mapId, mapname.c_str()); deleteInstance = true; } else @@ -18396,12 +18403,12 @@ void Player::_LoadBoundInstances(PreparedQueryResult result) MapDifficulty const* mapDiff = GetMapDifficultyData(mapId, Difficulty(difficulty)); if (!mapDiff) { - TC_LOG_ERROR("entities.player", "_LoadBoundInstances: player %s(%d) has bind to not existed difficulty %d instance for map %u (%s)", GetName().c_str(), GetGUID().GetCounter(), difficulty, mapId, mapname.c_str()); + TC_LOG_ERROR("entities.player", "_LoadBoundInstances: player %s(%d) has a bind to a non-existing difficulty %d instance for map %u (%s).", GetName().c_str(), GetGUID().GetCounter(), difficulty, mapId, mapname.c_str()); deleteInstance = true; } else if (!perm && group) { - TC_LOG_ERROR("entities.player", "_LoadBoundInstances: player %s(%d) is in group %d but has a non-permanent character bind to map %d (%s), %d, %d", GetName().c_str(), GetGUID().GetCounter(), group->GetLowGUID(), mapId, mapname.c_str(), instanceId, difficulty); + TC_LOG_ERROR("entities.player", "_LoadBoundInstances: player %s(%d) is in group %d, but has a non-permanent character bind to map %d (%s), %d, %d.", GetName().c_str(), GetGUID().GetCounter(), group->GetLowGUID(), mapId, mapname.c_str(), instanceId, difficulty); deleteInstance = true; } } @@ -18420,13 +18427,13 @@ void Player::_LoadBoundInstances(PreparedQueryResult result) // since non permanent binds are always solo bind, they can always be reset if (InstanceSave* save = sInstanceSaveMgr->AddInstanceSave(mapId, instanceId, Difficulty(difficulty), resetTime, !perm, true)) - BindToInstance(save, perm, true); + BindToInstance(save, perm, extendState, true); } while (result->NextRow()); } } -InstancePlayerBind* Player::GetBoundInstance(uint32 mapid, Difficulty difficulty) +InstancePlayerBind* Player::GetBoundInstance(uint32 mapid, Difficulty difficulty, bool withExpired) { // some instances only have one difficulty MapDifficulty const* mapDiff = GetDownscaledMapDifficultyData(mapid, difficulty); @@ -18435,9 +18442,9 @@ InstancePlayerBind* Player::GetBoundInstance(uint32 mapid, Difficulty difficulty BoundInstancesMap::iterator itr = m_boundInstances[difficulty].find(mapid); if (itr != m_boundInstances[difficulty].end()) - return &itr->second; - else - return NULL; + if (itr->second.extendState || withExpired) + return &itr->second; + return nullptr; } InstanceSave* Player::GetInstanceSave(uint32 mapid, bool raid) @@ -18480,24 +18487,32 @@ void Player::UnbindInstance(BoundInstancesMap::iterator &itr, Difficulty difficu } } -InstancePlayerBind* Player::BindToInstance(InstanceSave* save, bool permanent, bool load) +InstancePlayerBind* Player::BindToInstance(InstanceSave* save, bool permanent, BindExtensionState extendState, bool load) { if (save) { InstancePlayerBind& bind = m_boundInstances[save->GetDifficulty()][save->GetMapId()]; + if (extendState == EXTEND_STATE_KEEP) // special flag, keep the player's current extend state when updating for new boss down + { + if (save == bind.save) + extendState = bind.extendState; + else + extendState = EXTEND_STATE_NORMAL; + } if (!load) { if (bind.save) { // update the save when the group kills a boss - if (permanent != bind.perm || save != bind.save) + if (permanent != bind.perm || save != bind.save || extendState != bind.extendState) { PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_INSTANCE); stmt->setUInt32(0, save->GetInstanceId()); stmt->setBool(1, permanent); - stmt->setUInt32(2, GetGUID().GetCounter()); - stmt->setUInt32(3, bind.save->GetInstanceId()); + stmt->setUInt8(2, extendState); + stmt->setUInt32(3, GetGUID().GetCounter()); + stmt->setUInt32(4, bind.save->GetInstanceId()); CharacterDatabase.Execute(stmt); } @@ -18509,6 +18524,7 @@ InstancePlayerBind* Player::BindToInstance(InstanceSave* save, bool permanent, b stmt->setUInt32(0, GetGUID().GetCounter()); stmt->setUInt32(1, save->GetInstanceId()); stmt->setBool(2, permanent); + stmt->setUInt8(3, extendState); CharacterDatabase.Execute(stmt); } @@ -18526,9 +18542,10 @@ InstancePlayerBind* Player::BindToInstance(InstanceSave* save, bool permanent, b bind.save = save; bind.perm = permanent; + bind.extendState = extendState; if (!load) TC_LOG_DEBUG("maps", "Player::BindToInstance: %s(%d) is now bound to map %d, instance %d, difficulty %d", GetName().c_str(), GetGUID().GetCounter(), save->GetMapId(), save->GetInstanceId(), save->GetDifficulty()); - sScriptMgr->OnPlayerBindToInstance(this, save->GetDifficulty(), save->GetMapId(), permanent); + sScriptMgr->OnPlayerBindToInstance(this, save->GetDifficulty(), save->GetMapId(), permanent, uint8(extendState)); return &bind; } @@ -18546,7 +18563,7 @@ void Player::BindToInstance() GetSession()->SendPacket(&data); if (!IsGameMaster()) { - BindToInstance(mapSave, true); + BindToInstance(mapSave, true, EXTEND_STATE_KEEP); GetSession()->SendCalendarRaidLockout(mapSave, true); } } @@ -18572,15 +18589,19 @@ void Player::SendRaidInfo() { for (BoundInstancesMap::iterator itr = m_boundInstances[i].begin(); itr != m_boundInstances[i].end(); ++itr) { - if (itr->second.perm) - { - InstanceSave* save = itr->second.save; - data << uint32(save->GetMapId()); // map id - data << uint32(save->GetDifficulty()); // difficulty - data << uint64(save->GetInstanceId()); // instance id - data << uint8(1); // expired = 0 - data << uint8(0); // extended = 1 - data << uint32(save->GetResetTime() - now); // reset time + InstancePlayerBind const& bind = itr->second; + if (bind.perm) + { + InstanceSave* save = bind.save; + data << uint32(save->GetMapId()); // map id + data << uint32(save->GetDifficulty()); // difficulty + data << uint64(save->GetInstanceId()); // instance id + data << uint8(bind.extendState != EXTEND_STATE_EXPIRED); // expired = 0 + data << uint8(bind.extendState == EXTEND_STATE_EXTENDED); // extended = 1 + time_t nextReset = save->GetResetTime(); + if (bind.extendState == EXTEND_STATE_EXTENDED) + nextReset = sInstanceSaveMgr->GetSubsequentResetTime(save->GetMapId(), save->GetDifficulty(), save->GetResetTime()); + data << uint32(nextReset - now); // reset time ++counter; } } @@ -19298,7 +19319,7 @@ void Player::_SaveInventory(SQLTransaction& trans) } else { - TC_LOG_ERROR("entities.player", "Can't find %s but is in refundable storage for player %u ! Removing.", itr->ToString().c_str(), GetGUID().GetCounter()); + TC_LOG_ERROR("entities.player", "Can't find %s, but is in refundable storage for player %u ! Removing.", itr->ToString().c_str(), GetGUID().GetCounter()); m_refundableItems.erase(itr); } } @@ -19347,7 +19368,7 @@ void Player::_SaveInventory(SQLTransaction& trans) { TC_LOG_ERROR("entities.player", "Player(GUID: %u Name: %s)::_SaveInventory - the bag(%u) and slot(%u) values for the item with guid %u are incorrect, the item with guid %u is there instead!", lowGuid, GetName().c_str(), item->GetBagSlot(), item->GetSlot(), item->GetGUID().GetCounter(), test->GetGUID().GetCounter()); // save all changes to the item... - if (item->GetState() != ITEM_NEW) // only for existing items, no dupes + if (item->GetState() != ITEM_NEW) // only for existing items, no duplicates item->SaveToDB(trans); // ...but do not save position in invntory continue; @@ -20106,8 +20127,8 @@ Pet* Player::GetPet() const if (IsInWorld() && pet) return pet; - //there may be a guardian in slot - //TC_LOG_ERROR("entities.player", "Player::GetPet: Pet %u not exist.", GUID_LOPART(pet_guid)); + // there may be a guardian in this slot + //TC_LOG_ERROR("entities.player", "Player::GetPet: Pet %u does not exist.", GUID_LOPART(pet_guid)); //const_cast<Player*>(this)->SetPetGUID(0); } @@ -20215,7 +20236,7 @@ void Player::StopCastingCharm() if (GetCharmGUID()) { - TC_LOG_FATAL("entities.player", "Player %s (%s) is not able to uncharm unit (%s)", GetName().c_str(), GetGUID().ToString().c_str(), GetCharmGUID().ToString().c_str()); + TC_LOG_FATAL("entities.player", "Player %s (%s) is not able to uncharm unit (%s)!", GetName().c_str(), GetGUID().ToString().c_str(), GetCharmGUID().ToString().c_str()); if (charm->GetCharmerGUID()) { TC_LOG_FATAL("entities.player", "Charmed unit has charmer %s", charm->GetCharmerGUID().ToString().c_str()); @@ -21320,7 +21341,7 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uin ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(crItem->ExtendedCost); if (!iece) { - TC_LOG_ERROR("entities.player", "Item %u have wrong ExtendedCost field value %u", pProto->ItemId, crItem->ExtendedCost); + TC_LOG_ERROR("entities.player", "Item %u has wrong ExtendedCost field value %u", pProto->ItemId, crItem->ExtendedCost); return false; } @@ -21363,7 +21384,7 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uin uint32 maxCount = MAX_MONEY_AMOUNT / pProto->BuyPrice; if ((uint32)count > maxCount) { - TC_LOG_ERROR("entities.player", "Player %s tried to buy %u item id %u, causing overflow", GetName().c_str(), (uint32)count, pProto->ItemId); + TC_LOG_ERROR("entities.player", "Player %s tried to buy %u item id %u, causing overflow.", GetName().c_str(), (uint32)count, pProto->ItemId); count = (uint8)maxCount; } price = pProto->BuyPrice * count; //it should not exceed MAX_MONEY_AMOUNT @@ -21457,7 +21478,7 @@ void Player::UpdateHomebindTime(uint32 time) data << uint32(m_HomebindTimer); data << uint32(1); GetSession()->SendPacket(&data); - TC_LOG_DEBUG("maps", "PLAYER: Player '%s' (GUID: %u) will be teleported to homebind in 60 seconds", GetName().c_str(), GetGUID().GetCounter()); + TC_LOG_DEBUG("maps", "PLAYER: Player '%s' (GUID: %u) will be teleported to homebind in 60 seconds.", GetName().c_str(), GetGUID().GetCounter()); } } @@ -21527,7 +21548,7 @@ void Player::UpdatePotionCooldown(Spell* spell) // Call not from spell cast, send cooldown event for item spells if no in combat if (!spell) { - // spell/item pair let set proper cooldown (except not existed charged spell cooldown spellmods for potions) + // spell/item pair let set proper cooldown (except non-existing charged spell cooldown spellmods for potions) if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(m_lastPotionId)) for (uint8 idx = 0; idx < MAX_ITEM_PROTO_SPELLS; ++idx) if (proto->Spells[idx].SpellId && proto->Spells[idx].SpellTrigger == ITEM_SPELLTRIGGER_ON_USE) @@ -23222,7 +23243,7 @@ bool Player::HasItemFitToSpellRequirements(SpellInfo const* spellInfo, Item cons break; } default: - TC_LOG_ERROR("entities.player", "HasItemFitToSpellRequirements: Not handled spell requirement for item class %u", spellInfo->EquippedItemClass); + TC_LOG_ERROR("entities.player", "HasItemFitToSpellRequirements: Spell requirement not handled for item class %u", spellInfo->EquippedItemClass); break; } @@ -23874,7 +23895,7 @@ void Player::SetViewpoint(WorldObject* target, bool apply) { if (apply) { - TC_LOG_DEBUG("maps", "Player::CreateViewpoint: Player %s create seer %u (TypeId: %u).", GetName().c_str(), target->GetEntry(), target->GetTypeId()); + TC_LOG_DEBUG("maps", "Player::CreateViewpoint: Player %s created seer %u (TypeId: %u).", GetName().c_str(), target->GetEntry(), target->GetTypeId()); if (!AddGuidValue(PLAYER_FARSIGHT, target->GetGUID())) { @@ -23890,7 +23911,7 @@ void Player::SetViewpoint(WorldObject* target, bool apply) } else { - TC_LOG_DEBUG("maps", "Player::CreateViewpoint: Player %s remove seer", GetName().c_str()); + TC_LOG_DEBUG("maps", "Player::CreateViewpoint: Player %s removed seer", GetName().c_str()); if (!RemoveGuidValue(PLAYER_FARSIGHT, target->GetGUID())) { @@ -24109,38 +24130,6 @@ bool Player::isTotalImmunity() return false; } -void Player::UpdateCharmedAI() -{ - //This should only called in Player::Update - Creature* charmer = GetCharmer()->ToCreature(); - - //kill self if charm aura has infinite duration - if (charmer->IsInEvadeMode()) - { - AuraEffectList const& auras = GetAuraEffectsByType(SPELL_AURA_MOD_CHARM); - for (AuraEffectList::const_iterator iter = auras.begin(); iter != auras.end(); ++iter) - if ((*iter)->GetCasterGUID() == charmer->GetGUID() && (*iter)->GetBase()->IsPermanent()) - { - charmer->DealDamage(this, GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); - return; - } - } - - if (!charmer->IsInCombat()) - GetMotionMaster()->MoveFollow(charmer, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); - - Unit* target = GetVictim(); - if (!target || !charmer->IsValidAttackTarget(target)) - { - target = charmer->SelectNearestTarget(); - if (!target) - return; - - GetMotionMaster()->MoveChase(target); - Attack(target, true); - } -} - uint32 Player::GetRuneBaseCooldown(uint8 index) { uint8 rune = GetBaseRune(index); @@ -24471,7 +24460,7 @@ void Player::_LoadSkills(PreparedQueryResult result) if (value == 0) { - TC_LOG_ERROR("entities.player", "Character %u has skill %u with value 0. Will be deleted.", GetGUID().GetCounter(), skill); + TC_LOG_ERROR("entities.player", "Character %u has skill %u with value 0. Skill will be deleted.", GetGUID().GetCounter(), skill); PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_SKILL); @@ -24808,7 +24797,7 @@ void Player::LearnTalent(uint32 talentId, uint32 talentRank) uint32 spellid = talentInfo->RankID[talentRank]; if (spellid == 0) { - TC_LOG_ERROR("entities.player", "Talent.dbc have for talent: %u Rank: %u spell id = 0", talentId, talentRank); + TC_LOG_ERROR("entities.player", "Talent.dbc contains talent: %u Rank: %u spell id = 0", talentId, talentRank); return; } @@ -24945,7 +24934,7 @@ void Player::LearnPetTalent(ObjectGuid petGuid, uint32 talentId, uint32 talentRa uint32 spellid = talentInfo->RankID[talentRank]; if (spellid == 0) { - TC_LOG_ERROR("entities.player", "Talent.dbc have for talent: %u Rank: %u spell id = 0", talentId, talentRank); + TC_LOG_ERROR("entities.player", "Talent.dbc contains talent: %u Rank: %u spell id = 0", talentId, talentRank); return; } @@ -25272,7 +25261,7 @@ void Player::SetEquipmentSet(uint32 index, EquipmentSet eqset) if (!found) // something wrong... { - TC_LOG_ERROR("entities.player", "Player %s tried to save equipment set " UI64FMTD " (index %u), but that equipment set not found!", GetName().c_str(), eqset.Guid, index); + TC_LOG_ERROR("entities.player", "Player %s tried to save equipment set " UI64FMTD " (index %u), but that equipment set was not found!", GetName().c_str(), eqset.Guid, index); return; } } @@ -25615,7 +25604,7 @@ void Player::ActivateSpec(uint8 spec) for (int8 rank = MAX_TALENT_RANK-1; rank >= 0; --rank) { - // skip non-existant talent ranks + // skip non-existing talent ranks if (talentInfo->RankID[rank] == 0) continue; RemoveSpell(talentInfo->RankID[rank], true); // removes the talent, and all dependant, learned, and chained spells.. @@ -25659,7 +25648,7 @@ void Player::ActivateSpec(uint8 spec) // learn highest talent rank that exists in newly activated spec for (int8 rank = MAX_TALENT_RANK-1; rank >= 0; --rank) { - // skip non-existant talent ranks + // skip non-existing talent ranks if (talentInfo->RankID[rank] == 0) continue; // if the talent can be found in the newly activated PlayerTalentMap @@ -26154,11 +26143,11 @@ std::string Player::GetMapAreaAndZoneString() uint32 areaId = GetAreaId(); std::string areaName = "Unknown"; std::string zoneName = "Unknown"; - if (AreaTableEntry const* area = GetAreaEntryByAreaID(areaId)) + if (AreaTableEntry const* area = sAreaTableStore.LookupEntry(areaId)) { int locale = GetSession()->GetSessionDbcLocale(); areaName = area->area_name[locale]; - if (AreaTableEntry const* zone = GetAreaEntryByAreaID(area->zone)) + if (AreaTableEntry const* zone = sAreaTableStore.LookupEntry(area->zone)) zoneName = zone->area_name[locale]; } @@ -26215,7 +26204,7 @@ Pet* Player::SummonPet(uint32 entry, float x, float y, float z, float ang, PetTy pet->Relocate(x, y, z, ang); if (!pet->IsPositionValid()) { - TC_LOG_ERROR("misc", "Pet (guidlow %d, entry %d) not summoned. Suggested coordinates isn't valid (X: %f Y: %f)", pet->GetGUID().GetCounter(), pet->GetEntry(), pet->GetPositionX(), pet->GetPositionY()); + TC_LOG_ERROR("misc", "Pet (guidlow %d, entry %d) not summoned. Suggested coordinates are not valid (X: %f Y: %f)", pet->GetGUID().GetCounter(), pet->GetEntry(), pet->GetPositionX(), pet->GetPositionY()); delete pet; return NULL; } @@ -26224,7 +26213,7 @@ Pet* Player::SummonPet(uint32 entry, float x, float y, float z, float ang, PetTy uint32 pet_number = sObjectMgr->GeneratePetNumber(); if (!pet->Create(map->GenerateLowGuid<HighGuid::Pet>(), map, GetPhaseMask(), entry, pet_number)) { - TC_LOG_ERROR("misc", "no such creature entry %u", entry); + TC_LOG_ERROR("misc", "No such creature entry %u", entry); delete pet; return NULL; } diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 9b64023698c..0d6d21c6b28 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -54,6 +54,7 @@ class PlayerMenu; class PlayerSocial; class SpellCastTargets; class UpdateMask; +class PlayerAI; struct CharacterCustomizeInfo; @@ -834,14 +835,27 @@ enum PlayerDelayedOperations // Maximum money amount : 2^31 - 1 extern uint32 const MAX_MONEY_AMOUNT; +enum BindExtensionState +{ + EXTEND_STATE_EXPIRED = 0, + EXTEND_STATE_NORMAL = 1, + EXTEND_STATE_EXTENDED = 2, + EXTEND_STATE_KEEP = 255 // special state: keep current save type +}; struct InstancePlayerBind { InstanceSave* save; - bool perm; /* permanent PlayerInstanceBinds are created in Raid/Heroic instances for players - that aren't already permanently bound when they are inside when a boss is killed - or when they enter an instance that the group leader is permanently bound to. */ - InstancePlayerBind() : save(NULL), perm(false) { } + that aren't already permanently bound when they are inside when a boss is killed + or when they enter an instance that the group leader is permanently bound to. */ + bool perm; + /* extend state listing: + EXPIRED - doesn't affect anything unless manually re-extended by player + NORMAL - standard state + EXTENDED - won't be promoted to EXPIRED at next reset period, will instead be promoted to NORMAL */ + BindExtensionState extendState; + + InstancePlayerBind() : save(NULL), perm(false), extendState(EXTEND_STATE_NORMAL) { } }; struct AccessRequirement @@ -1009,6 +1023,8 @@ class Player : public Unit, public GridObject<Player> explicit Player(WorldSession* session); ~Player(); + PlayerAI* AI() const { return reinterpret_cast<PlayerAI*>(i_AI); } + void CleanupsBeforeDelete(bool finalCleanup = true) override; void AddToWorld() override; @@ -2115,12 +2131,12 @@ class Player : public Unit, public GridObject<Player> bool m_InstanceValid; // permanent binds and solo binds by difficulty BoundInstancesMap m_boundInstances[MAX_DIFFICULTY]; - InstancePlayerBind* GetBoundInstance(uint32 mapid, Difficulty difficulty); + InstancePlayerBind* GetBoundInstance(uint32 mapid, Difficulty difficulty, bool withExpired = false); BoundInstancesMap& GetBoundInstances(Difficulty difficulty) { return m_boundInstances[difficulty]; } InstanceSave* GetInstanceSave(uint32 mapid, bool raid); void UnbindInstance(uint32 mapid, Difficulty difficulty, bool unload = false); void UnbindInstance(BoundInstancesMap::iterator &itr, Difficulty difficulty, bool unload = false); - InstancePlayerBind* BindToInstance(InstanceSave* save, bool permanent, bool load = false); + InstancePlayerBind* BindToInstance(InstanceSave* save, bool permanent, BindExtensionState extendState = EXTEND_STATE_NORMAL, bool load = false); void BindToInstance(); void SetPendingBind(uint32 instanceId, uint32 bindTimer); bool HasPendingBind() const { return _pendingBindId > 0; } @@ -2520,8 +2536,6 @@ class Player : public Unit, public GridObject<Player> MapReference m_mapRef; - void UpdateCharmedAI(); - uint32 m_lastFallTime; float m_lastFallZ; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 3aed5fde7b3..b6272b81693 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -45,6 +45,7 @@ #include "PetAI.h" #include "Pet.h" #include "Player.h" +#include "PlayerAI.h" #include "QuestDef.h" #include "ReputationMgr.h" #include "SpellAuraEffects.h" @@ -3748,6 +3749,77 @@ void Unit::RemoveAura(Aura* aura, AuraRemoveMode mode) RemoveAura(aurApp, mode); } +void Unit::RemoveAppliedAuras(std::function<bool(AuraApplication const*)> const& check) +{ + for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();) + { + if (check(iter->second)) + { + RemoveAura(iter); + continue; + } + ++iter; + } +} + +void Unit::RemoveOwnedAuras(std::function<bool(Aura const*)> const& check) +{ + for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();) + { + if (check(iter->second)) + { + RemoveOwnedAura(iter); + continue; + } + ++iter; + } +} + +void Unit::RemoveAppliedAuras(uint32 spellId, std::function<bool(AuraApplication const*)> const& check) +{ + for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);) + { + if (check(iter->second)) + { + RemoveAura(iter); + continue; + } + ++iter; + } +} + +void Unit::RemoveOwnedAuras(uint32 spellId, std::function<bool(Aura const*)> const& check) +{ + for (AuraMap::iterator iter = m_ownedAuras.lower_bound(spellId); iter != m_ownedAuras.upper_bound(spellId);) + { + if (check(iter->second)) + { + RemoveOwnedAura(iter); + continue; + } + ++iter; + } +} + +void Unit::RemoveAurasByType(AuraType auraType, std::function<bool(AuraApplication const*)> const& check) +{ + for (AuraEffectList::iterator iter = m_modAuras[auraType].begin(); iter != m_modAuras[auraType].end();) + { + Aura* aura = (*iter)->GetBase(); + AuraApplication * aurApp = aura->GetApplicationOfTarget(GetGUID()); + ASSERT(aurApp); + + ++iter; + if (check(aurApp)) + { + uint32 removedAuras = m_removedAurasCount; + RemoveAura(aurApp); + if (m_removedAurasCount > removedAuras + 1) + iter = m_modAuras[auraType].begin(); + } + } +} + void Unit::RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID, uint8 reqEffMask, AuraRemoveMode removeMode) { for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);) @@ -4355,13 +4427,10 @@ void Unit::GetDispellableAuraList(Unit* caster, uint32 dispelMask, DispelCharges if (aura->GetSpellInfo()->GetDispelMask() & dispelMask) { - if (aura->GetSpellInfo()->Dispel == DISPEL_MAGIC) - { - // do not remove positive auras if friendly target - // negative auras if non-friendly target - if (aurApp->IsPositive() == IsFriendlyTo(caster)) - continue; - } + // do not remove positive auras if friendly target + // negative auras if non-friendly target + if (aurApp->IsPositive() == IsFriendlyTo(caster)) + continue; // The charges / stack amounts don't count towards the total number of auras that can be dispelled. // Ie: A dispel on a target with 5 stacks of Winters Chill and a Polymorph has 1 / (1 + 1) -> 50% chance to dispell @@ -8328,8 +8397,6 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg case 52914: case 52915: case 52910: - // Honor Among Thieves - case 52916: { target = triggeredByAura->GetBase()->GetCaster(); if (!target) @@ -8985,10 +9052,10 @@ bool Unit::Attack(Unit* victim, bool meleeAttack) if (GetTypeId() == TYPEID_UNIT && !IsPet()) { // should not let player enter combat by right clicking target - doesn't helps + AddThreat(victim, 0.0f); SetInCombatWith(victim); if (victim->GetTypeId() == TYPEID_PLAYER) victim->SetInCombatWith(this); - AddThreat(victim, 0.0f); ToCreature()->SendAIReaction(AI_REACTION_HOSTILE); ToCreature()->CallAssistance(); @@ -9232,7 +9299,7 @@ Unit* Unit::GetCharmer() const if (ObjectGuid charmerGUID = GetCharmerGUID()) return ObjectAccessor::GetUnit(*this, charmerGUID); - return NULL; + return nullptr; } Player* Unit::GetCharmerOrOwnerPlayerOrPlayerItself() const @@ -12346,7 +12413,7 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced) if (Creature* creature = ToCreature()) { uint32 immuneMask = creature->GetCreatureTemplate()->MechanicImmuneMask; - if (immuneMask & (1 << MECHANIC_SNARE) || immuneMask & (1 << MECHANIC_DAZE)) + if (immuneMask & (1 << (MECHANIC_SNARE - 1)) || immuneMask & (1 << (MECHANIC_DAZE - 1))) break; } @@ -12750,7 +12817,7 @@ Unit* Creature::SelectVictim() } } else - return NULL; + return nullptr; if (target && _IsTargetAcceptable(target) && CanCreatureAttack(target)) { @@ -12759,14 +12826,6 @@ Unit* Creature::SelectVictim() return target; } - // Case where mob is being kited. - // Mob may not be in range to attack or may have dropped target. In any case, - // don't evade if damage received within the last 10 seconds - // Does not apply to world bosses to prevent kiting to cities - if (!isWorldBoss() && !GetInstanceId()) - if (time(NULL) - GetLastDamagedTime() <= MAX_AGGRO_RESET_TIME) - return target; - // last case when creature must not go to evade mode: // it in combat but attacker not make any damage and not enter to aggro radius to have record in threat list // for example at owner command to pet attack some far away creature @@ -12775,12 +12834,12 @@ Unit* Creature::SelectVictim() { if ((*itr) && !CanCreatureAttack(*itr) && (*itr)->GetTypeId() != TYPEID_PLAYER && !(*itr)->ToCreature()->HasUnitTypeMask(UNIT_MASK_CONTROLABLE_GUARDIAN)) - return NULL; + return nullptr; } /// @todo a vehicle may eat some mob, so mob should not evade if (GetVehicle()) - return NULL; + return nullptr; // search nearby enemy before enter evade mode if (HasReactState(REACT_AGGRESSIVE)) @@ -12798,17 +12857,17 @@ Unit* Creature::SelectVictim() { if ((*itr)->GetBase()->IsPermanent()) { - AI()->EnterEvadeMode(); + AI()->EnterEvadeMode(CreatureAI::EVADE_REASON_OTHER); break; } } - return NULL; + return nullptr; } // enter in evade mode in other case AI()->EnterEvadeMode(CreatureAI::EVADE_REASON_NO_HOSTILES); - return NULL; + return nullptr; } //====================================================================== @@ -13665,28 +13724,76 @@ void Unit::CleanupsBeforeDelete(bool finalCleanup) void Unit::UpdateCharmAI() { - if (GetTypeId() == TYPEID_PLAYER) - return; - - if (i_disabledAI) // disabled AI must be primary AI + switch (GetTypeId()) { - if (!IsCharmed()) - { - delete i_AI; - i_AI = i_disabledAI; - i_disabledAI = NULL; - } - } - else - { - if (IsCharmed()) + case TYPEID_UNIT: + if (i_disabledAI) // disabled AI must be primary AI + { + if (!IsCharmed()) + { + delete i_AI; + i_AI = i_disabledAI; + i_disabledAI = nullptr; + } + } + else + { + if (IsCharmed()) + { + i_disabledAI = i_AI; + if (isPossessed() || IsVehicle()) + i_AI = new PossessedAI(ToCreature()); + else + i_AI = new PetAI(ToCreature()); + } + } + break; + case TYPEID_PLAYER: { - i_disabledAI = i_AI; - if (isPossessed() || IsVehicle()) - i_AI = new PossessedAI(ToCreature()); + if (IsCharmed()) // if we are currently being charmed, then we should apply charm AI + { + i_disabledAI = i_AI; + + UnitAI* newAI = nullptr; + // first, we check if the creature's own AI specifies an override playerai for its owned players + if (Unit* charmer = GetCharmer()) + { + if (Creature* creatureCharmer = charmer->ToCreature()) + { + if (PlayerAI* charmAI = creatureCharmer->IsAIEnabled ? creatureCharmer->AI()->GetAIForCharmedPlayer(ToPlayer()) : nullptr) + newAI = charmAI; + } + else + { + TC_LOG_ERROR("misc", "Attempt to assign charm AI to player %s who is charmed by non-creature %s.", GetGUID().ToString().c_str(), GetCharmerGUID().ToString().c_str()); + } + } + if (!newAI) // otherwise, we default to the generic one + newAI = new SimpleCharmedPlayerAI(ToPlayer()); + i_AI = newAI; + } else - i_AI = new PetAI(ToCreature()); + { + if (i_AI) + { + // we allow the charmed PlayerAI to clean up + i_AI->OnCharmed(false); + // then delete it + delete i_AI; + } + else + { + TC_LOG_ERROR("misc", "Attempt to remove charm AI from player %s who doesn't currently have charm AI.", GetGUID().ToString().c_str()); + } + // and restore our previous PlayerAI (if we had one) + i_AI = i_disabledAI; + i_disabledAI = nullptr; + // IsAIEnabled gets handled in the caller + } + break; } + default: + TC_LOG_ERROR("misc", "Attempt to update charm AI for unit %s, which is neither player nor creature.", GetGUID().ToString().c_str()); } } @@ -15915,11 +16022,17 @@ bool Unit::SetCharmedBy(Unit* charmer, CharmType type, AuraApplication const* au ToCreature()->AI()->OnCharmed(true); GetMotionMaster()->MoveIdle(); } - else + else if (Player* player = ToPlayer()) { - Player* player = ToPlayer(); if (player->isAFK()) player->ToggleAFK(); + + if (charmer->GetTypeId() == TYPEID_UNIT) // we are charmed by a creature + { + // change AI to charmed AI on next Update tick + NeedChangeAI = true; + IsAIEnabled = false; + } player->SetClientControl(this, false); } @@ -16077,7 +16190,14 @@ void Unit::RemoveCharmedBy(Unit* charmer) } if (Player* player = ToPlayer()) + { + if (charmer->GetTypeId() == TYPEID_UNIT) // charmed by a creature, this means we had PlayerAI + { + NeedChangeAI = true; + IsAIEnabled = false; + } player->SetClientControl(this, true); + } // a guardian should always have charminfo if (playerCharmer && this != charmer->GetFirstControlled()) @@ -16869,12 +16989,12 @@ void Unit::JumpTo(float speedXY, float speedZ, bool forward) } } -void Unit::JumpTo(WorldObject* obj, float speedZ) +void Unit::JumpTo(WorldObject* obj, float speedZ, bool withOrientation) { float x, y, z; obj->GetContactPoint(this, x, y, z); float speedXY = GetExactDist2d(x, y) * 10.0f / speedZ; - GetMotionMaster()->MoveJump(x, y, z, speedXY, speedZ); + GetMotionMaster()->MoveJump(x, y, z, GetAngle(obj), speedXY, speedZ, EVENT_JUMP, withOrientation); } bool Unit::HandleSpellClick(Unit* clicker, int8 seatId) diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 8572c791d67..19fd4089168 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1567,7 +1567,7 @@ class Unit : public WorldObject void KnockbackFrom(float x, float y, float speedXY, float speedZ); void JumpTo(float speedXY, float speedZ, bool forward = true); - void JumpTo(WorldObject* obj, float speedZ); + void JumpTo(WorldObject* obj, float speedZ, bool withOrientation = false); void MonsterMoveWithSpeed(float x, float y, float z, float speed, bool generatePath = false, bool forceDestination = false); //void SetFacing(float ori, WorldObject* obj = NULL); @@ -1704,6 +1704,16 @@ class Unit : public WorldObject void RemoveAura(AuraApplication * aurApp, AuraRemoveMode mode = AURA_REMOVE_BY_DEFAULT); void RemoveAura(Aura* aur, AuraRemoveMode mode = AURA_REMOVE_BY_DEFAULT); + // Convenience methods removing auras by predicate + void RemoveAppliedAuras(std::function<bool(AuraApplication const*)> const& check); + void RemoveOwnedAuras(std::function<bool(Aura const*)> const& check); + + // Optimized overloads taking advantage of map key + void RemoveAppliedAuras(uint32 spellId, std::function<bool(AuraApplication const*)> const& check); + void RemoveOwnedAuras(uint32 spellId, std::function<bool(Aura const*)> const& check); + + void RemoveAurasByType(AuraType auraType, std::function<bool(AuraApplication const*)> const& check); + void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID = ObjectGuid::Empty, uint8 reqEffMask = 0, AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT); void RemoveAuraFromStack(uint32 spellId, ObjectGuid casterGUID = ObjectGuid::Empty, AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT); void RemoveAurasDueToSpellByDispel(uint32 spellId, uint32 dispellerSpellId, ObjectGuid casterGUID, Unit* dispeller, uint8 chargesRemoved = 1); diff --git a/src/server/game/Events/GameEventMgr.cpp b/src/server/game/Events/GameEventMgr.cpp index b2871786034..79584c6261e 100644 --- a/src/server/game/Events/GameEventMgr.cpp +++ b/src/server/game/Events/GameEventMgr.cpp @@ -221,7 +221,7 @@ void GameEventMgr::LoadFromDB() uint8 event_id = fields[0].GetUInt8(); if (event_id == 0) { - TC_LOG_ERROR("sql.sql", "`game_event` game event entry 0 is reserved and can't be used."); + TC_LOG_ERROR("sql.sql", "`game_event`: game event entry 0 is reserved and can't be used."); continue; } @@ -240,7 +240,7 @@ void GameEventMgr::LoadFromDB() if (pGameEvent.length == 0 && pGameEvent.state == GAMEEVENT_NORMAL) // length>0 is validity check { - TC_LOG_ERROR("sql.sql", "`game_event` game event id (%i) isn't a world event and has length = 0, thus it can't be used.", event_id); + TC_LOG_ERROR("sql.sql", "`game_event`: game event id (%i) is not a world event and has length = 0, thus cannot be used.", event_id); continue; } @@ -248,7 +248,7 @@ void GameEventMgr::LoadFromDB() { if (!sHolidaysStore.LookupEntry(pGameEvent.holiday_id)) { - TC_LOG_ERROR("sql.sql", "`game_event` game event id (%i) have not existed holiday id %u.", event_id, pGameEvent.holiday_id); + TC_LOG_ERROR("sql.sql", "`game_event`: game event id (%i) contains nonexisting holiday id %u.", event_id, pGameEvent.holiday_id); pGameEvent.holiday_id = HOLIDAY_NONE; } } @@ -259,7 +259,7 @@ void GameEventMgr::LoadFromDB() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u game events in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u game events in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } @@ -283,7 +283,7 @@ void GameEventMgr::LoadFromDB() if (event_id >= mGameEvent.size()) { - TC_LOG_ERROR("sql.sql", "`game_event_save` game event entry (%i) is out of range compared to max event entry in `game_event`", event_id); + TC_LOG_ERROR("sql.sql", "`game_event_save`: game event entry (%i) is out of range compared to max event entry in `game_event`.", event_id); continue; } @@ -294,7 +294,7 @@ void GameEventMgr::LoadFromDB() } else { - TC_LOG_ERROR("sql.sql", "game_event_save includes event save for non-worldevent id %u", event_id); + TC_LOG_ERROR("sql.sql", "game_event_save includes event save for non-worldevent id %u.", event_id); continue; } @@ -302,7 +302,7 @@ void GameEventMgr::LoadFromDB() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u game event saves in game events in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u game event saves in game events in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } } @@ -326,7 +326,7 @@ void GameEventMgr::LoadFromDB() if (event_id >= mGameEvent.size()) { - TC_LOG_ERROR("sql.sql", "`game_event_prerequisite` game event id (%i) is out of range compared to max event id in `game_event`", event_id); + TC_LOG_ERROR("sql.sql", "`game_event_prerequisite`: game event id (%i) is out of range compared to max event id in `game_event`.", event_id); continue; } @@ -335,14 +335,14 @@ void GameEventMgr::LoadFromDB() uint16 prerequisite_event = fields[1].GetUInt32(); if (prerequisite_event >= mGameEvent.size()) { - TC_LOG_ERROR("sql.sql", "`game_event_prerequisite` game event prerequisite id (%i) is out of range compared to max event id in `game_event`", prerequisite_event); + TC_LOG_ERROR("sql.sql", "`game_event_prerequisite`: game event prerequisite id (%i) is out of range compared to max event id in `game_event`.", prerequisite_event); continue; } mGameEvent[event_id].prerequisite_events.insert(prerequisite_event); } else { - TC_LOG_ERROR("sql.sql", "game_event_prerequisiste includes event entry for non-worldevent id %u", event_id); + TC_LOG_ERROR("sql.sql", "game_event_prerequisiste includes event entry for non-worldevent id %u.", event_id); continue; } @@ -350,7 +350,7 @@ void GameEventMgr::LoadFromDB() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u game event prerequisites in game events in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u game event prerequisites in game events in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } } @@ -363,7 +363,7 @@ void GameEventMgr::LoadFromDB() QueryResult result = WorldDatabase.Query("SELECT guid, eventEntry FROM game_event_creature"); if (!result) - TC_LOG_INFO("server.loading", ">> Loaded 0 creatures in game events. DB table `game_event_creature` is empty"); + TC_LOG_INFO("server.loading", ">> Loaded 0 creatures in game events. DB table `game_event_creature` is empty."); else { uint32 count = 0; @@ -385,7 +385,7 @@ void GameEventMgr::LoadFromDB() if (internal_event_id < 0 || internal_event_id >= int32(mGameEventCreatureGuids.size())) { - TC_LOG_ERROR("sql.sql", "`game_event_creature` game event id (%i) is out of range compared to max event id in `game_event`", event_id); + TC_LOG_ERROR("sql.sql", "`game_event_creature`: game event id (%i) is out of range compared to max event id in `game_event`.", event_id); continue; } @@ -396,7 +396,7 @@ void GameEventMgr::LoadFromDB() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u creatures in game events in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u creatures in game events in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } } @@ -431,7 +431,7 @@ void GameEventMgr::LoadFromDB() if (internal_event_id < 0 || internal_event_id >= int32(mGameEventGameobjectGuids.size())) { - TC_LOG_ERROR("sql.sql", "`game_event_gameobject` game event id (%i) is out of range compared to max event id in `game_event`", event_id); + TC_LOG_ERROR("sql.sql", "`game_event_gameobject`: game event id (%i) is out of range compared to max event id in `game_event`.", event_id); continue; } @@ -442,7 +442,7 @@ void GameEventMgr::LoadFromDB() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u gameobjects in game events in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u gameobjects in game events in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } } @@ -469,7 +469,7 @@ void GameEventMgr::LoadFromDB() if (event_id >= mGameEventModelEquip.size()) { - TC_LOG_ERROR("sql.sql", "`game_event_model_equip` game event id (%u) is out of range compared to max event id in `game_event`", event_id); + TC_LOG_ERROR("sql.sql", "`game_event_model_equip`: game event id (%u) is out of range compared to max event id in `game_event`.", event_id); continue; } @@ -485,7 +485,7 @@ void GameEventMgr::LoadFromDB() int8 equipId = static_cast<int8>(newModelEquipSet.equipment_id); if (!sObjectMgr->GetEquipmentInfo(entry, equipId)) { - TC_LOG_ERROR("sql.sql", "Table `game_event_model_equip` have creature (Guid: %u, entry: %u) with equipment_id %u not found in table `creature_equip_template`, set to no equipment.", + TC_LOG_ERROR("sql.sql", "Table `game_event_model_equip` contains creature (Guid: %u, entry: %u) with equipment_id %u not found in table `creature_equip_template`. Setting entry to no equipment.", guid, entry, newModelEquipSet.equipment_id); continue; } @@ -497,7 +497,7 @@ void GameEventMgr::LoadFromDB() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u model/equipment changes in game events in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u model/equipment changes in game events in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } } @@ -523,7 +523,7 @@ void GameEventMgr::LoadFromDB() if (event_id >= mGameEventCreatureQuests.size()) { - TC_LOG_ERROR("sql.sql", "`game_event_creature_quest` game event id (%u) is out of range compared to max event id in `game_event`", event_id); + TC_LOG_ERROR("sql.sql", "`game_event_creature_quest`: game event id (%u) is out of range compared to max event id in `game_event`.", event_id); continue; } @@ -534,7 +534,7 @@ void GameEventMgr::LoadFromDB() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u quests additions in game events in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u quests additions in game events in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } } @@ -560,7 +560,7 @@ void GameEventMgr::LoadFromDB() if (event_id >= mGameEventGameObjectQuests.size()) { - TC_LOG_ERROR("sql.sql", "`game_event_gameobject_quest` game event id (%u) is out of range compared to max event id in `game_event`", event_id); + TC_LOG_ERROR("sql.sql", "`game_event_gameobject_quest`: game event id (%u) is out of range compared to max event id in `game_event`.", event_id); continue; } @@ -571,7 +571,7 @@ void GameEventMgr::LoadFromDB() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u quests additions in game events in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u quests additions in game events in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } } @@ -598,7 +598,7 @@ void GameEventMgr::LoadFromDB() if (event_id >= mGameEvent.size()) { - TC_LOG_ERROR("sql.sql", "`game_event_quest_condition` game event id (%u) is out of range compared to max event id in `game_event`", event_id); + TC_LOG_ERROR("sql.sql", "`game_event_quest_condition`: game event id (%u) is out of range compared to max event id in `game_event`.", event_id); continue; } @@ -610,7 +610,7 @@ void GameEventMgr::LoadFromDB() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u quest event conditions in game events in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u quest event conditions in game events in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } } @@ -635,7 +635,7 @@ void GameEventMgr::LoadFromDB() if (event_id >= mGameEvent.size()) { - TC_LOG_ERROR("sql.sql", "`game_event_condition` game event id (%u) is out of range compared to max event id in `game_event`", event_id); + TC_LOG_ERROR("sql.sql", "`game_event_condition`: game event id (%u) is out of range compared to max event id in `game_event`.", event_id); continue; } @@ -648,7 +648,7 @@ void GameEventMgr::LoadFromDB() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u conditions in game events in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u conditions in game events in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } } @@ -673,7 +673,7 @@ void GameEventMgr::LoadFromDB() if (event_id >= mGameEvent.size()) { - TC_LOG_ERROR("sql.sql", "`game_event_condition_save` game event id (%u) is out of range compared to max event id in `game_event`", event_id); + TC_LOG_ERROR("sql.sql", "`game_event_condition_save`: game event id (%u) is out of range compared to max event id in `game_event`.", event_id); continue; } @@ -684,7 +684,7 @@ void GameEventMgr::LoadFromDB() } else { - TC_LOG_ERROR("sql.sql", "game_event_condition_save contains not present condition evt id %u cond id %u", event_id, condition); + TC_LOG_ERROR("sql.sql", "game_event_condition_save contains not present condition event id %u condition id %u.", event_id, condition); continue; } @@ -692,7 +692,7 @@ void GameEventMgr::LoadFromDB() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u condition saves in game events in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u condition saves in game events in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } } @@ -718,7 +718,7 @@ void GameEventMgr::LoadFromDB() if (event_id >= mGameEvent.size()) { - TC_LOG_ERROR("sql.sql", "`game_event_npcflag` game event id (%u) is out of range compared to max event id in `game_event`", event_id); + TC_LOG_ERROR("sql.sql", "`game_event_npcflag`: game event id (%u) is out of range compared to max event id in `game_event`.", event_id); continue; } @@ -728,7 +728,7 @@ void GameEventMgr::LoadFromDB() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u npcflags in game events in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u npcflags in game events in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } } @@ -753,13 +753,13 @@ void GameEventMgr::LoadFromDB() if (!sObjectMgr->GetQuestTemplate(questId)) { - TC_LOG_ERROR("sql.sql", "`game_event_seasonal_questrelation` quest id (%u) does not exist in `quest_template`", questId); + TC_LOG_ERROR("sql.sql", "`game_event_seasonal_questrelation`: quest id (%u) does not exist in `quest_template`.", questId); continue; } if (eventEntry >= mGameEvent.size()) { - TC_LOG_ERROR("sql.sql", "`game_event_seasonal_questrelation` event id (%u) is out of range compared to max event in `game_event`", eventEntry); + TC_LOG_ERROR("sql.sql", "`game_event_seasonal_questrelation`: event id (%u) is out of range compared to max event in `game_event`.", eventEntry); continue; } @@ -768,7 +768,7 @@ void GameEventMgr::LoadFromDB() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u quests additions in game events in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u quests additions in game events in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } } @@ -792,7 +792,7 @@ void GameEventMgr::LoadFromDB() if (event_id >= mGameEventVendors.size()) { - TC_LOG_ERROR("sql.sql", "`game_event_npc_vendor` game event id (%u) is out of range compared to max event id in `game_event`", event_id); + TC_LOG_ERROR("sql.sql", "`game_event_npc_vendor`: game event id (%u) is out of range compared to max event id in `game_event`.", event_id); continue; } @@ -830,7 +830,7 @@ void GameEventMgr::LoadFromDB() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u vendor additions in game events in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u vendor additions in game events in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } } @@ -854,7 +854,7 @@ void GameEventMgr::LoadFromDB() if (event_id >= mGameEvent.size()) { - TC_LOG_ERROR("sql.sql", "`game_event_battleground_holiday` game event id (%u) is out of range compared to max event id in `game_event`", event_id); + TC_LOG_ERROR("sql.sql", "`game_event_battleground_holiday`: game event id (%u) is out of range compared to max event id in `game_event`.", event_id); continue; } @@ -864,7 +864,7 @@ void GameEventMgr::LoadFromDB() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u battleground holidays in game events in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u battleground holidays in game events in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } } @@ -892,13 +892,13 @@ void GameEventMgr::LoadFromDB() if (internal_event_id < 0 || internal_event_id >= int32(mGameEventPoolIds.size())) { - TC_LOG_ERROR("sql.sql", "`game_event_pool` game event id (%i) is out of range compared to max event id in `game_event`", event_id); + TC_LOG_ERROR("sql.sql", "`game_event_pool`: game event id (%i) is out of range compared to max event id in `game_event`.", event_id); continue; } if (!sPoolMgr->CheckPool(entry)) { - TC_LOG_ERROR("sql.sql", "Pool Id (%u) has all creatures or gameobjects with explicit chance sum <>100 and no equal chance defined. The pool system cannot pick one to spawn.", entry); + TC_LOG_ERROR("sql.sql", "Pool Id (%u) has all creatures or gameobjects with explicit chance sum <> 100 and no equal chance defined. The pool system cannot pick one to spawn.", entry); continue; } @@ -909,7 +909,7 @@ void GameEventMgr::LoadFromDB() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u pools for game events in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u pools for game events in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } } } @@ -971,7 +971,7 @@ void GameEventMgr::StartArenaSeason() if (!result) { - TC_LOG_ERROR("gameevent", "ArenaSeason (%u) must be an existant Arena Season", season); + TC_LOG_ERROR("gameevent", "ArenaSeason (%u) must be an existing Arena Season.", season); return; } @@ -980,7 +980,7 @@ void GameEventMgr::StartArenaSeason() if (eventId >= mGameEvent.size()) { - TC_LOG_ERROR("gameevent", "EventEntry %u for ArenaSeason (%u) does not exists", eventId, season); + TC_LOG_ERROR("gameevent", "EventEntry %u for ArenaSeason (%u) does not exist.", eventId, season); return; } @@ -1171,7 +1171,7 @@ void GameEventMgr::GameEventSpawn(int16 event_id) if (internal_event_id < 0 || internal_event_id >= int32(mGameEventCreatureGuids.size())) { - TC_LOG_ERROR("gameevent", "GameEventMgr::GameEventSpawn attempt access to out of range mGameEventCreatureGuids element %i (size: %zu)", + TC_LOG_ERROR("gameevent", "GameEventMgr::GameEventSpawn attempted access to out of range mGameEventCreatureGuids element %i (size: %zu).", internal_event_id, mGameEventCreatureGuids.size()); return; } @@ -1198,7 +1198,7 @@ void GameEventMgr::GameEventSpawn(int16 event_id) if (internal_event_id < 0 || internal_event_id >= int32(mGameEventGameobjectGuids.size())) { - TC_LOG_ERROR("gameevent", "GameEventMgr::GameEventSpawn attempt access to out of range mGameEventGameobjectGuids element %i (size: %zu)", + TC_LOG_ERROR("gameevent", "GameEventMgr::GameEventSpawn attempted access to out of range mGameEventGameobjectGuids element %i (size: %zu).", internal_event_id, mGameEventGameobjectGuids.size()); return; } @@ -1231,7 +1231,7 @@ void GameEventMgr::GameEventSpawn(int16 event_id) if (internal_event_id < 0 || internal_event_id >= int32(mGameEventPoolIds.size())) { - TC_LOG_ERROR("gameevent", "GameEventMgr::GameEventSpawn attempt access to out of range mGameEventPoolIds element %u (size: %zu)", + TC_LOG_ERROR("gameevent", "GameEventMgr::GameEventSpawn attempted access to out of range mGameEventPoolIds element %u (size: %zu).", internal_event_id, mGameEventPoolIds.size()); return; } @@ -1246,7 +1246,7 @@ void GameEventMgr::GameEventUnspawn(int16 event_id) if (internal_event_id < 0 || internal_event_id >= int32(mGameEventCreatureGuids.size())) { - TC_LOG_ERROR("gameevent", "GameEventMgr::GameEventUnspawn attempt access to out of range mGameEventCreatureGuids element %i (size: %zu)", + TC_LOG_ERROR("gameevent", "GameEventMgr::GameEventUnspawn attempted access to out of range mGameEventCreatureGuids element %i (size: %zu).", internal_event_id, mGameEventCreatureGuids.size()); return; } @@ -1276,7 +1276,7 @@ void GameEventMgr::GameEventUnspawn(int16 event_id) if (internal_event_id < 0 || internal_event_id >= int32(mGameEventGameobjectGuids.size())) { - TC_LOG_ERROR("gameevent", "GameEventMgr::GameEventUnspawn attempt access to out of range mGameEventGameobjectGuids element %i (size: %zu)", + TC_LOG_ERROR("gameevent", "GameEventMgr::GameEventUnspawn attempted access to out of range mGameEventGameobjectGuids element %i (size: %zu).", internal_event_id, mGameEventGameobjectGuids.size()); return; } @@ -1305,7 +1305,7 @@ void GameEventMgr::GameEventUnspawn(int16 event_id) } if (internal_event_id < 0 || internal_event_id >= int32(mGameEventPoolIds.size())) { - TC_LOG_ERROR("gameevent", "GameEventMgr::GameEventUnspawn attempt access to out of range mGameEventPoolIds element %u (size: %zu)", internal_event_id, mGameEventPoolIds.size()); + TC_LOG_ERROR("gameevent", "GameEventMgr::GameEventUnspawn attempted access to out of range mGameEventPoolIds element %u (size: %zu).", internal_event_id, mGameEventPoolIds.size()); return; } diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 327bccd7e19..f45634e9684 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -2773,7 +2773,7 @@ void ObjectMgr::LoadItemTemplates() itemTemplate.ItemSet = 0; } - if (itemTemplate.Area && !GetAreaEntryByAreaID(itemTemplate.Area)) + if (itemTemplate.Area && !sAreaTableStore.LookupEntry(itemTemplate.Area)) TC_LOG_ERROR("sql.sql", "Item (Entry: %u) has wrong Area (%u)", entry, itemTemplate.Area); if (itemTemplate.Map && !sMapStore.LookupEntry(itemTemplate.Map)) @@ -4143,7 +4143,7 @@ void ObjectMgr::LoadQuests() // client quest log visual (area case) if (qinfo->ZoneOrSort > 0) { - if (!GetAreaEntryByAreaID(qinfo->ZoneOrSort)) + if (!sAreaTableStore.LookupEntry(qinfo->ZoneOrSort)) { TC_LOG_ERROR("sql.sql", "Quest %u has `ZoneOrSort` = %u (zone case) but zone with this id does not exist.", qinfo->GetQuestId(), qinfo->ZoneOrSort); @@ -5956,7 +5956,7 @@ void ObjectMgr::LoadGraveyardZones() continue; } - AreaTableEntry const* areaEntry = GetAreaEntryByAreaID(zoneId); + AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(zoneId); if (!areaEntry) { TC_LOG_ERROR("sql.sql", "Table `game_graveyard_zone` has a record for not existing zone id (%u), skipped.", zoneId); @@ -7796,7 +7796,7 @@ void ObjectMgr::LoadFishingBaseSkillLevel() uint32 entry = fields[0].GetUInt32(); int32 skill = fields[1].GetInt16(); - AreaTableEntry const* fArea = GetAreaEntryByAreaID(entry); + AreaTableEntry const* fArea = sAreaTableStore.LookupEntry(entry); if (!fArea) { TC_LOG_ERROR("sql.sql", "AreaId %u defined in `skill_fishing_base_level` does not exist", entry); diff --git a/src/server/game/Grids/GridDefines.h b/src/server/game/Grids/GridDefines.h index 162c39b951b..24c9100b222 100644 --- a/src/server/game/Grids/GridDefines.h +++ b/src/server/game/Grids/GridDefines.h @@ -226,7 +226,7 @@ namespace Trinity inline bool IsValidMapCoord(float x, float y, float z) { - return IsValidMapCoord(x, y) && std::isfinite(z); + return IsValidMapCoord(x, y) && IsValidMapCoord(z); } inline bool IsValidMapCoord(float x, float y, float z, float o) diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.cpp b/src/server/game/Grids/Notifiers/GridNotifiers.cpp index c48d1947eec..2cdbdca4e4f 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.cpp +++ b/src/server/game/Grids/Notifiers/GridNotifiers.cpp @@ -131,7 +131,7 @@ inline void CreatureUnitRelocationWorker(Creature* c, Unit* u) if (!u->IsAlive() || !c->IsAlive() || c == u || u->IsInFlight()) return; - if (c->HasReactState(REACT_AGGRESSIVE) && !c->HasUnitState(UNIT_STATE_SIGHTLESS)) + if (!c->HasUnitState(UNIT_STATE_SIGHTLESS)) { if (c->IsAIEnabled && c->CanSeeOrDetect(u, false, true)) c->AI()->MoveInLineOfSight_Safe(u); diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index 43159828a3c..99c5d610e64 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -687,7 +687,8 @@ void Group::ConvertLeaderInstancesToGroup(Player* player, Group* group, bool swi for (Player::BoundInstancesMap::iterator itr = player->m_boundInstances[i].begin(); itr != player->m_boundInstances[i].end();) { if (!switchLeader || !group->GetBoundInstance(itr->second.save->GetDifficulty(), itr->first)) - group->BindToInstance(itr->second.save, itr->second.perm, false); + if (itr->second.extendState) // not expired + group->BindToInstance(itr->second.save, itr->second.perm, false); // permanent binds are not removed if (switchLeader && !itr->second.perm) diff --git a/src/server/game/Handlers/CalendarHandler.cpp b/src/server/game/Handlers/CalendarHandler.cpp index 8bd7086fc1b..540eeba0752 100644 --- a/src/server/game/Handlers/CalendarHandler.cpp +++ b/src/server/game/Handlers/CalendarHandler.cpp @@ -695,6 +695,21 @@ void WorldSession::HandleSetSavedInstanceExtend(WorldPacket& recvData) recvData >> mapId >> difficulty>> toggleExtend; TC_LOG_DEBUG("network", "CMSG_SET_SAVED_INSTANCE_EXTEND - MapId: %u, Difficulty: %u, ToggleExtend: %s", mapId, difficulty, toggleExtend ? "On" : "Off"); + if (Player* player = GetPlayer()) + { + InstancePlayerBind* instanceBind = player->GetBoundInstance(mapId, Difficulty(difficulty), toggleExtend == 1); // include expired instances if we are toggling extend on + if (!instanceBind || !instanceBind->save || !instanceBind->perm) + return; + + BindExtensionState newState; + if (!toggleExtend || instanceBind->extendState == EXTEND_STATE_EXPIRED) + newState = EXTEND_STATE_NORMAL; + else + newState = EXTEND_STATE_EXTENDED; + + player->BindToInstance(instanceBind->save, true, newState, false); + } + /* InstancePlayerBind* instanceBind = _player->GetBoundInstance(mapId, Difficulty(difficulty)); if (!instanceBind || !instanceBind->save) diff --git a/src/server/game/Handlers/ChannelHandler.cpp b/src/server/game/Handlers/ChannelHandler.cpp index 976860e8cc0..9285f4247b2 100644 --- a/src/server/game/Handlers/ChannelHandler.cpp +++ b/src/server/game/Handlers/ChannelHandler.cpp @@ -39,7 +39,7 @@ void WorldSession::HandleJoinChannel(WorldPacket& recvPacket) if (!channel) return; - AreaTableEntry const* zone = GetAreaEntryByAreaID(GetPlayer()->GetZoneId()); + AreaTableEntry const* zone = sAreaTableStore.LookupEntry(GetPlayer()->GetZoneId()); if (!zone || !GetPlayer()->CanJoinConstantChannelInZone(channel, zone)) return; } diff --git a/src/server/game/Handlers/MailHandler.cpp b/src/server/game/Handlers/MailHandler.cpp index aaf6ca39d09..36df5b64f1b 100644 --- a/src/server/game/Handlers/MailHandler.cpp +++ b/src/server/game/Handlers/MailHandler.cpp @@ -35,7 +35,7 @@ bool WorldSession::CanOpenMailBox(ObjectGuid guid) { if (!HasPermission(rbac::RBAC_PERM_COMMAND_MAILBOX)) { - TC_LOG_WARN("cheat", "%s attempt open mailbox in cheating way.", _player->GetName().c_str()); + TC_LOG_WARN("cheat", "%s attempted to open mailbox by using a cheat.", _player->GetName().c_str()); return false; } } @@ -108,7 +108,7 @@ void WorldSession::HandleSendMail(WorldPacket& recvData) if (!receiverGuid) { - TC_LOG_INFO("network", "Player %u is sending mail to %s (GUID: not existed!) with subject %s " + TC_LOG_INFO("network", "Player %u is sending mail to %s (GUID: non-existing!) with subject %s " "and body %s includes %u items, %u copper and %u COD copper with unk1 = %u, unk2 = %u", player->GetGUID().GetCounter(), receiverName.c_str(), subject.c_str(), body.c_str(), items_count, money, COD, stationery, package); @@ -117,7 +117,7 @@ void WorldSession::HandleSendMail(WorldPacket& recvData) } TC_LOG_INFO("network", "Player %u is sending mail to %s (%s) with subject %s and body %s " - "includes %u items, %u copper and %u COD copper with unk1 = %u, unk2 = %u", + "including %u items, %u copper and %u COD copper with unk1 = %u, unk2 = %u", player->GetGUID().GetCounter(), receiverName.c_str(), receiverGuid.ToString().c_str(), subject.c_str(), body.c_str(), items_count, money, COD, stationery, package); diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 6cd8bfc014e..45cee59aec9 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -319,7 +319,7 @@ void WorldSession::HandleWhoOpcode(WorldPacket& recvData) continue; std::string aname; - if (AreaTableEntry const* areaEntry = GetAreaEntryByAreaID(pzoneid)) + if (AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(pzoneid)) aname = areaEntry->area_name[GetSessionDbcLocale()]; bool s_show = true; @@ -1203,7 +1203,7 @@ void WorldSession::HandleInspectOpcode(WorldPacket& recvData) WorldPacket data(SMSG_INSPECT_TALENT, guid_size+4+talent_points); data << player->GetPackGUID(); - if (sWorld->getBoolConfig(CONFIG_TALENTS_INSPECTING) || _player->IsGameMaster()) + if (GetPlayer()->CanBeGameMaster() || sWorld->getIntConfig(CONFIG_TALENTS_INSPECTING) + (GetPlayer()->GetTeamId() == player->GetTeamId()) > 1) player->BuildPlayerTalentsInfoData(&data); else { @@ -1753,7 +1753,7 @@ void WorldSession::HandleHearthAndResurrect(WorldPacket& /*recvData*/) return; } - AreaTableEntry const* atEntry = GetAreaEntryByAreaID(_player->GetAreaId()); + AreaTableEntry const* atEntry = sAreaTableStore.LookupEntry(_player->GetAreaId()); if (!atEntry || !(atEntry->flags & AREA_FLAG_WINTERGRASP_2)) return; diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index eea5c62fbd1..02702fc5622 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -386,7 +386,7 @@ void WorldSession::HandleMovementOpcodes(WorldPacket& recvData) plrMover->UpdateFallInformationIfNeed(movementInfo, opcode); - if (movementInfo.pos.GetPositionZ() < -500.0f) + if (movementInfo.pos.GetPositionZ() < plrMover->GetMap()->GetMinHeight(movementInfo.pos.GetPositionX(), movementInfo.pos.GetPositionY())) { if (!(plrMover->GetBattleground() && plrMover->GetBattleground()->HandlePlayerUnderMap(_player))) { @@ -395,6 +395,7 @@ void WorldSession::HandleMovementOpcodes(WorldPacket& recvData) /// @todo discard movement packets after the player is rooted if (plrMover->IsAlive()) { + plrMover->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_IS_OUT_OF_BOUNDS); plrMover->EnvironmentalDamage(DAMAGE_FALL_TO_VOID, GetPlayer()->GetMaxHealth()); // player can be alive if GM/etc // change the death state to CORPSE to prevent the death timer from diff --git a/src/server/game/Instances/InstanceSaveMgr.cpp b/src/server/game/Instances/InstanceSaveMgr.cpp index 9a64335e6f0..3538262ed35 100644 --- a/src/server/game/Instances/InstanceSaveMgr.cpp +++ b/src/server/game/Instances/InstanceSaveMgr.cpp @@ -439,6 +439,23 @@ void InstanceSaveManager::LoadResetTimes() } } +time_t InstanceSaveManager::GetSubsequentResetTime(uint32 mapid, Difficulty difficulty, time_t resetTime) const +{ + MapDifficulty const* mapDiff = GetMapDifficultyData(mapid, difficulty); + if (!mapDiff || !mapDiff->resetTime) + { + TC_LOG_ERROR("misc", "InstanceSaveManager::GetSubsequentResetTime: not valid difficulty or no reset delay for map %u", mapid); + return 0; + } + + time_t diff = sWorld->getIntConfig(CONFIG_INSTANCE_RESET_TIME_HOUR) * HOUR; + time_t period = uint32(((mapDiff->resetTime * sWorld->getRate(RATE_INSTANCE_RESET_TIME)) / DAY) * DAY); + if (period < DAY) + period = DAY; + + return ((resetTime + MINUTE) / DAY * DAY) + period + diff; +} + void InstanceSaveManager::ScheduleReset(bool add, time_t time, InstResetEvent event) { if (!add) @@ -476,6 +493,17 @@ void InstanceSaveManager::ScheduleReset(bool add, time_t time, InstResetEvent ev m_resetTimeQueue.insert(std::pair<time_t, InstResetEvent>(time, event)); } +void InstanceSaveManager::ForceGlobalReset(uint32 mapId, Difficulty difficulty) +{ + if (!GetDownscaledMapDifficultyData(mapId, difficulty)) + return; + // remove currently scheduled reset times + ScheduleReset(false, 0, InstResetEvent(1, mapId, difficulty, 0)); + ScheduleReset(false, 0, InstResetEvent(4, mapId, difficulty, 0)); + // force global reset on the instance + _ResetOrWarnAll(mapId, difficulty, false, time(nullptr)); +} + void InstanceSaveManager::Update() { time_t now = time(NULL); @@ -516,10 +544,26 @@ void InstanceSaveManager::_ResetSave(InstanceSaveHashMap::iterator &itr) // do not allow UnbindInstance to automatically unload the InstanceSaves lock_instLists = true; + bool shouldDelete = true; InstanceSave::PlayerListType &pList = itr->second->m_playerList; - while (!pList.empty()) + std::vector<Player*> temp; // list of expired binds that should be unbound + for (Player* player : pList) + { + if (InstancePlayerBind* bind = player->GetBoundInstance(itr->second->GetMapId(), itr->second->GetDifficulty())) + { + ASSERT(bind->save == itr->second); + if (bind->perm && bind->extendState) // permanent and not already expired + { + // actual promotion in DB already happened in caller + bind->extendState = bind->extendState == EXTEND_STATE_EXTENDED ? EXTEND_STATE_NORMAL : EXTEND_STATE_EXPIRED; + shouldDelete = false; + continue; + } + } + temp.push_back(player); + } + for (Player* player : temp) { - Player* player = *(pList.begin()); player->UnbindInstance(itr->second->GetMapId(), itr->second->GetDifficulty(), true); } @@ -530,8 +574,13 @@ void InstanceSaveManager::_ResetSave(InstanceSaveHashMap::iterator &itr) group->UnbindInstance(itr->second->GetMapId(), itr->second->GetDifficulty(), true); } - delete itr->second; - m_instanceSaveById.erase(itr++); + if (shouldDelete) + { + delete itr->second; + itr = m_instanceSaveById.erase(itr); + } + else + ++itr; lock_instLists = false; } @@ -572,31 +621,21 @@ void InstanceSaveManager::_ResetOrWarnAll(uint32 mapid, Difficulty difficulty, b MapEntry const* mapEntry = sMapStore.LookupEntry(mapid); if (!mapEntry->Instanceable()) return; + TC_LOG_DEBUG("misc", "InstanceSaveManager::ResetOrWarnAll: Processing map %s (%u) on difficulty %u (warn? %u)", mapEntry->name[0], mapid, uint8(difficulty), warn); time_t now = time(NULL); if (!warn) { - MapDifficulty const* mapDiff = GetMapDifficultyData(mapid, difficulty); - if (!mapDiff || !mapDiff->resetTime) - { - TC_LOG_ERROR("misc", "InstanceSaveManager::ResetOrWarnAll: not valid difficulty or no reset delay for map %d", mapid); + // calculate the next reset time + time_t next_reset = GetSubsequentResetTime(mapid, difficulty, resetTime); + if (!next_reset) return; - } - // remove all binds to instances of the given map - for (InstanceSaveHashMap::iterator itr = m_instanceSaveById.begin(); itr != m_instanceSaveById.end();) - { - if (itr->second->GetMapId() == mapid && itr->second->GetDifficulty() == difficulty) - _ResetSave(itr); - else - ++itr; - } - - // delete them from the DB, even if not loaded + // delete/promote instance binds from the DB, even if not loaded SQLTransaction trans = CharacterDatabase.BeginTransaction(); - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INSTANCE_BY_MAP_DIFF); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_EXPIRED_CHAR_INSTANCE_BY_MAP_DIFF); stmt->setUInt16(0, uint16(mapid)); stmt->setUInt8(1, uint8(difficulty)); trans->Append(stmt); @@ -606,21 +645,26 @@ void InstanceSaveManager::_ResetOrWarnAll(uint32 mapid, Difficulty difficulty, b stmt->setUInt8(1, uint8(difficulty)); trans->Append(stmt); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_INSTANCE_BY_MAP_DIFF); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_EXPIRED_INSTANCE_BY_MAP_DIFF); stmt->setUInt16(0, uint16(mapid)); stmt->setUInt8(1, uint8(difficulty)); trans->Append(stmt); - CharacterDatabase.CommitTransaction(trans); - - // calculate the next reset time - uint32 diff = sWorld->getIntConfig(CONFIG_INSTANCE_RESET_TIME_HOUR) * HOUR; + stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_EXPIRE_CHAR_INSTANCE_BY_MAP_DIFF); + stmt->setUInt16(0, uint16(mapid)); + stmt->setUInt8(1, uint8(difficulty)); + trans->Append(stmt); - uint32 period = uint32(((mapDiff->resetTime * sWorld->getRate(RATE_INSTANCE_RESET_TIME))/DAY) * DAY); - if (period < DAY) - period = DAY; + CharacterDatabase.CommitTransaction(trans); - uint32 next_reset = uint32(((resetTime + MINUTE) / DAY * DAY) + period + diff); + // promote loaded binds to instances of the given map + for (InstanceSaveHashMap::iterator itr = m_instanceSaveById.begin(); itr != m_instanceSaveById.end();) + { + if (itr->second->GetMapId() == mapid && itr->second->GetDifficulty() == difficulty) + _ResetSave(itr); + else + ++itr; + } SetResetTimeFor(mapid, difficulty, next_reset); ScheduleReset(true, time_t(next_reset-3600), InstResetEvent(1, mapid, difficulty, 0)); diff --git a/src/server/game/Instances/InstanceSaveMgr.h b/src/server/game/Instances/InstanceSaveMgr.h index e3d8175cbc4..d2b3237b3cf 100644 --- a/src/server/game/Instances/InstanceSaveMgr.h +++ b/src/server/game/Instances/InstanceSaveMgr.h @@ -190,6 +190,7 @@ class InstanceSaveManager ResetTimeByMapDifficultyMap::const_iterator itr = m_resetTimeByMapDifficulty.find(MAKE_PAIR32(mapid, d)); return itr != m_resetTimeByMapDifficulty.end() ? itr->second : 0; } + time_t GetSubsequentResetTime(uint32 mapid, Difficulty difficulty, time_t resetTime) const; // Use this on startup when initializing reset times void InitializeResetTimeFor(uint32 mapid, Difficulty d, time_t t) @@ -210,6 +211,7 @@ class InstanceSaveManager return m_resetTimeByMapDifficulty; } void ScheduleReset(bool add, time_t time, InstResetEvent event); + void ForceGlobalReset(uint32 mapId, Difficulty difficulty); void Update(); diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp index 530bcd2902c..19dc210ea5b 100644 --- a/src/server/game/Loot/LootMgr.cpp +++ b/src/server/game/Loot/LootMgr.cpp @@ -1580,8 +1580,8 @@ void LoadLootTemplates_Fishing() uint32 count = LootTemplates_Fishing.LoadAndCollectLootIds(lootIdSet); // remove real entries and check existence loot - for (uint32 i = 1; i < sAreaStore.GetNumRows(); ++i) - if (AreaTableEntry const* areaEntry = sAreaStore.LookupEntry(i)) + for (uint32 i = 1; i < sAreaTableStore.GetNumRows(); ++i) + if (AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(i)) if (lootIdSet.find(areaEntry->ID) != lootIdSet.end()) lootIdSet.erase(areaEntry->ID); diff --git a/src/server/game/Mails/Mail.cpp b/src/server/game/Mails/Mail.cpp index b0e8a1ebe02..bc31a3c8c06 100644 --- a/src/server/game/Mails/Mail.cpp +++ b/src/server/game/Mails/Mail.cpp @@ -49,8 +49,8 @@ MailSender::MailSender(Object* sender, MailStationery stationery) : m_stationery break; default: m_messageType = MAIL_NORMAL; - m_senderId = 0; // will show mail from not existed player - TC_LOG_ERROR("misc", "MailSender::MailSender - Mail have unexpected sender typeid (%u)", sender->GetTypeId()); + m_senderId = 0; // will show mail from non-existing player + TC_LOG_ERROR("misc", "MailSender::MailSender - Mail message contains unexpected sender typeid (%u).", sender->GetTypeId()); break; } } diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index a2cb84359f2..2da5193b2ec 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -37,7 +37,7 @@ #include "VMapFactory.h" u_map_magic MapMagic = { {'M','A','P','S'} }; -u_map_magic MapVersionMagic = { {'v','1','.','3'} }; +u_map_magic MapVersionMagic = { {'v','1','.','8'} }; u_map_magic MapAreaMagic = { {'A','R','E','A'} }; u_map_magic MapHeightMagic = { {'M','H','G','T'} }; u_map_magic MapLiquidMagic = { {'M','L','I','Q'} }; @@ -594,7 +594,7 @@ bool Map::AddToMap(T* obj) //something, such as vehicle, needs to be update immediately //also, trigger needs to cast spell, if not update, cannot see visual - obj->UpdateObjectVisibility(true); + obj->UpdateObjectVisibilityOnCreate(); return true; } @@ -1644,13 +1644,15 @@ GridMap::GridMap() _flags = 0; // Area data _gridArea = 0; - _areaMap = NULL; + _areaMap = nullptr; // Height level data _gridHeight = INVALID_HEIGHT; _gridGetHeight = &GridMap::getHeightFromFlat; _gridIntHeightMultiplier = 0; - m_V9 = NULL; - m_V8 = NULL; + m_V9 = nullptr; + m_V8 = nullptr; + _maxHeight = nullptr; + _minHeight = nullptr; // Liquid data _liquidType = 0; _liquidOffX = 0; @@ -1658,9 +1660,9 @@ GridMap::GridMap() _liquidWidth = 0; _liquidHeight = 0; _liquidLevel = INVALID_HEIGHT; - _liquidEntry = NULL; - _liquidFlags = NULL; - _liquidMap = NULL; + _liquidEntry = nullptr; + _liquidFlags = nullptr; + _liquidMap = nullptr; } GridMap::~GridMap() @@ -1723,15 +1725,19 @@ void GridMap::unloadData() delete[] _areaMap; delete[] m_V9; delete[] m_V8; + delete[] _maxHeight; + delete[] _minHeight; delete[] _liquidEntry; delete[] _liquidFlags; delete[] _liquidMap; - _areaMap = NULL; - m_V9 = NULL; - m_V8 = NULL; - _liquidEntry = NULL; - _liquidFlags = NULL; - _liquidMap = NULL; + _areaMap = nullptr; + m_V9 = nullptr; + m_V8 = nullptr; + _maxHeight = nullptr; + _minHeight = nullptr; + _liquidEntry = nullptr; + _liquidFlags = nullptr; + _liquidMap = nullptr; _gridGetHeight = &GridMap::getHeightFromFlat; } @@ -1746,7 +1752,7 @@ bool GridMap::loadAreaData(FILE* in, uint32 offset, uint32 /*size*/) _gridArea = header.gridArea; if (!(header.flags & MAP_AREA_NO_AREA)) { - _areaMap = new uint16 [16*16]; + _areaMap = new uint16[16 * 16]; if (fread(_areaMap, sizeof(uint16), 16*16, in) != 16*16) return false; } @@ -1796,6 +1802,16 @@ bool GridMap::loadHeightData(FILE* in, uint32 offset, uint32 /*size*/) } else _gridGetHeight = &GridMap::getHeightFromFlat; + + if (header.flags & MAP_HEIGHT_HAS_FLIGHT_BOUNDS) + { + _maxHeight = new int16[3 * 3]; + _minHeight = new int16[3 * 3]; + if (fread(_maxHeight, sizeof(int16), 3 * 3, in) != 3 * 3 || + fread(_minHeight, sizeof(int16), 3 * 3, in) != 3 * 3) + return false; + } + return true; } @@ -2066,6 +2082,66 @@ float GridMap::getHeightFromUint16(float x, float y) const return (float)((a * x) + (b * y) + c)*_gridIntHeightMultiplier + _gridHeight; } +float GridMap::getMinHeight(float x, float y) const +{ + if (!_minHeight) + return -500.0f; + + static uint32 const indices[] = + { + 3, 0, 4, + 0, 1, 4, + 1, 2, 4, + 2, 5, 4, + 5, 8, 4, + 8, 7, 4, + 7, 6, 4, + 6, 3, 4 + }; + + static float const boundGridCoords[] = + { + 0.0f, 0.0f, + 0.0f, -266.66666f, + 0.0f, -533.33331f, + -266.66666f, 0.0f, + -266.66666f, -266.66666f, + -266.66666f, -533.33331f, + -533.33331f, 0.0f, + -533.33331f, -266.66666f, + -533.33331f, -533.33331f + }; + + Cell cell(x, y); + float gx = x - (int32(cell.GridX()) - CENTER_GRID_ID + 1) * SIZE_OF_GRIDS; + float gy = y - (int32(cell.GridY()) - CENTER_GRID_ID + 1) * SIZE_OF_GRIDS; + + uint32 quarterIndex = 0; + if (cell.CellY() < MAX_NUMBER_OF_CELLS / 2) + { + if (cell.CellX() < MAX_NUMBER_OF_CELLS / 2) + { + quarterIndex = 4 + (gy > gx); + } + else + quarterIndex = 2 + ((-SIZE_OF_GRIDS - gx) > gy); + } + else if (cell.CellX() < MAX_NUMBER_OF_CELLS / 2) + { + quarterIndex = 6 + ((-SIZE_OF_GRIDS - gx) <= gy); + } + else + quarterIndex = gx > gy; + + quarterIndex *= 3; + + return G3D::Plane( + G3D::Vector3(boundGridCoords[indices[quarterIndex + 0] * 2 + 0], boundGridCoords[indices[quarterIndex + 0] * 2 + 1], _minHeight[indices[quarterIndex + 0]]), + G3D::Vector3(boundGridCoords[indices[quarterIndex + 1] * 2 + 0], boundGridCoords[indices[quarterIndex + 1] * 2 + 1], _minHeight[indices[quarterIndex + 1]]), + G3D::Vector3(boundGridCoords[indices[quarterIndex + 2] * 2 + 0], boundGridCoords[indices[quarterIndex + 2] * 2 + 1], _minHeight[indices[quarterIndex + 2]]) + ).distance(G3D::Vector3(gx, gy, 0.0f)); +} + float GridMap::getLiquidLevel(float x, float y) const { if (!_liquidMap) @@ -2125,12 +2201,12 @@ inline ZLiquidStatus GridMap::getLiquidStatus(float x, float y, float z, uint8 R uint32 liqTypeIdx = liquidEntry->Type; if (entry < 21) { - if (AreaTableEntry const* area = GetAreaEntryByAreaFlagAndMap(getArea(x, y), MAPID_INVALID)) + if (AreaTableEntry const* area = sAreaTableStore.LookupEntry(getArea(x, y))) { uint32 overrideLiquid = area->LiquidTypeOverride[liquidEntry->Type]; if (!overrideLiquid && area->zone) { - area = GetAreaEntryByAreaID(area->zone); + area = sAreaTableStore.LookupEntry(area->zone); if (area) overrideLiquid = area->LiquidTypeOverride[liquidEntry->Type]; } @@ -2266,6 +2342,14 @@ float Map::GetHeight(float x, float y, float z, bool checkVMap /*= true*/, float return mapHeight; // explicitly use map data } +float Map::GetMinHeight(float x, float y) const +{ + if (GridMap const* grid = const_cast<Map*>(this)->GetGrid(x, y)) + return grid->getMinHeight(x, y); + + return -500.0f; +} + inline bool IsOutdoorWMO(uint32 mogpFlags, int32 /*adtId*/, int32 /*rootId*/, int32 /*groupId*/, WMOAreaTableEntry const* wmoEntry, AreaTableEntry const* atEntry) { bool outdoor = true; @@ -2304,7 +2388,7 @@ bool Map::IsOutdoors(float x, float y, float z) const if (wmoEntry) { TC_LOG_DEBUG("maps", "Got WMOAreaTableEntry! flag %u, areaid %u", wmoEntry->Flags, wmoEntry->areaId); - atEntry = GetAreaEntryByAreaID(wmoEntry->areaId); + atEntry = sAreaTableStore.LookupEntry(wmoEntry->areaId); } return IsOutdoorWMO(mogpFlags, adtId, rootId, groupId, wmoEntry, atEntry); } @@ -2328,7 +2412,7 @@ bool Map::GetAreaInfo(float x, float y, float z, uint32 &flags, int32 &adtId, in return false; } -uint16 Map::GetAreaFlag(float x, float y, float z, bool *isOutdoors) const +uint32 Map::GetAreaId(float x, float y, float z, bool *isOutdoors) const { uint32 mogpFlags; int32 adtId, rootId, groupId; @@ -2341,20 +2425,21 @@ uint16 Map::GetAreaFlag(float x, float y, float z, bool *isOutdoors) const haveAreaInfo = true; wmoEntry = GetWMOAreaTableEntryByTripple(rootId, adtId, groupId); if (wmoEntry) - atEntry = GetAreaEntryByAreaID(wmoEntry->areaId); + atEntry = sAreaTableStore.LookupEntry(wmoEntry->areaId); } - uint16 areaflag; + uint32 areaId = 0; if (atEntry) - areaflag = atEntry->exploreFlag; + areaId = atEntry->ID; else { if (GridMap* gmap = const_cast<Map*>(this)->GetGrid(x, y)) - areaflag = gmap->getArea(x, y); + areaId = gmap->getArea(x, y); + // this used while not all *.map files generated (instances) - else - areaflag = GetAreaFlagByMapId(i_mapEntry->MapID); + if (!areaId) + areaId = i_mapEntry->linked_zone; } if (isOutdoors) @@ -2364,8 +2449,31 @@ uint16 Map::GetAreaFlag(float x, float y, float z, bool *isOutdoors) const else *isOutdoors = true; } - return areaflag; - } + return areaId; +} + +uint32 Map::GetAreaId(float x, float y, float z) const +{ + return GetAreaId(x, y, z, nullptr); +} + +uint32 Map::GetZoneId(float x, float y, float z) const +{ + uint32 areaId = GetAreaId(x, y, z); + if (AreaTableEntry const* area = sAreaTableStore.LookupEntry(areaId)) + if (area->zone) + return area->zone; + + return areaId; +} + +void Map::GetZoneAndAreaId(uint32& zoneid, uint32& areaid, float x, float y, float z) const +{ + areaid = zoneid = GetAreaId(x, y, z); + if (AreaTableEntry const* area = sAreaTableStore.LookupEntry(areaid)) + if (area->zone) + zoneid = area->zone; +} uint8 Map::GetTerrainType(float x, float y) const { @@ -2401,12 +2509,12 @@ ZLiquidStatus Map::getLiquidStatus(float x, float y, float z, uint8 ReqLiquidTyp if (liquid_type && liquid_type < 21) { - if (AreaTableEntry const* area = GetAreaEntryByAreaFlagAndMap(GetAreaFlag(x, y, z), GetId())) + if (AreaTableEntry const* area = sAreaTableStore.LookupEntry(GetAreaId(x, y, z))) { uint32 overrideLiquid = area->LiquidTypeOverride[liquidFlagType]; if (!overrideLiquid && area->zone) { - area = GetAreaEntryByAreaID(area->zone); + area = sAreaTableStore.LookupEntry(area->zone); if (area) overrideLiquid = area->LiquidTypeOverride[liquidFlagType]; } @@ -2468,34 +2576,6 @@ float Map::GetWaterLevel(float x, float y) const return 0; } -uint32 Map::GetAreaIdByAreaFlag(uint16 areaflag, uint32 map_id) -{ - AreaTableEntry const* entry = GetAreaEntryByAreaFlagAndMap(areaflag, map_id); - - if (entry) - return entry->ID; - else - return 0; -} - -uint32 Map::GetZoneIdByAreaFlag(uint16 areaflag, uint32 map_id) -{ - AreaTableEntry const* entry = GetAreaEntryByAreaFlagAndMap(areaflag, map_id); - - if (entry) - return (entry->zone != 0) ? entry->zone : entry->ID; - else - return 0; -} - -void Map::GetZoneAndAreaIdByAreaFlag(uint32& zoneid, uint32& areaid, uint16 areaflag, uint32 map_id) -{ - AreaTableEntry const* entry = GetAreaEntryByAreaFlagAndMap(areaflag, map_id); - - areaid = entry ? entry->ID : 0; - zoneid = entry ? ((entry->zone != 0) ? entry->zone : entry->ID) : 0; -} - bool Map::isInLineOfSight(float x1, float y1, float z1, float x2, float y2, float z2, uint32 phasemask) const { return VMAP::VMapFactory::createOrGetVMapManager()->isInLineOfSight(GetId(), x1, y1, z1, x2, y2, z2) @@ -3178,22 +3258,37 @@ bool InstanceMap::Reset(uint8 method) } else { + bool doUnload = true; if (method == INSTANCE_RESET_GLOBAL) + { // set the homebind timer for players inside (1 minute) for (MapRefManager::iterator itr = m_mapRefManager.begin(); itr != m_mapRefManager.end(); ++itr) - itr->GetSource()->m_InstanceValid = false; + { + InstancePlayerBind* bind = itr->GetSource()->GetBoundInstance(GetId(), GetDifficulty()); + if (bind && bind->extendState && bind->save->GetInstanceId() == GetInstanceId()) + doUnload = false; + else + itr->GetSource()->m_InstanceValid = false; + } + + if (doUnload && HasPermBoundPlayers()) // check if any unloaded players have a nonexpired save to this + doUnload = false; + } - // the unload timer is not started - // instead the map will unload immediately after the players have left - m_unloadWhenEmpty = true; - m_resetAfterUnload = true; + if (doUnload) + { + // the unload timer is not started + // instead the map will unload immediately after the players have left + m_unloadWhenEmpty = true; + m_resetAfterUnload = true; + } } } else { // unloaded at next update m_unloadTimer = MIN_UNLOAD_DELAY; - m_resetAfterUnload = true; + m_resetAfterUnload = !(method == INSTANCE_RESET_GLOBAL && HasPermBoundPlayers()); } return m_mapRefManager.isEmpty(); @@ -3274,6 +3369,13 @@ MapDifficulty const* Map::GetMapDifficulty() const return GetMapDifficultyData(GetId(), GetDifficulty()); } +bool InstanceMap::HasPermBoundPlayers() const +{ + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PERM_BIND_BY_INSTANCE); + stmt->setUInt16(0,GetInstanceId()); + return !!CharacterDatabase.Query(stmt); +} + uint32 InstanceMap::GetMaxPlayers() const { MapDifficulty const* mapDiff = GetMapDifficulty(); diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index 01db38d9c30..bc2bf72f271 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -98,9 +98,10 @@ struct map_areaHeader uint16 gridArea; }; -#define MAP_HEIGHT_NO_HEIGHT 0x0001 -#define MAP_HEIGHT_AS_INT16 0x0002 -#define MAP_HEIGHT_AS_INT8 0x0004 +#define MAP_HEIGHT_NO_HEIGHT 0x0001 +#define MAP_HEIGHT_AS_INT16 0x0002 +#define MAP_HEIGHT_AS_INT8 0x0004 +#define MAP_HEIGHT_HAS_FLIGHT_BOUNDS 0x0008 struct map_heightHeader { @@ -166,6 +167,8 @@ class GridMap uint16* m_uint16_V8; uint8* m_uint8_V8; }; + int16* _maxHeight; + int16* _minHeight; // Height level data float _gridHeight; float _gridIntHeightMultiplier; @@ -206,6 +209,7 @@ public: uint16 getArea(float x, float y) const; inline float getHeight(float x, float y) const {return (this->*_gridGetHeight)(x, y);} + float getMinHeight(float x, float y) const; float getLiquidLevel(float x, float y) const; uint8 getTerrainType(float x, float y) const; ZLiquidStatus getLiquidStatus(float x, float y, float z, uint8 ReqLiquidType, LiquidData* data = 0); @@ -326,11 +330,15 @@ class Map : public GridRefManager<NGridType> // some calls like isInWater should not use vmaps due to processor power // can return INVALID_HEIGHT if under z+2 z coord not found height float GetHeight(float x, float y, float z, bool checkVMap = true, float maxSearchDist = DEFAULT_HEIGHT_SEARCH) const; + float GetMinHeight(float x, float y) const; ZLiquidStatus getLiquidStatus(float x, float y, float z, uint8 ReqLiquidType, LiquidData* data = nullptr) const; - uint16 GetAreaFlag(float x, float y, float z, bool *isOutdoors=nullptr) const; - bool GetAreaInfo(float x, float y, float z, uint32 &mogpflags, int32 &adtId, int32 &rootId, int32 &groupId) const; + uint32 GetAreaId(float x, float y, float z, bool *isOutdoors) const; + bool GetAreaInfo(float x, float y, float z, uint32& mogpflags, int32& adtId, int32& rootId, int32& groupId) const; + uint32 GetAreaId(float x, float y, float z) const; + uint32 GetZoneId(float x, float y, float z) const; + void GetZoneAndAreaId(uint32& zoneid, uint32& areaid, float x, float y, float z) const; bool IsOutdoors(float x, float y, float z) const; @@ -339,25 +347,6 @@ class Map : public GridRefManager<NGridType> bool IsInWater(float x, float y, float z, LiquidData* data = nullptr) const; bool IsUnderWater(float x, float y, float z) const; - static uint32 GetAreaIdByAreaFlag(uint16 areaflag, uint32 map_id); - static uint32 GetZoneIdByAreaFlag(uint16 areaflag, uint32 map_id); - static void GetZoneAndAreaIdByAreaFlag(uint32& zoneid, uint32& areaid, uint16 areaflag, uint32 map_id); - - uint32 GetAreaId(float x, float y, float z) const - { - return GetAreaIdByAreaFlag(GetAreaFlag(x, y, z), GetId()); - } - - uint32 GetZoneId(float x, float y, float z) const - { - return GetZoneIdByAreaFlag(GetAreaFlag(x, y, z), GetId()); - } - - void GetZoneAndAreaId(uint32& zoneid, uint32& areaid, float x, float y, float z) const - { - GetZoneAndAreaIdByAreaFlag(zoneid, areaid, GetAreaFlag(x, y, z), GetId()); - } - void MoveAllCreaturesInMoveList(); void MoveAllGameObjectsInMoveList(); void MoveAllDynamicObjectsInMoveList(); @@ -782,6 +771,9 @@ class InstanceMap : public Map void SendResetWarnings(uint32 timeLeft) const; void SetResetSchedule(bool on); + /* this checks if any players have a permanent bind (included reactivatable expired binds) to the instance ID + it needs a DB query, so use sparingly */ + bool HasPermBoundPlayers() const; uint32 GetMaxPlayers() const; uint32 GetMaxResetDelay() const; diff --git a/src/server/game/Maps/MapManager.h b/src/server/game/Maps/MapManager.h index 51bb418bdf5..7f9621593d4 100644 --- a/src/server/game/Maps/MapManager.h +++ b/src/server/game/Maps/MapManager.h @@ -42,22 +42,20 @@ class MapManager Map* CreateMap(uint32 mapId, Player* player, uint32 loginInstanceId=0); Map* FindMap(uint32 mapId, uint32 instanceId) const; - uint16 GetAreaFlag(uint32 mapid, float x, float y, float z) const - { - Map const* m = const_cast<MapManager*>(this)->CreateBaseMap(mapid); - return m->GetAreaFlag(x, y, z); - } uint32 GetAreaId(uint32 mapid, float x, float y, float z) const { - return Map::GetAreaIdByAreaFlag(GetAreaFlag(mapid, x, y, z), mapid); + Map const* m = const_cast<MapManager*>(this)->CreateBaseMap(mapid); + return m->GetAreaId(x, y, z); } uint32 GetZoneId(uint32 mapid, float x, float y, float z) const { - return Map::GetZoneIdByAreaFlag(GetAreaFlag(mapid, x, y, z), mapid); + Map const* m = const_cast<MapManager*>(this)->CreateBaseMap(mapid); + return m->GetZoneId(x, y, z); } void GetZoneAndAreaId(uint32& zoneid, uint32& areaid, uint32 mapid, float x, float y, float z) { - Map::GetZoneAndAreaIdByAreaFlag(zoneid, areaid, GetAreaFlag(mapid, x, y, z), mapid); + Map const* m = const_cast<MapManager*>(this)->CreateBaseMap(mapid); + m->GetZoneAndAreaId(zoneid, areaid, x, y, z); } void Initialize(void); diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index 3fcae1398f9..2a57524cb3c 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -193,7 +193,7 @@ void MotionMaster::MoveRandom(float spawndist) { if (_owner->GetTypeId() == TYPEID_UNIT) { - TC_LOG_DEBUG("misc", "Creature (GUID: %u) start moving random", _owner->GetGUID().GetCounter()); + TC_LOG_DEBUG("misc", "Creature (GUID: %u) started random movement.", _owner->GetGUID().GetCounter()); Mutate(new RandomMovementGenerator<Creature>(spawndist), MOTION_SLOT_IDLE); } } @@ -204,22 +204,22 @@ void MotionMaster::MoveTargetedHome() if (_owner->GetTypeId() == TYPEID_UNIT && !_owner->ToCreature()->GetCharmerOrOwnerGUID()) { - TC_LOG_DEBUG("misc", "Creature (Entry: %u GUID: %u) targeted home", _owner->GetEntry(), _owner->GetGUID().GetCounter()); + TC_LOG_DEBUG("misc", "Creature (Entry: %u GUID: %u) targeted home.", _owner->GetEntry(), _owner->GetGUID().GetCounter()); Mutate(new HomeMovementGenerator<Creature>(), MOTION_SLOT_ACTIVE); } else if (_owner->GetTypeId() == TYPEID_UNIT && _owner->ToCreature()->GetCharmerOrOwnerGUID()) { - TC_LOG_DEBUG("misc", "Pet or controlled creature (Entry: %u GUID: %u) targeting home", _owner->GetEntry(), _owner->GetGUID().GetCounter()); + TC_LOG_DEBUG("misc", "Pet or controlled creature (Entry: %u GUID: %u) is targeting home.", _owner->GetEntry(), _owner->GetGUID().GetCounter()); Unit* target = _owner->ToCreature()->GetCharmerOrOwner(); if (target) { - TC_LOG_DEBUG("misc", "Following %s (GUID: %u)", target->GetTypeId() == TYPEID_PLAYER ? "player" : "creature", target->GetTypeId() == TYPEID_PLAYER ? target->GetGUID().GetCounter() : ((Creature*)target)->GetSpawnId()); + TC_LOG_DEBUG("misc", "Following %s (GUID: %u).", target->GetTypeId() == TYPEID_PLAYER ? "player" : "creature", target->GetTypeId() == TYPEID_PLAYER ? target->GetGUID().GetCounter() : ((Creature*)target)->GetSpawnId()); Mutate(new FollowMovementGenerator<Creature>(target, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE), MOTION_SLOT_ACTIVE); } } else { - TC_LOG_ERROR("misc", "Player (GUID: %u) attempt targeted home", _owner->GetGUID().GetCounter()); + TC_LOG_ERROR("misc", "Player (GUID: %u) attempted to move towards target home.", _owner->GetGUID().GetCounter()); } } @@ -272,14 +272,14 @@ void MotionMaster::MoveFollow(Unit* target, float dist, float angle, MovementSlo //_owner->AddUnitState(UNIT_STATE_FOLLOW); if (_owner->GetTypeId() == TYPEID_PLAYER) { - TC_LOG_DEBUG("misc", "Player (GUID: %u) follow to %s (GUID: %u)", _owner->GetGUID().GetCounter(), + TC_LOG_DEBUG("misc", "Player (GUID: %u) follows %s (GUID: %u).", _owner->GetGUID().GetCounter(), target->GetTypeId() == TYPEID_PLAYER ? "player" : "creature", target->GetTypeId() == TYPEID_PLAYER ? target->GetGUID().GetCounter() : target->ToCreature()->GetSpawnId()); Mutate(new FollowMovementGenerator<Player>(target, dist, angle), slot); } else { - TC_LOG_DEBUG("misc", "Creature (Entry: %u GUID: %u) follow to %s (GUID: %u)", + TC_LOG_DEBUG("misc", "Creature (Entry: %u GUID: %u) follows %s (GUID: %u).", _owner->GetEntry(), _owner->GetGUID().GetCounter(), target->GetTypeId() == TYPEID_PLAYER ? "player" : "creature", target->GetTypeId() == TYPEID_PLAYER ? target->GetGUID().GetCounter() : target->ToCreature()->GetSpawnId()); @@ -291,12 +291,12 @@ void MotionMaster::MovePoint(uint32 id, float x, float y, float z, bool generate { if (_owner->GetTypeId() == TYPEID_PLAYER) { - TC_LOG_DEBUG("misc", "Player (GUID: %u) targeted point (Id: %u X: %f Y: %f Z: %f)", _owner->GetGUID().GetCounter(), id, x, y, z); + TC_LOG_DEBUG("misc", "Player (GUID: %u) targeted point (Id: %u X: %f Y: %f Z: %f).", _owner->GetGUID().GetCounter(), id, x, y, z); Mutate(new PointMovementGenerator<Player>(id, x, y, z, generatePath), MOTION_SLOT_ACTIVE); } else { - TC_LOG_DEBUG("misc", "Creature (Entry: %u GUID: %u) targeted point (ID: %u X: %f Y: %f Z: %f)", + TC_LOG_DEBUG("misc", "Creature (Entry: %u GUID: %u) targeted point (ID: %u X: %f Y: %f Z: %f).", _owner->GetEntry(), _owner->GetGUID().GetCounter(), id, x, y, z); Mutate(new PointMovementGenerator<Creature>(id, x, y, z, generatePath), MOTION_SLOT_ACTIVE); } @@ -307,7 +307,7 @@ void MotionMaster::MoveLand(uint32 id, Position const& pos) float x, y, z; pos.GetPosition(x, y, z); - TC_LOG_DEBUG("misc", "Creature (Entry: %u) landing point (ID: %u X: %f Y: %f Z: %f)", _owner->GetEntry(), id, x, y, z); + TC_LOG_DEBUG("misc", "Creature (Entry: %u) landing point (ID: %u X: %f Y: %f Z: %f).", _owner->GetEntry(), id, x, y, z); Movement::MoveSplineInit init(_owner); init.MoveTo(x, y, z); @@ -321,7 +321,7 @@ void MotionMaster::MoveTakeoff(uint32 id, Position const& pos) float x, y, z; pos.GetPosition(x, y, z); - TC_LOG_DEBUG("misc", "Creature (Entry: %u) landing point (ID: %u X: %f Y: %f Z: %f)", _owner->GetEntry(), id, x, y, z); + TC_LOG_DEBUG("misc", "Creature (Entry: %u) landing point (ID: %u X: %f Y: %f Z: %f).", _owner->GetEntry(), id, x, y, z); Movement::MoveSplineInit init(_owner); init.MoveTo(x, y, z); @@ -366,12 +366,12 @@ void MotionMaster::MoveJumpTo(float angle, float speedXY, float speedZ) float moveTimeHalf = speedZ / Movement::gravity; float dist = 2 * moveTimeHalf * speedXY; _owner->GetClosePoint(x, y, z, _owner->GetObjectSize(), dist, angle); - MoveJump(x, y, z, speedXY, speedZ); + MoveJump(x, y, z, 0.0f, speedXY, speedZ); } -void MotionMaster::MoveJump(float x, float y, float z, float speedXY, float speedZ, uint32 id) +void MotionMaster::MoveJump(float x, float y, float z, float o, float speedXY, float speedZ, uint32 id, bool hasOrientation /* = false*/) { - TC_LOG_DEBUG("misc", "Unit (GUID: %u) jump to point (X: %f Y: %f Z: %f)", _owner->GetGUID().GetCounter(), x, y, z); + TC_LOG_DEBUG("misc", "Unit (GUID: %u) jumps to point (X: %f Y: %f Z: %f).", _owner->GetGUID().GetCounter(), x, y, z); if (speedXY <= 0.1f) return; @@ -382,6 +382,8 @@ void MotionMaster::MoveJump(float x, float y, float z, float speedXY, float spee init.MoveTo(x, y, z, false); init.SetParabolic(max_height, 0); init.SetVelocity(speedXY); + if (hasOrientation) + init.SetFacing(o); init.Launch(); Mutate(new EffectMovementGenerator(id), MOTION_SLOT_CONTROLLED); } @@ -447,7 +449,7 @@ void MotionMaster::MoveFall(uint32 id /*=0*/) float tz = _owner->GetMap()->GetHeight(_owner->GetPhaseMask(), _owner->GetPositionX(), _owner->GetPositionY(), _owner->GetPositionZ(), true, MAX_FALL_DISTANCE); if (tz <= INVALID_HEIGHT) { - TC_LOG_DEBUG("misc", "MotionMaster::MoveFall: unable retrive a proper height at map %u (x: %f, y: %f, z: %f).", + TC_LOG_DEBUG("misc", "MotionMaster::MoveFall: unable to retrieve a proper height at map %u (x: %f, y: %f, z: %f).", _owner->GetMap()->GetId(), _owner->GetPositionX(), _owner->GetPositionY(), _owner->GetPositionZ()); return; } @@ -476,12 +478,12 @@ void MotionMaster::MoveCharge(float x, float y, float z, float speed /*= SPEED_C if (_owner->GetTypeId() == TYPEID_PLAYER) { - TC_LOG_DEBUG("misc", "Player (GUID: %u) charge point (X: %f Y: %f Z: %f)", _owner->GetGUID().GetCounter(), x, y, z); + TC_LOG_DEBUG("misc", "Player (GUID: %u) charged point (X: %f Y: %f Z: %f).", _owner->GetGUID().GetCounter(), x, y, z); Mutate(new PointMovementGenerator<Player>(id, x, y, z, generatePath, speed), MOTION_SLOT_CONTROLLED); } else { - TC_LOG_DEBUG("misc", "Creature (Entry: %u GUID: %u) charge point (X: %f Y: %f Z: %f)", + TC_LOG_DEBUG("misc", "Creature (Entry: %u GUID: %u) charged point (X: %f Y: %f Z: %f).", _owner->GetEntry(), _owner->GetGUID().GetCounter(), x, y, z); Mutate(new PointMovementGenerator<Creature>(id, x, y, z, generatePath, speed), MOTION_SLOT_CONTROLLED); } @@ -504,7 +506,7 @@ void MotionMaster::MoveSeekAssistance(float x, float y, float z) { if (_owner->GetTypeId() == TYPEID_PLAYER) { - TC_LOG_ERROR("misc", "Player (GUID: %u) attempt to seek assistance", _owner->GetGUID().GetCounter()); + TC_LOG_ERROR("misc", "Player (GUID: %u) attempted to seek assistance.", _owner->GetGUID().GetCounter()); } else { @@ -520,11 +522,11 @@ void MotionMaster::MoveSeekAssistanceDistract(uint32 time) { if (_owner->GetTypeId() == TYPEID_PLAYER) { - TC_LOG_ERROR("misc", "Player (GUID: %u) attempt to call distract after assistance", _owner->GetGUID().GetCounter()); + TC_LOG_ERROR("misc", "Player (GUID: %u) attempted to call distract assistance.", _owner->GetGUID().GetCounter()); } else { - TC_LOG_DEBUG("misc", "Creature (Entry: %u GUID: %u) is distracted after assistance call (Time: %u)", + TC_LOG_DEBUG("misc", "Creature (Entry: %u GUID: %u) is distracted after assistance call (Time: %u).", _owner->GetEntry(), _owner->GetGUID().GetCounter(), time); Mutate(new AssistanceDistractMovementGenerator(time), MOTION_SLOT_ACTIVE); } @@ -537,14 +539,14 @@ void MotionMaster::MoveFleeing(Unit* enemy, uint32 time) if (_owner->GetTypeId() == TYPEID_PLAYER) { - TC_LOG_DEBUG("misc", "Player (GUID: %u) flee from %s (GUID: %u)", _owner->GetGUID().GetCounter(), + TC_LOG_DEBUG("misc", "Player (GUID: %u) flees from %s (GUID: %u).", _owner->GetGUID().GetCounter(), enemy->GetTypeId() == TYPEID_PLAYER ? "player" : "creature", enemy->GetTypeId() == TYPEID_PLAYER ? enemy->GetGUID().GetCounter() : enemy->ToCreature()->GetSpawnId()); Mutate(new FleeingMovementGenerator<Player>(enemy->GetGUID()), MOTION_SLOT_CONTROLLED); } else { - TC_LOG_DEBUG("misc", "Creature (Entry: %u GUID: %u) flee from %s (GUID: %u)%s", + TC_LOG_DEBUG("misc", "Creature (Entry: %u GUID: %u) flees from %s (GUID: %u)%s.", _owner->GetEntry(), _owner->GetGUID().GetCounter(), enemy->GetTypeId() == TYPEID_PLAYER ? "player" : "creature", enemy->GetTypeId() == TYPEID_PLAYER ? enemy->GetGUID().GetCounter() : enemy->ToCreature()->GetSpawnId(), @@ -562,20 +564,20 @@ void MotionMaster::MoveTaxiFlight(uint32 path, uint32 pathnode) { if (path < sTaxiPathNodesByPath.size()) { - TC_LOG_DEBUG("misc", "%s taxi to (Path %u node %u)", _owner->GetName().c_str(), path, pathnode); + TC_LOG_DEBUG("misc", "%s taxi to (Path %u node %u).", _owner->GetName().c_str(), path, pathnode); FlightPathMovementGenerator* mgen = new FlightPathMovementGenerator(pathnode); mgen->LoadPath(_owner->ToPlayer()); Mutate(mgen, MOTION_SLOT_CONTROLLED); } else { - TC_LOG_ERROR("misc", "%s attempt taxi to (not existed Path %u node %u)", + TC_LOG_ERROR("misc", "%s attempted taxi to (non-existing Path %u node %u).", _owner->GetName().c_str(), path, pathnode); } } else { - TC_LOG_ERROR("misc", "Creature (Entry: %u GUID: %u) attempt taxi to (Path %u node %u)", + TC_LOG_ERROR("misc", "Creature (Entry: %u GUID: %u) attempted taxi to (Path %u node %u).", _owner->GetEntry(), _owner->GetGUID().GetCounter(), path, pathnode); } } @@ -587,11 +589,11 @@ void MotionMaster::MoveDistract(uint32 timer) if (_owner->GetTypeId() == TYPEID_PLAYER) { - TC_LOG_DEBUG("misc", "Player (GUID: %u) distracted (timer: %u)", _owner->GetGUID().GetCounter(), timer); + TC_LOG_DEBUG("misc", "Player (GUID: %u) distracted (timer: %u).", _owner->GetGUID().GetCounter(), timer); } else { - TC_LOG_DEBUG("misc", "Creature (Entry: %u GUID: %u) (timer: %u)", + TC_LOG_DEBUG("misc", "Creature (Entry: %u GUID: %u) distracted (timer: %u)", _owner->GetEntry(), _owner->GetGUID().GetCounter(), timer); } @@ -643,7 +645,7 @@ void MotionMaster::MovePath(uint32 path_id, bool repeatable) //Mutate(new WaypointMovementGenerator<Player>(path_id, repeatable)): Mutate(new WaypointMovementGenerator<Creature>(path_id, repeatable), MOTION_SLOT_IDLE); - TC_LOG_DEBUG("misc", "%s (GUID: %u) start moving over path(Id:%u, repeatable: %s)", + TC_LOG_DEBUG("misc", "%s (GUID: %u) starts moving over path(Id:%u, repeatable: %s).", _owner->GetTypeId() == TYPEID_PLAYER ? "Player" : "Creature", _owner->GetGUID().GetCounter(), path_id, repeatable ? "YES" : "NO"); } diff --git a/src/server/game/Movement/MotionMaster.h b/src/server/game/Movement/MotionMaster.h index ce0f1f7836e..76ae12986d5 100644 --- a/src/server/game/Movement/MotionMaster.h +++ b/src/server/game/Movement/MotionMaster.h @@ -181,9 +181,11 @@ class MotionMaster //: private std::stack<MovementGenerator *> void MoveCharge(PathGenerator const& path, float speed = SPEED_CHARGE); void MoveKnockbackFrom(float srcX, float srcY, float speedXY, float speedZ); void MoveJumpTo(float angle, float speedXY, float speedZ); - void MoveJump(Position const& pos, float speedXY, float speedZ, uint32 id = EVENT_JUMP) - { MoveJump(pos.m_positionX, pos.m_positionY, pos.m_positionZ, speedXY, speedZ, id); } - void MoveJump(float x, float y, float z, float speedXY, float speedZ, uint32 id = EVENT_JUMP); + void MoveJump(Position const& pos, float speedXY, float speedZ, uint32 id = EVENT_JUMP, bool hasOrientation = false) + { + MoveJump(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), speedXY, speedZ, id, hasOrientation); + } + void MoveJump(float x, float y, float z, float o, float speedXY, float speedZ, uint32 id = EVENT_JUMP, bool hasOrientation = false); void MoveCirclePath(float x, float y, float z, float radius, bool clockwise, uint8 stepCount); void MoveSmoothPath(uint32 pointId, G3D::Vector3 const* pathPoints, size_t pathSize, bool walk); void MoveFall(uint32 id = 0); diff --git a/src/server/game/OutdoorPvP/OutdoorPvP.cpp b/src/server/game/OutdoorPvP/OutdoorPvP.cpp index 868cba9a5b9..d329ab27de9 100644 --- a/src/server/game/OutdoorPvP/OutdoorPvP.cpp +++ b/src/server/game/OutdoorPvP/OutdoorPvP.cpp @@ -687,7 +687,7 @@ void OutdoorPvP::BroadcastWorker(Worker& _worker, uint32 zoneId) void OutdoorPvP::SetMapFromZone(uint32 zone) { - AreaTableEntry const* areaTable = GetAreaEntryByAreaID(zone); + AreaTableEntry const* areaTable = sAreaTableStore.LookupEntry(zone); ASSERT(areaTable); Map* map = sMapMgr->CreateBaseMap(areaTable->mapid); ASSERT(!map->Instanceable()); diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp index 2922e4ef58d..07ac1a2ed5b 100644 --- a/src/server/game/Scripting/ScriptLoader.cpp +++ b/src/server/game/Scripting/ScriptLoader.cpp @@ -18,1404 +18,36 @@ #include "ScriptLoader.h" #include "World.h" -// spells -void AddSC_deathknight_spell_scripts(); -void AddSC_druid_spell_scripts(); -void AddSC_generic_spell_scripts(); -void AddSC_hunter_spell_scripts(); -void AddSC_mage_spell_scripts(); -void AddSC_paladin_spell_scripts(); -void AddSC_priest_spell_scripts(); -void AddSC_rogue_spell_scripts(); -void AddSC_shaman_spell_scripts(); -void AddSC_warlock_spell_scripts(); -void AddSC_warrior_spell_scripts(); -void AddSC_quest_spell_scripts(); -void AddSC_item_spell_scripts(); -void AddSC_holiday_spell_scripts(); - +void AddSpellsScripts(); void AddSC_SmartScripts(); - -//Commands -void AddSC_account_commandscript(); -void AddSC_achievement_commandscript(); -void AddSC_ahbot_commandscript(); -void AddSC_arena_commandscript(); -void AddSC_ban_commandscript(); -void AddSC_bf_commandscript(); -void AddSC_cast_commandscript(); -void AddSC_character_commandscript(); -void AddSC_cheat_commandscript(); -void AddSC_debug_commandscript(); -void AddSC_deserter_commandscript(); -void AddSC_disable_commandscript(); -void AddSC_event_commandscript(); -void AddSC_gm_commandscript(); -void AddSC_go_commandscript(); -void AddSC_gobject_commandscript(); -void AddSC_group_commandscript(); -void AddSC_guild_commandscript(); -void AddSC_honor_commandscript(); -void AddSC_instance_commandscript(); -void AddSC_learn_commandscript(); -void AddSC_lfg_commandscript(); -void AddSC_list_commandscript(); -void AddSC_lookup_commandscript(); -void AddSC_message_commandscript(); -void AddSC_misc_commandscript(); -void AddSC_mmaps_commandscript(); -void AddSC_modify_commandscript(); -void AddSC_npc_commandscript(); -void AddSC_pet_commandscript(); -void AddSC_quest_commandscript(); -void AddSC_rbac_commandscript(); -void AddSC_reload_commandscript(); -void AddSC_reset_commandscript(); -void AddSC_send_commandscript(); -void AddSC_server_commandscript(); -void AddSC_tele_commandscript(); -void AddSC_ticket_commandscript(); -void AddSC_titles_commandscript(); -void AddSC_wp_commandscript(); +void AddCommandsScripts(); #ifdef SCRIPTS -//world -void AddSC_areatrigger_scripts(); -void AddSC_emerald_dragons(); -void AddSC_generic_creature(); -void AddSC_go_scripts(); -void AddSC_guards(); -void AddSC_item_scripts(); -void AddSC_npc_professions(); -void AddSC_npc_innkeeper(); -void AddSC_npcs_special(); -void AddSC_achievement_scripts(); -void AddSC_action_ip_logger(); -void AddSC_duel_reset(); - -//eastern kingdoms -void AddSC_alterac_valley(); //Alterac Valley -void AddSC_boss_balinda(); -void AddSC_boss_drekthar(); -void AddSC_boss_galvangar(); -void AddSC_boss_vanndar(); -void AddSC_blackrock_depths(); //Blackrock Depths -void AddSC_boss_ambassador_flamelash(); -void AddSC_boss_draganthaurissan(); -void AddSC_boss_general_angerforge(); -void AddSC_boss_high_interrogator_gerstahn(); -void AddSC_boss_magmus(); -void AddSC_boss_moira_bronzebeard(); -void AddSC_boss_tomb_of_seven(); -void AddSC_instance_blackrock_depths(); -void AddSC_boss_drakkisath(); //Blackrock Spire -void AddSC_boss_halycon(); -void AddSC_boss_highlordomokk(); -void AddSC_boss_mothersmolderweb(); -void AddSC_boss_overlordwyrmthalak(); -void AddSC_boss_shadowvosh(); -void AddSC_boss_thebeast(); -void AddSC_boss_warmastervoone(); -void AddSC_boss_quatermasterzigris(); -void AddSC_boss_pyroguard_emberseer(); -void AddSC_boss_gyth(); -void AddSC_boss_rend_blackhand(); -void AddSC_boss_gizrul_the_slavener(); -void AddSC_boss_urok_doomhowl(); -void AddSC_boss_lord_valthalak(); -void AddSC_instance_blackrock_spire(); -void AddSC_boss_razorgore(); //Blackwing lair -void AddSC_boss_vaelastrasz(); -void AddSC_boss_broodlord(); -void AddSC_boss_firemaw(); -void AddSC_boss_ebonroc(); -void AddSC_boss_flamegor(); -void AddSC_boss_chromaggus(); -void AddSC_boss_nefarian(); -void AddSC_instance_blackwing_lair(); -void AddSC_deadmines(); //Deadmines -void AddSC_instance_deadmines(); -void AddSC_boss_mr_smite(); -void AddSC_gnomeregan(); //Gnomeregan -void AddSC_instance_gnomeregan(); -void AddSC_boss_attumen(); //Karazhan -void AddSC_boss_curator(); -void AddSC_boss_maiden_of_virtue(); -void AddSC_boss_shade_of_aran(); -void AddSC_boss_malchezaar(); -void AddSC_boss_terestian_illhoof(); -void AddSC_boss_moroes(); -void AddSC_bosses_opera(); -void AddSC_boss_netherspite(); -void AddSC_instance_karazhan(); -void AddSC_karazhan(); -void AddSC_boss_nightbane(); -void AddSC_boss_felblood_kaelthas(); // Magister's Terrace -void AddSC_boss_selin_fireheart(); -void AddSC_boss_vexallus(); -void AddSC_boss_priestess_delrissa(); -void AddSC_instance_magisters_terrace(); -void AddSC_magisters_terrace(); -void AddSC_boss_lucifron(); //Molten core -void AddSC_boss_magmadar(); -void AddSC_boss_gehennas(); -void AddSC_boss_garr(); -void AddSC_boss_baron_geddon(); -void AddSC_boss_shazzrah(); -void AddSC_boss_golemagg(); -void AddSC_boss_sulfuron(); -void AddSC_boss_majordomo(); -void AddSC_boss_ragnaros(); -void AddSC_instance_molten_core(); -void AddSC_instance_ragefire_chasm(); //Ragefire Chasm -void AddSC_the_scarlet_enclave(); //Scarlet Enclave -void AddSC_the_scarlet_enclave_c1(); -void AddSC_the_scarlet_enclave_c2(); -void AddSC_the_scarlet_enclave_c5(); -void AddSC_boss_arcanist_doan(); //Scarlet Monastery -void AddSC_boss_azshir_the_sleepless(); -void AddSC_boss_bloodmage_thalnos(); -void AddSC_boss_headless_horseman(); -void AddSC_boss_herod(); -void AddSC_boss_high_inquisitor_fairbanks(); -void AddSC_boss_houndmaster_loksey(); -void AddSC_boss_interrogator_vishas(); -void AddSC_boss_scorn(); -void AddSC_instance_scarlet_monastery(); -void AddSC_boss_mograine_and_whitemane(); -void AddSC_boss_darkmaster_gandling(); //Scholomance -void AddSC_boss_death_knight_darkreaver(); -void AddSC_boss_theolenkrastinov(); -void AddSC_boss_illuciabarov(); -void AddSC_boss_instructormalicia(); -void AddSC_boss_jandicebarov(); -void AddSC_boss_kormok(); -void AddSC_boss_lordalexeibarov(); -void AddSC_boss_lorekeeperpolkelt(); -void AddSC_boss_rasfrost(); -void AddSC_boss_theravenian(); -void AddSC_boss_vectus(); -void AddSC_boss_kirtonos_the_herald(); -void AddSC_instance_scholomance(); -void AddSC_shadowfang_keep(); //Shadowfang keep -void AddSC_instance_shadowfang_keep(); -void AddSC_boss_magistrate_barthilas(); //Stratholme -void AddSC_boss_maleki_the_pallid(); -void AddSC_boss_nerubenkan(); -void AddSC_boss_cannon_master_willey(); -void AddSC_boss_baroness_anastari(); -void AddSC_boss_ramstein_the_gorger(); -void AddSC_boss_timmy_the_cruel(); -void AddSC_boss_postmaster_malown(); -void AddSC_boss_baron_rivendare(); -void AddSC_boss_dathrohan_balnazzar(); -void AddSC_boss_order_of_silver_hand(); -void AddSC_instance_stratholme(); -void AddSC_stratholme(); -void AddSC_sunken_temple(); // Sunken Temple -void AddSC_instance_sunken_temple(); -void AddSC_instance_sunwell_plateau(); //Sunwell Plateau -void AddSC_boss_kalecgos(); -void AddSC_boss_brutallus(); -void AddSC_boss_felmyst(); -void AddSC_boss_eredar_twins(); -void AddSC_boss_muru(); -void AddSC_boss_kiljaeden(); -void AddSC_sunwell_plateau(); -void AddSC_boss_archaedas(); //Uldaman -void AddSC_boss_ironaya(); -void AddSC_uldaman(); -void AddSC_instance_uldaman(); -void AddSC_instance_the_stockade(); //The Stockade -void AddSC_boss_akilzon(); //Zul'Aman -void AddSC_boss_halazzi(); -void AddSC_boss_hex_lord_malacrass(); -void AddSC_boss_janalai(); -void AddSC_boss_nalorakk(); -void AddSC_boss_zuljin(); -void AddSC_instance_zulaman(); -void AddSC_zulaman(); -void AddSC_boss_jeklik(); //Zul'Gurub -void AddSC_boss_venoxis(); -void AddSC_boss_marli(); -void AddSC_boss_mandokir(); -void AddSC_boss_gahzranka(); -void AddSC_boss_thekal(); -void AddSC_boss_arlokk(); -void AddSC_boss_jindo(); -void AddSC_boss_hakkar(); -void AddSC_boss_grilek(); -void AddSC_boss_hazzarah(); -void AddSC_boss_renataki(); -void AddSC_boss_wushoolay(); -void AddSC_instance_zulgurub(); - -//void AddSC_alterac_mountains(); -void AddSC_arathi_highlands(); -void AddSC_blasted_lands(); -void AddSC_burning_steppes(); -void AddSC_duskwood(); -void AddSC_eastern_plaguelands(); -void AddSC_ghostlands(); -void AddSC_hinterlands(); -void AddSC_isle_of_queldanas(); -void AddSC_loch_modan(); -void AddSC_redridge_mountains(); -void AddSC_silverpine_forest(); -void AddSC_stormwind_city(); -void AddSC_stranglethorn_vale(); -void AddSC_swamp_of_sorrows(); -void AddSC_tirisfal_glades(); -void AddSC_undercity(); -void AddSC_western_plaguelands(); -void AddSC_wetlands(); - -//kalimdor -void AddSC_blackfathom_deeps(); //Blackfathom Depths -void AddSC_boss_gelihast(); -void AddSC_boss_kelris(); -void AddSC_boss_aku_mai(); -void AddSC_instance_blackfathom_deeps(); -void AddSC_hyjal(); //CoT Battle for Mt. Hyjal -void AddSC_boss_archimonde(); -void AddSC_instance_mount_hyjal(); -void AddSC_hyjal_trash(); -void AddSC_boss_rage_winterchill(); -void AddSC_boss_anetheron(); -void AddSC_boss_kazrogal(); -void AddSC_boss_azgalor(); -void AddSC_boss_captain_skarloc(); //CoT Old Hillsbrad -void AddSC_boss_epoch_hunter(); -void AddSC_boss_lieutenant_drake(); -void AddSC_instance_old_hillsbrad(); -void AddSC_old_hillsbrad(); -void AddSC_boss_aeonus(); //CoT The Black Morass -void AddSC_boss_chrono_lord_deja(); -void AddSC_boss_temporus(); -void AddSC_the_black_morass(); -void AddSC_instance_the_black_morass(); -void AddSC_boss_epoch(); //CoT Culling Of Stratholme -void AddSC_boss_infinite_corruptor(); -void AddSC_boss_salramm(); -void AddSC_boss_mal_ganis(); -void AddSC_boss_meathook(); -void AddSC_culling_of_stratholme(); -void AddSC_instance_culling_of_stratholme(); -void AddSC_instance_dire_maul(); //Dire Maul -void AddSC_boss_celebras_the_cursed(); //Maraudon -void AddSC_boss_landslide(); -void AddSC_boss_noxxion(); -void AddSC_boss_ptheradras(); -void AddSC_instance_maraudon(); -void AddSC_boss_onyxia(); //Onyxia's Lair -void AddSC_instance_onyxias_lair(); -void AddSC_boss_tuten_kash(); //Razorfen Downs -void AddSC_boss_mordresh_fire_eye(); -void AddSC_boss_glutton(); -void AddSC_boss_amnennar_the_coldbringer(); -void AddSC_razorfen_downs(); -void AddSC_instance_razorfen_downs(); -void AddSC_razorfen_kraul(); //Razorfen Kraul -void AddSC_instance_razorfen_kraul(); -void AddSC_boss_kurinnaxx(); //Ruins of ahn'qiraj -void AddSC_boss_rajaxx(); -void AddSC_boss_moam(); -void AddSC_boss_buru(); -void AddSC_boss_ayamiss(); -void AddSC_boss_ossirian(); -void AddSC_instance_ruins_of_ahnqiraj(); -void AddSC_boss_cthun(); //Temple of ahn'qiraj -void AddSC_boss_viscidus(); -void AddSC_boss_fankriss(); -void AddSC_boss_huhuran(); -void AddSC_bug_trio(); -void AddSC_boss_sartura(); -void AddSC_boss_skeram(); -void AddSC_boss_twinemperors(); -void AddSC_boss_ouro(); -void AddSC_npc_anubisath_sentinel(); -void AddSC_instance_temple_of_ahnqiraj(); -void AddSC_wailing_caverns(); //Wailing caverns -void AddSC_instance_wailing_caverns(); -void AddSC_boss_zum_rah(); //Zul'Farrak -void AddSC_zulfarrak(); -void AddSC_instance_zulfarrak(); - -void AddSC_ashenvale(); -void AddSC_azshara(); -void AddSC_azuremyst_isle(); -void AddSC_bloodmyst_isle(); -void AddSC_boss_azuregos(); -void AddSC_darkshore(); -void AddSC_desolace(); -void AddSC_durotar(); -void AddSC_dustwallow_marsh(); -void AddSC_felwood(); -void AddSC_feralas(); -void AddSC_moonglade(); -void AddSC_orgrimmar(); -void AddSC_silithus(); -void AddSC_stonetalon_mountains(); -void AddSC_tanaris(); -void AddSC_the_barrens(); -void AddSC_thousand_needles(); -void AddSC_thunder_bluff(); -void AddSC_ungoro_crater(); -void AddSC_winterspring(); - -// 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(); - -// Azjol-Nerub - Azjol-Nerub -void AddSC_boss_krik_thir(); -void AddSC_boss_hadronox(); -void AddSC_boss_anub_arak(); -void AddSC_instance_azjol_nerub(); - -// 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_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(); -void AddSC_instance_trial_of_the_champion(); -void AddSC_trial_of_the_champion(); -void AddSC_boss_anubarak_trial(); //Trial of the Crusader -void AddSC_boss_faction_champions(); -void AddSC_boss_jaraxxus(); -void AddSC_boss_northrend_beasts(); -void AddSC_boss_twin_valkyr(); -void AddSC_trial_of_the_crusader(); -void AddSC_instance_trial_of_the_crusader(); -void AddSC_boss_anubrekhan(); //Naxxramas -void AddSC_boss_maexxna(); -void AddSC_boss_patchwerk(); -void AddSC_boss_grobbulus(); -void AddSC_boss_razuvious(); -void AddSC_boss_kelthuzad(); -void AddSC_boss_loatheb(); -void AddSC_boss_noth(); -void AddSC_boss_gluth(); -void AddSC_boss_sapphiron(); -void AddSC_boss_four_horsemen(); -void AddSC_boss_faerlina(); -void AddSC_boss_heigan(); -void AddSC_boss_gothik(); -void AddSC_boss_thaddius(); -void AddSC_instance_naxxramas(); -void AddSC_boss_nexus_commanders(); // The Nexus Nexus -void AddSC_boss_magus_telestra(); -void AddSC_boss_anomalus(); -void AddSC_boss_ormorok(); -void AddSC_boss_keristrasza(); -void AddSC_instance_nexus(); -void AddSC_boss_drakos(); //The Nexus The Oculus -void AddSC_boss_urom(); -void AddSC_boss_varos(); -void AddSC_boss_eregos(); -void AddSC_instance_oculus(); -void AddSC_oculus(); -void AddSC_boss_malygos(); // The Nexus: Eye of Eternity -void AddSC_instance_eye_of_eternity(); -void AddSC_boss_sartharion(); //Obsidian Sanctum -void AddSC_obsidian_sanctum(); -void AddSC_instance_obsidian_sanctum(); -void AddSC_boss_bjarngrim(); //Ulduar Halls of Lightning -void AddSC_boss_loken(); -void AddSC_boss_ionar(); -void AddSC_boss_volkhan(); -void AddSC_instance_halls_of_lightning(); -void AddSC_boss_maiden_of_grief(); //Ulduar Halls of Stone -void AddSC_boss_krystallus(); -void AddSC_boss_sjonnir(); -void AddSC_instance_halls_of_stone(); -void AddSC_halls_of_stone(); -void AddSC_boss_auriaya(); //Ulduar Ulduar -void AddSC_boss_flame_leviathan(); -void AddSC_boss_ignis(); -void AddSC_boss_razorscale(); -void AddSC_boss_xt002(); -void AddSC_boss_kologarn(); -void AddSC_boss_assembly_of_iron(); -void AddSC_boss_general_vezax(); -void AddSC_boss_mimiron(); -void AddSC_boss_hodir(); -void AddSC_boss_freya(); -void AddSC_boss_yogg_saron(); -void AddSC_boss_algalon_the_observer(); -void AddSC_instance_ulduar(); - -// 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_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(); - -// Vault of Archavon -void AddSC_boss_archavon(); -void AddSC_boss_emalon(); -void AddSC_boss_koralon(); -void AddSC_boss_toravon(); -void AddSC_instance_vault_of_archavon(); - -void AddSC_boss_cyanigosa(); //Violet Hold -void AddSC_boss_erekem(); -void AddSC_boss_ichoron(); -void AddSC_boss_lavanthor(); -void AddSC_boss_moragg(); -void AddSC_boss_xevozz(); -void AddSC_boss_zuramat(); -void AddSC_instance_violet_hold(); -void AddSC_violet_hold(); -void AddSC_instance_forge_of_souls(); //Forge of Souls -void AddSC_forge_of_souls(); -void AddSC_boss_bronjahm(); -void AddSC_boss_devourer_of_souls(); -void AddSC_instance_pit_of_saron(); //Pit of Saron -void AddSC_pit_of_saron(); -void AddSC_boss_garfrost(); -void AddSC_boss_ick(); -void AddSC_boss_tyrannus(); -void AddSC_instance_halls_of_reflection(); // Halls of Reflection -void AddSC_halls_of_reflection(); -void AddSC_boss_falric(); -void AddSC_boss_marwyn(); -void AddSC_boss_lord_marrowgar(); // Icecrown Citadel -void AddSC_boss_lady_deathwhisper(); -void AddSC_boss_icecrown_gunship_battle(); -void AddSC_boss_deathbringer_saurfang(); -void AddSC_boss_festergut(); -void AddSC_boss_rotface(); -void AddSC_boss_professor_putricide(); -void AddSC_boss_blood_prince_council(); -void AddSC_boss_blood_queen_lana_thel(); -void AddSC_boss_valithria_dreamwalker(); -void AddSC_boss_sindragosa(); -void AddSC_boss_the_lich_king(); -void AddSC_icecrown_citadel_teleport(); -void AddSC_instance_icecrown_citadel(); -void AddSC_icecrown_citadel(); -void AddSC_instance_ruby_sanctum(); // Ruby Sanctum -void AddSC_ruby_sanctum(); -void AddSC_boss_baltharus_the_warborn(); -void AddSC_boss_saviana_ragefire(); -void AddSC_boss_general_zarithrian(); -void AddSC_boss_halion(); - -void AddSC_dalaran(); -void AddSC_borean_tundra(); -void AddSC_dragonblight(); -void AddSC_grizzly_hills(); -void AddSC_howling_fjord(); -void AddSC_icecrown(); -void AddSC_sholazar_basin(); -void AddSC_storm_peaks(); -void AddSC_wintergrasp(); -void AddSC_zuldrak(); -void AddSC_crystalsong_forest(); -void AddSC_isle_of_conquest(); - -// Outland - -// Auchindoun - Auchenai Crypts -void AddSC_boss_shirrak_the_dead_watcher(); -void AddSC_boss_exarch_maladaar(); -void AddSC_instance_auchenai_crypts(); - -// Auchindoun - Mana Tombs -void AddSC_boss_pandemonius(); -void AddSC_boss_nexusprince_shaffar(); -void AddSC_instance_mana_tombs(); - -// Auchindoun - Sekketh Halls -void AddSC_boss_darkweaver_syth(); -void AddSC_boss_talon_king_ikiss(); -void AddSC_boss_anzu(); -void AddSC_instance_sethekk_halls(); - -// Auchindoun - Shadow Labyrinth -void AddSC_boss_ambassador_hellmaw(); -void AddSC_boss_blackheart_the_inciter(); -void AddSC_boss_grandmaster_vorpil(); -void AddSC_boss_murmur(); -void AddSC_instance_shadow_labyrinth(); - -// Black Temple -void AddSC_black_temple(); -void AddSC_boss_illidan(); -void AddSC_boss_shade_of_akama(); -void AddSC_boss_supremus(); -void AddSC_boss_gurtogg_bloodboil(); -void AddSC_boss_mother_shahraz(); -void AddSC_boss_reliquary_of_souls(); -void AddSC_boss_teron_gorefiend(); -void AddSC_boss_najentus(); -void AddSC_boss_illidari_council(); -void AddSC_instance_black_temple(); - -// Coilfang Reservoir - Serpent Shrine Cavern -void AddSC_boss_fathomlord_karathress(); -void AddSC_boss_hydross_the_unstable(); -void AddSC_boss_lady_vashj(); -void AddSC_boss_leotheras_the_blind(); -void AddSC_boss_morogrim_tidewalker(); -void AddSC_instance_serpentshrine_cavern(); -void AddSC_boss_the_lurker_below(); - -// Coilfang Reservoir - The Steam Vault -void AddSC_boss_hydromancer_thespia(); -void AddSC_boss_mekgineer_steamrigger(); -void AddSC_boss_warlord_kalithresh(); -void AddSC_instance_steam_vault(); - -// Coilfang Reservoir - The Slave Pens -void AddSC_instance_the_slave_pens(); -void AddSC_boss_mennu_the_betrayer(); -void AddSC_boss_rokmar_the_crackler(); -void AddSC_boss_quagmirran(); - -// Coilfang Reservoir - The Underbog -void AddSC_instance_the_underbog(); -void AddSC_boss_hungarfen(); -void AddSC_boss_the_black_stalker(); - -// Gruul's Lair -void AddSC_boss_gruul(); -void AddSC_boss_high_king_maulgar(); -void AddSC_instance_gruuls_lair(); -void AddSC_boss_broggok(); //HC Blood Furnace -void AddSC_boss_kelidan_the_breaker(); -void AddSC_boss_the_maker(); -void AddSC_instance_blood_furnace(); -void AddSC_boss_magtheridon(); //HC Magtheridon's Lair -void AddSC_instance_magtheridons_lair(); -void AddSC_boss_grand_warlock_nethekurse(); //HC Shattered Halls -void AddSC_boss_warbringer_omrogg(); -void AddSC_boss_warchief_kargath_bladefist(); -void AddSC_shattered_halls(); -void AddSC_instance_shattered_halls(); -void AddSC_boss_watchkeeper_gargolmar(); //HC Ramparts -void AddSC_boss_omor_the_unscarred(); -void AddSC_boss_vazruden_the_herald(); -void AddSC_instance_ramparts(); -void AddSC_arcatraz(); //TK Arcatraz -void AddSC_boss_zereketh_the_unbound(); -void AddSC_boss_dalliah_the_doomsayer(); -void AddSC_boss_wrath_scryer_soccothrates(); -void AddSC_boss_harbinger_skyriss(); -void AddSC_instance_arcatraz(); -void AddSC_boss_high_botanist_freywinn(); //TK Botanica -void AddSC_boss_laj(); -void AddSC_boss_warp_splinter(); -void AddSC_boss_thorngrin_the_tender(); -void AddSC_boss_commander_sarannis(); -void AddSC_instance_the_botanica(); -void AddSC_boss_alar(); //TK The Eye -void AddSC_boss_kaelthas(); -void AddSC_boss_void_reaver(); -void AddSC_boss_high_astromancer_solarian(); -void AddSC_instance_the_eye(); -void AddSC_the_eye(); -void AddSC_boss_gatewatcher_iron_hand(); //TK The Mechanar -void AddSC_boss_gatewatcher_gyrokill(); -void AddSC_boss_nethermancer_sepethrea(); -void AddSC_boss_pathaleon_the_calculator(); -void AddSC_boss_mechano_lord_capacitus(); -void AddSC_instance_mechanar(); - -void AddSC_blades_edge_mountains(); -void AddSC_boss_doomlordkazzak(); -void AddSC_boss_doomwalker(); -void AddSC_hellfire_peninsula(); -void AddSC_nagrand(); -void AddSC_netherstorm(); -void AddSC_shadowmoon_valley(); -void AddSC_shattrath_city(); -void AddSC_terokkar_forest(); -void AddSC_zangarmarsh(); - -// Events -void AddSC_event_childrens_week(); - -// Pets -void AddSC_deathknight_pet_scripts(); -void AddSC_generic_pet_scripts(); -void AddSC_hunter_pet_scripts(); -void AddSC_mage_pet_scripts(); -void AddSC_priest_pet_scripts(); -void AddSC_shaman_pet_scripts(); - -// battlegrounds - -// outdoor pvp -void AddSC_outdoorpvp_ep(); -void AddSC_outdoorpvp_hp(); -void AddSC_outdoorpvp_na(); -void AddSC_outdoorpvp_si(); -void AddSC_outdoorpvp_tf(); -void AddSC_outdoorpvp_zm(); - -// player -void AddSC_chat_log(); -void AddSC_action_ip_logger(); - +void AddWorldScripts(); +void AddEasternKingdomsScripts(); +void AddKalimdorScripts(); +void AddOutlandScripts(); +void AddNorthrendScripts(); +void AddEventsScripts(); +void AddPetScripts(); +void AddOutdoorPvPScripts(); +void AddCustomScripts(); #endif void AddScripts() { - AddSpellScripts(); + AddSpellsScripts(); AddSC_SmartScripts(); - AddCommandScripts(); + AddCommandsScripts(); #ifdef SCRIPTS AddWorldScripts(); AddEasternKingdomsScripts(); AddKalimdorScripts(); AddOutlandScripts(); AddNorthrendScripts(); - AddEventScripts(); + AddEventsScripts(); AddPetScripts(); - AddBattlegroundScripts(); AddOutdoorPvPScripts(); AddCustomScripts(); #endif } - -void AddSpellScripts() -{ - AddSC_deathknight_spell_scripts(); - AddSC_druid_spell_scripts(); - AddSC_generic_spell_scripts(); - AddSC_hunter_spell_scripts(); - AddSC_mage_spell_scripts(); - AddSC_paladin_spell_scripts(); - AddSC_priest_spell_scripts(); - AddSC_rogue_spell_scripts(); - AddSC_shaman_spell_scripts(); - AddSC_warlock_spell_scripts(); - AddSC_warrior_spell_scripts(); - AddSC_quest_spell_scripts(); - AddSC_item_spell_scripts(); - AddSC_holiday_spell_scripts(); -} - -void AddCommandScripts() -{ - AddSC_account_commandscript(); - AddSC_achievement_commandscript(); - AddSC_ahbot_commandscript(); - AddSC_arena_commandscript(); - AddSC_ban_commandscript(); - AddSC_bf_commandscript(); - AddSC_cast_commandscript(); - AddSC_character_commandscript(); - AddSC_cheat_commandscript(); - AddSC_debug_commandscript(); - AddSC_deserter_commandscript(); - AddSC_disable_commandscript(); - AddSC_event_commandscript(); - AddSC_gm_commandscript(); - AddSC_go_commandscript(); - AddSC_gobject_commandscript(); - AddSC_group_commandscript(); - AddSC_guild_commandscript(); - AddSC_honor_commandscript(); - AddSC_instance_commandscript(); - AddSC_learn_commandscript(); - AddSC_lookup_commandscript(); - AddSC_lfg_commandscript(); - AddSC_list_commandscript(); - AddSC_message_commandscript(); - AddSC_misc_commandscript(); - AddSC_mmaps_commandscript(); - AddSC_modify_commandscript(); - AddSC_npc_commandscript(); - AddSC_quest_commandscript(); - AddSC_pet_commandscript(); - AddSC_rbac_commandscript(); - AddSC_reload_commandscript(); - AddSC_reset_commandscript(); - AddSC_send_commandscript(); - AddSC_server_commandscript(); - AddSC_tele_commandscript(); - AddSC_ticket_commandscript(); - AddSC_titles_commandscript(); - AddSC_wp_commandscript(); -} - -void AddWorldScripts() -{ -#ifdef SCRIPTS - AddSC_areatrigger_scripts(); - AddSC_emerald_dragons(); - AddSC_generic_creature(); - AddSC_go_scripts(); - AddSC_guards(); - AddSC_item_scripts(); - AddSC_npc_professions(); - AddSC_npc_innkeeper(); - AddSC_npcs_special(); - AddSC_achievement_scripts(); - AddSC_chat_log(); // location: scripts\World\chat_log.cpp - // To avoid duplicate code, we check once /*ONLY*/ if logging is permitted or not. - if (sWorld->getBoolConfig(CONFIG_IP_BASED_ACTION_LOGGING)) - AddSC_action_ip_logger(); // location: scripts\World\action_ip_logger.cpp - AddSC_duel_reset(); -#endif -} - -void AddEasternKingdomsScripts() -{ -#ifdef SCRIPTS - AddSC_alterac_valley(); //Alterac Valley - AddSC_boss_balinda(); - AddSC_boss_drekthar(); - AddSC_boss_galvangar(); - AddSC_boss_vanndar(); - AddSC_blackrock_depths(); //Blackrock Depths - AddSC_boss_ambassador_flamelash(); - AddSC_boss_draganthaurissan(); - AddSC_boss_general_angerforge(); - AddSC_boss_high_interrogator_gerstahn(); - AddSC_boss_magmus(); - AddSC_boss_moira_bronzebeard(); - AddSC_boss_tomb_of_seven(); - AddSC_instance_blackrock_depths(); - AddSC_boss_drakkisath(); //Blackrock Spire - AddSC_boss_halycon(); - AddSC_boss_highlordomokk(); - AddSC_boss_mothersmolderweb(); - AddSC_boss_overlordwyrmthalak(); - AddSC_boss_shadowvosh(); - AddSC_boss_thebeast(); - AddSC_boss_warmastervoone(); - AddSC_boss_quatermasterzigris(); - AddSC_boss_pyroguard_emberseer(); - AddSC_boss_gyth(); - AddSC_boss_rend_blackhand(); - AddSC_boss_gizrul_the_slavener(); - AddSC_boss_urok_doomhowl(); - AddSC_boss_lord_valthalak(); - AddSC_instance_blackrock_spire(); - AddSC_boss_razorgore(); //Blackwing lair - AddSC_boss_vaelastrasz(); - AddSC_boss_broodlord(); - AddSC_boss_firemaw(); - AddSC_boss_ebonroc(); - AddSC_boss_flamegor(); - AddSC_boss_chromaggus(); - AddSC_boss_nefarian(); - AddSC_instance_blackwing_lair(); - AddSC_deadmines(); //Deadmines - AddSC_boss_mr_smite(); - AddSC_instance_deadmines(); - AddSC_gnomeregan(); //Gnomeregan - AddSC_instance_gnomeregan(); - AddSC_boss_attumen(); //Karazhan - AddSC_boss_curator(); - AddSC_boss_maiden_of_virtue(); - AddSC_boss_shade_of_aran(); - AddSC_boss_malchezaar(); - AddSC_boss_terestian_illhoof(); - AddSC_boss_moroes(); - AddSC_bosses_opera(); - AddSC_boss_netherspite(); - AddSC_instance_karazhan(); - AddSC_karazhan(); - AddSC_boss_nightbane(); - AddSC_boss_felblood_kaelthas(); // Magister's Terrace - AddSC_boss_selin_fireheart(); - AddSC_boss_vexallus(); - AddSC_boss_priestess_delrissa(); - AddSC_instance_magisters_terrace(); - AddSC_magisters_terrace(); - AddSC_boss_lucifron(); //Molten core - AddSC_boss_magmadar(); - AddSC_boss_gehennas(); - AddSC_boss_garr(); - AddSC_boss_baron_geddon(); - AddSC_boss_shazzrah(); - AddSC_boss_golemagg(); - AddSC_boss_sulfuron(); - AddSC_boss_majordomo(); - AddSC_boss_ragnaros(); - AddSC_instance_molten_core(); - AddSC_instance_ragefire_chasm(); //Ragefire Chasm - AddSC_the_scarlet_enclave(); //Scarlet Enclave - AddSC_the_scarlet_enclave_c1(); - AddSC_the_scarlet_enclave_c2(); - AddSC_the_scarlet_enclave_c5(); - AddSC_boss_arcanist_doan(); //Scarlet Monastery - AddSC_boss_azshir_the_sleepless(); - AddSC_boss_bloodmage_thalnos(); - AddSC_boss_headless_horseman(); - AddSC_boss_herod(); - AddSC_boss_high_inquisitor_fairbanks(); - AddSC_boss_houndmaster_loksey(); - AddSC_boss_interrogator_vishas(); - AddSC_boss_scorn(); - AddSC_instance_scarlet_monastery(); - AddSC_boss_mograine_and_whitemane(); - AddSC_boss_darkmaster_gandling(); //Scholomance - AddSC_boss_death_knight_darkreaver(); - AddSC_boss_theolenkrastinov(); - AddSC_boss_illuciabarov(); - AddSC_boss_instructormalicia(); - AddSC_boss_jandicebarov(); - AddSC_boss_kormok(); - AddSC_boss_lordalexeibarov(); - AddSC_boss_lorekeeperpolkelt(); - AddSC_boss_rasfrost(); - AddSC_boss_theravenian(); - AddSC_boss_vectus(); - AddSC_boss_kirtonos_the_herald(); - AddSC_instance_scholomance(); - AddSC_shadowfang_keep(); //Shadowfang keep - AddSC_instance_shadowfang_keep(); - AddSC_boss_magistrate_barthilas(); //Stratholme - AddSC_boss_maleki_the_pallid(); - AddSC_boss_nerubenkan(); - AddSC_boss_cannon_master_willey(); - AddSC_boss_baroness_anastari(); - AddSC_boss_ramstein_the_gorger(); - AddSC_boss_timmy_the_cruel(); - AddSC_boss_postmaster_malown(); - AddSC_boss_baron_rivendare(); - AddSC_boss_dathrohan_balnazzar(); - AddSC_boss_order_of_silver_hand(); - AddSC_instance_stratholme(); - AddSC_stratholme(); - AddSC_sunken_temple(); // Sunken Temple - AddSC_instance_sunken_temple(); - AddSC_instance_sunwell_plateau(); //Sunwell Plateau - AddSC_boss_kalecgos(); - AddSC_boss_brutallus(); - AddSC_boss_felmyst(); - AddSC_boss_eredar_twins(); - AddSC_boss_muru(); - AddSC_boss_kiljaeden(); - AddSC_sunwell_plateau(); - AddSC_instance_the_stockade(); //The Stockade - AddSC_boss_archaedas(); //Uldaman - AddSC_boss_ironaya(); - AddSC_uldaman(); - AddSC_instance_uldaman(); - AddSC_boss_akilzon(); //Zul'Aman - AddSC_boss_halazzi(); - AddSC_boss_hex_lord_malacrass(); - AddSC_boss_janalai(); - AddSC_boss_nalorakk(); - AddSC_boss_zuljin(); - AddSC_instance_zulaman(); - AddSC_zulaman(); - AddSC_boss_jeklik(); //Zul'Gurub - AddSC_boss_venoxis(); - AddSC_boss_marli(); - AddSC_boss_mandokir(); - AddSC_boss_gahzranka(); - AddSC_boss_thekal(); - AddSC_boss_arlokk(); - AddSC_boss_jindo(); - AddSC_boss_hakkar(); - AddSC_boss_grilek(); - AddSC_boss_hazzarah(); - AddSC_boss_renataki(); - AddSC_boss_wushoolay(); - AddSC_instance_zulgurub(); - - //AddSC_alterac_mountains(); - AddSC_arathi_highlands(); - AddSC_blasted_lands(); - AddSC_burning_steppes(); - AddSC_duskwood(); - AddSC_eastern_plaguelands(); - AddSC_ghostlands(); - AddSC_hinterlands(); - AddSC_isle_of_queldanas(); - AddSC_loch_modan(); - AddSC_redridge_mountains(); - AddSC_silverpine_forest(); - AddSC_stormwind_city(); - AddSC_stranglethorn_vale(); - AddSC_swamp_of_sorrows(); - AddSC_tirisfal_glades(); - AddSC_undercity(); - AddSC_western_plaguelands(); - AddSC_wetlands(); -#endif -} - -void AddKalimdorScripts() -{ -#ifdef SCRIPTS - AddSC_blackfathom_deeps(); //Blackfathom Depths - AddSC_boss_gelihast(); - AddSC_boss_kelris(); - AddSC_boss_aku_mai(); - AddSC_instance_blackfathom_deeps(); - AddSC_hyjal(); //CoT Battle for Mt. Hyjal - AddSC_boss_archimonde(); - AddSC_instance_mount_hyjal(); - AddSC_hyjal_trash(); - AddSC_boss_rage_winterchill(); - AddSC_boss_anetheron(); - AddSC_boss_kazrogal(); - AddSC_boss_azgalor(); - AddSC_boss_captain_skarloc(); //CoT Old Hillsbrad - AddSC_boss_epoch_hunter(); - AddSC_boss_lieutenant_drake(); - AddSC_instance_old_hillsbrad(); - AddSC_old_hillsbrad(); - AddSC_boss_aeonus(); //CoT The Black Morass - AddSC_boss_chrono_lord_deja(); - AddSC_boss_temporus(); - AddSC_the_black_morass(); - AddSC_instance_the_black_morass(); - AddSC_boss_epoch(); //CoT Culling Of Stratholme - AddSC_boss_infinite_corruptor(); - AddSC_boss_salramm(); - AddSC_boss_mal_ganis(); - AddSC_boss_meathook(); - AddSC_culling_of_stratholme(); - AddSC_instance_culling_of_stratholme(); - AddSC_instance_dire_maul(); //Dire Maul - AddSC_boss_celebras_the_cursed(); //Maraudon - AddSC_boss_landslide(); - AddSC_boss_noxxion(); - AddSC_boss_ptheradras(); - AddSC_instance_maraudon(); - AddSC_boss_onyxia(); //Onyxia's Lair - AddSC_instance_onyxias_lair(); - AddSC_boss_tuten_kash(); //Razorfen Downs - AddSC_boss_mordresh_fire_eye(); - AddSC_boss_glutton(); - AddSC_boss_amnennar_the_coldbringer(); - AddSC_razorfen_downs(); - AddSC_instance_razorfen_downs(); - AddSC_razorfen_kraul(); //Razorfen Kraul - AddSC_instance_razorfen_kraul(); - AddSC_boss_kurinnaxx(); //Ruins of ahn'qiraj - AddSC_boss_rajaxx(); - AddSC_boss_moam(); - AddSC_boss_buru(); - AddSC_boss_ayamiss(); - AddSC_boss_ossirian(); - AddSC_instance_ruins_of_ahnqiraj(); - AddSC_boss_cthun(); //Temple of ahn'qiraj - AddSC_boss_viscidus(); - AddSC_boss_fankriss(); - AddSC_boss_huhuran(); - AddSC_bug_trio(); - AddSC_boss_sartura(); - AddSC_boss_skeram(); - AddSC_boss_twinemperors(); - AddSC_boss_ouro(); - AddSC_npc_anubisath_sentinel(); - AddSC_instance_temple_of_ahnqiraj(); - AddSC_wailing_caverns(); //Wailing caverns - AddSC_instance_wailing_caverns(); - AddSC_boss_zum_rah(); //Zul'Farrak - AddSC_zulfarrak(); - AddSC_instance_zulfarrak(); - - AddSC_ashenvale(); - AddSC_azshara(); - AddSC_azuremyst_isle(); - AddSC_bloodmyst_isle(); - AddSC_boss_azuregos(); - AddSC_darkshore(); - AddSC_desolace(); - AddSC_durotar(); - AddSC_dustwallow_marsh(); - AddSC_felwood(); - AddSC_feralas(); - AddSC_moonglade(); - AddSC_orgrimmar(); - AddSC_silithus(); - AddSC_stonetalon_mountains(); - AddSC_tanaris(); - AddSC_the_barrens(); - AddSC_thousand_needles(); - AddSC_thunder_bluff(); - AddSC_ungoro_crater(); - AddSC_winterspring(); -#endif -} - -void AddOutlandScripts() -{ -#ifdef SCRIPTS - // Auchindoun - Auchenai Crypts - AddSC_boss_shirrak_the_dead_watcher(); - AddSC_boss_exarch_maladaar(); - AddSC_instance_auchenai_crypts(); - - // Auchindoun - Mana Tombs - AddSC_boss_pandemonius(); - AddSC_boss_nexusprince_shaffar(); - AddSC_instance_mana_tombs(); - - // Auchindoun - Sekketh Halls - AddSC_boss_darkweaver_syth(); - AddSC_boss_talon_king_ikiss(); - AddSC_boss_anzu(); - AddSC_instance_sethekk_halls(); - - // Auchindoun - Shadow Labyrinth - AddSC_boss_ambassador_hellmaw(); - AddSC_boss_blackheart_the_inciter(); - AddSC_boss_grandmaster_vorpil(); - AddSC_boss_murmur(); - AddSC_instance_shadow_labyrinth(); - - // Black Temple - AddSC_black_temple(); - AddSC_boss_illidan(); - AddSC_boss_shade_of_akama(); - AddSC_boss_supremus(); - AddSC_boss_gurtogg_bloodboil(); - AddSC_boss_mother_shahraz(); - AddSC_boss_reliquary_of_souls(); - AddSC_boss_teron_gorefiend(); - AddSC_boss_najentus(); - AddSC_boss_illidari_council(); - AddSC_instance_black_temple(); - - // Coilfang Reservoir - Serpent Shrine Cavern - AddSC_boss_fathomlord_karathress(); - AddSC_boss_hydross_the_unstable(); - AddSC_boss_lady_vashj(); - AddSC_boss_leotheras_the_blind(); - AddSC_boss_morogrim_tidewalker(); - AddSC_instance_serpentshrine_cavern(); - AddSC_boss_the_lurker_below(); - - // Coilfang Reservoir - The Steam Vault - AddSC_instance_steam_vault(); - AddSC_boss_hydromancer_thespia(); - AddSC_boss_mekgineer_steamrigger(); - AddSC_boss_warlord_kalithresh(); - - // Coilfang Reservoir - The Slave Pens - AddSC_instance_the_slave_pens(); - AddSC_boss_mennu_the_betrayer(); - AddSC_boss_rokmar_the_crackler(); - AddSC_boss_quagmirran(); - - // Coilfang Reservoir - The Underbog - AddSC_instance_the_underbog(); - AddSC_boss_hungarfen(); - AddSC_boss_the_black_stalker(); - - // Gruul's Lair - AddSC_boss_gruul(); - AddSC_boss_high_king_maulgar(); - AddSC_instance_gruuls_lair(); - AddSC_boss_broggok(); //HC Blood Furnace - AddSC_boss_kelidan_the_breaker(); - AddSC_boss_the_maker(); - AddSC_instance_blood_furnace(); - AddSC_boss_magtheridon(); //HC Magtheridon's Lair - AddSC_instance_magtheridons_lair(); - AddSC_boss_grand_warlock_nethekurse(); //HC Shattered Halls - AddSC_boss_warbringer_omrogg(); - AddSC_boss_warchief_kargath_bladefist(); - AddSC_shattered_halls(); - AddSC_instance_shattered_halls(); - AddSC_boss_watchkeeper_gargolmar(); //HC Ramparts - AddSC_boss_omor_the_unscarred(); - AddSC_boss_vazruden_the_herald(); - AddSC_instance_ramparts(); - AddSC_arcatraz(); //TK Arcatraz - AddSC_boss_zereketh_the_unbound(); - AddSC_boss_dalliah_the_doomsayer(); - AddSC_boss_wrath_scryer_soccothrates(); - AddSC_boss_harbinger_skyriss(); - AddSC_instance_arcatraz(); - AddSC_boss_high_botanist_freywinn(); //TK Botanica - AddSC_boss_laj(); - AddSC_boss_warp_splinter(); - AddSC_boss_thorngrin_the_tender(); - AddSC_boss_commander_sarannis(); - AddSC_instance_the_botanica(); - AddSC_boss_alar(); //TK The Eye - AddSC_boss_kaelthas(); - AddSC_boss_void_reaver(); - AddSC_boss_high_astromancer_solarian(); - AddSC_instance_the_eye(); - AddSC_the_eye(); - AddSC_boss_gatewatcher_iron_hand(); //TK The Mechanar - AddSC_boss_gatewatcher_gyrokill(); - AddSC_boss_nethermancer_sepethrea(); - AddSC_boss_pathaleon_the_calculator(); - AddSC_boss_mechano_lord_capacitus(); - AddSC_instance_mechanar(); - - AddSC_blades_edge_mountains(); - AddSC_boss_doomlordkazzak(); - AddSC_boss_doomwalker(); - AddSC_hellfire_peninsula(); - AddSC_nagrand(); - AddSC_netherstorm(); - AddSC_shadowmoon_valley(); - AddSC_shattrath_city(); - AddSC_terokkar_forest(); - AddSC_zangarmarsh(); -#endif -} - -void AddNorthrendScripts() -{ -#ifdef SCRIPTS - AddSC_boss_slad_ran(); //Gundrak - AddSC_boss_moorabi(); - AddSC_boss_drakkari_colossus(); - AddSC_boss_gal_darah(); - AddSC_boss_eck(); - AddSC_instance_gundrak(); - - // 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(); - AddSC_instance_trial_of_the_champion(); - AddSC_trial_of_the_champion(); - AddSC_boss_anubarak_trial(); //Trial of the Crusader - AddSC_boss_faction_champions(); - AddSC_boss_jaraxxus(); - AddSC_trial_of_the_crusader(); - AddSC_boss_twin_valkyr(); - AddSC_boss_northrend_beasts(); - AddSC_instance_trial_of_the_crusader(); - AddSC_boss_anubrekhan(); //Naxxramas - AddSC_boss_maexxna(); - AddSC_boss_patchwerk(); - AddSC_boss_grobbulus(); - AddSC_boss_razuvious(); - AddSC_boss_kelthuzad(); - AddSC_boss_loatheb(); - AddSC_boss_noth(); - AddSC_boss_gluth(); - AddSC_boss_sapphiron(); - AddSC_boss_four_horsemen(); - AddSC_boss_faerlina(); - AddSC_boss_heigan(); - AddSC_boss_gothik(); - AddSC_boss_thaddius(); - AddSC_instance_naxxramas(); - AddSC_boss_nexus_commanders(); // The Nexus Nexus - AddSC_boss_magus_telestra(); - AddSC_boss_anomalus(); - AddSC_boss_ormorok(); - AddSC_boss_keristrasza(); - AddSC_instance_nexus(); - AddSC_boss_drakos(); //The Nexus The Oculus - AddSC_boss_urom(); - AddSC_boss_varos(); - AddSC_boss_eregos(); - AddSC_instance_oculus(); - AddSC_oculus(); - AddSC_boss_malygos(); // The Nexus: Eye of Eternity - AddSC_instance_eye_of_eternity(); - AddSC_boss_sartharion(); //Obsidian Sanctum - AddSC_obsidian_sanctum(); - AddSC_instance_obsidian_sanctum(); - AddSC_boss_bjarngrim(); //Ulduar Halls of Lightning - AddSC_boss_loken(); - AddSC_boss_ionar(); - AddSC_boss_volkhan(); - AddSC_instance_halls_of_lightning(); - AddSC_boss_maiden_of_grief(); //Ulduar Halls of Stone - AddSC_boss_krystallus(); - AddSC_boss_sjonnir(); - AddSC_instance_halls_of_stone(); - AddSC_halls_of_stone(); - AddSC_boss_auriaya(); //Ulduar Ulduar - AddSC_boss_flame_leviathan(); - AddSC_boss_ignis(); - AddSC_boss_razorscale(); - AddSC_boss_xt002(); - AddSC_boss_general_vezax(); - AddSC_boss_assembly_of_iron(); - AddSC_boss_kologarn(); - AddSC_boss_mimiron(); - AddSC_boss_hodir(); - AddSC_boss_freya(); - AddSC_boss_yogg_saron(); - AddSC_boss_algalon_the_observer(); - AddSC_instance_ulduar(); - - // Utgarde Keep - Utgarde Keep - AddSC_boss_keleseth(); - AddSC_boss_skarvald_dalronn(); - AddSC_boss_ingvar_the_plunderer(); - AddSC_instance_utgarde_keep(); - AddSC_utgarde_keep(); - - // Utgarde Keep - Utgarde Pinnacle - AddSC_boss_svala(); - AddSC_boss_palehoof(); - AddSC_boss_skadi(); - AddSC_boss_ymiron(); - AddSC_instance_utgarde_pinnacle(); - - // Vault of Archavon - AddSC_boss_archavon(); - AddSC_boss_emalon(); - AddSC_boss_koralon(); - AddSC_boss_toravon(); - AddSC_instance_vault_of_archavon(); - - AddSC_boss_cyanigosa(); //Violet Hold - AddSC_boss_erekem(); - AddSC_boss_ichoron(); - AddSC_boss_lavanthor(); - AddSC_boss_moragg(); - AddSC_boss_xevozz(); - AddSC_boss_zuramat(); - AddSC_instance_violet_hold(); - AddSC_violet_hold(); - AddSC_instance_forge_of_souls(); //Forge of Souls - AddSC_forge_of_souls(); - AddSC_boss_bronjahm(); - AddSC_boss_devourer_of_souls(); - AddSC_instance_pit_of_saron(); //Pit of Saron - AddSC_pit_of_saron(); - AddSC_boss_garfrost(); - AddSC_boss_ick(); - AddSC_boss_tyrannus(); - AddSC_instance_halls_of_reflection(); // Halls of Reflection - AddSC_halls_of_reflection(); - AddSC_boss_falric(); - AddSC_boss_marwyn(); - AddSC_boss_lord_marrowgar(); // Icecrown Citadel - AddSC_boss_lady_deathwhisper(); - AddSC_boss_icecrown_gunship_battle(); - AddSC_boss_deathbringer_saurfang(); - AddSC_boss_festergut(); - AddSC_boss_rotface(); - AddSC_boss_professor_putricide(); - AddSC_boss_blood_prince_council(); - AddSC_boss_blood_queen_lana_thel(); - AddSC_boss_valithria_dreamwalker(); - AddSC_boss_sindragosa(); - AddSC_boss_the_lich_king(); - AddSC_icecrown_citadel_teleport(); - AddSC_instance_icecrown_citadel(); - AddSC_icecrown_citadel(); - AddSC_instance_ruby_sanctum(); // Ruby Sanctum - AddSC_ruby_sanctum(); - AddSC_boss_baltharus_the_warborn(); - AddSC_boss_saviana_ragefire(); - AddSC_boss_general_zarithrian(); - AddSC_boss_halion(); - - AddSC_dalaran(); - AddSC_borean_tundra(); - AddSC_dragonblight(); - AddSC_grizzly_hills(); - AddSC_howling_fjord(); - AddSC_icecrown(); - AddSC_sholazar_basin(); - AddSC_storm_peaks(); - AddSC_wintergrasp(); - AddSC_zuldrak(); - AddSC_crystalsong_forest(); - AddSC_isle_of_conquest(); -#endif -} - -void AddEventScripts() -{ -#ifdef SCRIPTS - AddSC_event_childrens_week(); -#endif -} - -void AddPetScripts() -{ -#ifdef SCRIPTS - AddSC_deathknight_pet_scripts(); - AddSC_generic_pet_scripts(); - AddSC_hunter_pet_scripts(); - AddSC_mage_pet_scripts(); - AddSC_priest_pet_scripts(); - AddSC_shaman_pet_scripts(); -#endif -} - -void AddOutdoorPvPScripts() -{ -#ifdef SCRIPTS - AddSC_outdoorpvp_ep(); - AddSC_outdoorpvp_hp(); - AddSC_outdoorpvp_na(); - AddSC_outdoorpvp_si(); - AddSC_outdoorpvp_tf(); - AddSC_outdoorpvp_zm(); -#endif -} - -void AddBattlegroundScripts() -{ -#ifdef SCRIPTS -#endif -} - -#ifdef SCRIPTS -/* This is where custom scripts' loading functions should be declared. */ - -#endif - -void AddCustomScripts() -{ -#ifdef SCRIPTS - /* This is where custom scripts should be added. */ - -#endif -} diff --git a/src/server/game/Scripting/ScriptLoader.h b/src/server/game/Scripting/ScriptLoader.h index 4adb215e130..57b62df22d1 100644 --- a/src/server/game/Scripting/ScriptLoader.h +++ b/src/server/game/Scripting/ScriptLoader.h @@ -19,17 +19,5 @@ #define SC_SCRIPTLOADER_H void AddScripts(); -void AddSpellScripts(); -void AddCommandScripts(); -void AddWorldScripts(); -void AddEasternKingdomsScripts(); -void AddKalimdorScripts(); -void AddOutlandScripts(); -void AddNorthrendScripts(); -void AddEventScripts(); -void AddPetScripts(); -void AddBattlegroundScripts(); -void AddOutdoorPvPScripts(); -void AddCustomScripts(); #endif diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index 3fa16cf4517..4b26ba96c9b 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -37,7 +37,6 @@ // namespace // { - UnusedScriptContainer UnusedScripts; UnusedScriptNamesContainer UnusedScriptNames; // } @@ -107,8 +106,9 @@ class ScriptRegistry // The actual list of scripts. This will be accessed concurrently, so it must not be modified // after server startup. static ScriptMap ScriptPointerList; + static std::vector<TScript*> Scripts; - static void AddScript(TScript* const script) + static void AddScript(TScript* const script, bool addToDeleteContainer = true) { ASSERT(script); @@ -126,6 +126,8 @@ class ScriptRegistry } AddScript(is_script_database_bound<TScript>{}, script); + if (addToDeleteContainer) + Scripts.push_back(script); } // Gets a script by its ID (assigned by ObjectMgr). @@ -186,11 +188,6 @@ class ScriptRegistry { // The script uses a script name from database, but isn't assigned to anything. TC_LOG_ERROR("sql.sql", "Script named '%s' does not have a script name assigned in database.", script->GetName().c_str()); - - // Avoid calling "delete script;" because we are currently in the script constructor - // In a valid scenario this will not happen because every script has a name assigned in the database - UnusedScripts.push_back(script); - return; } } @@ -210,6 +207,7 @@ class ScriptRegistry #define SCR_REG_MAP(T) ScriptRegistry<T>::ScriptMap #define SCR_REG_ITR(T) ScriptRegistry<T>::ScriptMapIterator #define SCR_REG_LST(T) ScriptRegistry<T>::ScriptPointerList +#define SCR_REG_VEC(T) ScriptRegistry<T>::Scripts // Utility macros for looping over scripts. #define FOR_SCRIPTS(T, C, E) \ @@ -266,17 +264,15 @@ void ScriptMgr::Initialize() } #endif - UnloadUnusedScripts(); - TC_LOG_INFO("server.loading", ">> Loaded %u C++ scripts in %u ms", GetScriptCount(), GetMSTimeDiffToNow(oldMSTime)); } void ScriptMgr::Unload() { #define SCR_CLEAR(T) \ - for (SCR_REG_ITR(T) itr = SCR_REG_LST(T).begin(); itr != SCR_REG_LST(T).end(); ++itr) \ - delete itr->second; \ - SCR_REG_LST(T).clear(); + for (T* scr : SCR_REG_VEC(T)) \ + delete scr; \ + SCR_REG_VEC(T).clear(); // Clear scripts for every script type. SCR_CLEAR(SpellScriptLoader); @@ -308,19 +304,10 @@ void ScriptMgr::Unload() #undef SCR_CLEAR - UnloadUnusedScripts(); - delete[] SpellSummary; delete[] UnitAI::AISpellInfo; } -void ScriptMgr::UnloadUnusedScripts() -{ - for (size_t i = 0; i < UnusedScripts.size(); ++i) - delete UnusedScripts[i]; - UnusedScripts.clear(); -} - void ScriptMgr::LoadDatabase() { sScriptSystemMgr->LoadScriptWaypoints(); @@ -1368,9 +1355,9 @@ void ScriptMgr::OnPlayerSave(Player* player) FOREACH_SCRIPT(PlayerScript)->OnSave(player); } -void ScriptMgr::OnPlayerBindToInstance(Player* player, Difficulty difficulty, uint32 mapid, bool permanent) +void ScriptMgr::OnPlayerBindToInstance(Player* player, Difficulty difficulty, uint32 mapid, bool permanent, uint8 extendState) { - FOREACH_SCRIPT(PlayerScript)->OnBindToInstance(player, difficulty, mapid, permanent); + FOREACH_SCRIPT(PlayerScript)->OnBindToInstance(player, difficulty, mapid, permanent, extendState); } void ScriptMgr::OnPlayerUpdateZone(Player* player, uint32 newZone, uint32 newArea) @@ -1555,8 +1542,7 @@ FormulaScript::FormulaScript(const char* name) UnitScript::UnitScript(const char* name, bool addToScripts) : ScriptObject(name) { - if (addToScripts) - ScriptRegistry<UnitScript>::AddScript(this); + ScriptRegistry<UnitScript>::AddScript(this, addToScripts); } WorldMapScript::WorldMapScript(const char* name, uint32 mapId) @@ -1696,6 +1682,7 @@ GroupScript::GroupScript(const char* name) // Instantiate static members of ScriptRegistry. template<class TScript> std::map<uint32, TScript*> ScriptRegistry<TScript>::ScriptPointerList; +template<class TScript> std::vector<TScript*> ScriptRegistry<TScript>::Scripts; template<class TScript> uint32 ScriptRegistry<TScript>::_scriptIdCounter = 0; // Specialize for each script type class like so: diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 5dfc0be688a..8a00305b4da 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -734,7 +734,7 @@ class PlayerScript : public UnitScript virtual void OnSave(Player* /*player*/) { } // Called when a player is bound to an instance - virtual void OnBindToInstance(Player* /*player*/, Difficulty /*difficulty*/, uint32 /*mapId*/, bool /*permanent*/) { } + virtual void OnBindToInstance(Player* /*player*/, Difficulty /*difficulty*/, uint32 /*mapId*/, bool /*permanent*/, uint8 /*extendState*/) { } // Called when a player switches to a new zone virtual void OnUpdateZone(Player* /*player*/, uint32 /*newZone*/, uint32 /*newArea*/) { } @@ -843,10 +843,7 @@ class GroupScript : public ScriptObject // namespace // { - typedef std::vector<ScriptObject*> UnusedScriptContainer; typedef std::list<std::string> UnusedScriptNamesContainer; - - extern UnusedScriptContainer UnusedScripts; extern UnusedScriptNamesContainer UnusedScriptNames; // } @@ -878,7 +875,6 @@ class ScriptMgr public: /* Unloading */ void Unload(); - void UnloadUnusedScripts(); public: /* SpellScriptLoader */ @@ -1054,7 +1050,7 @@ class ScriptMgr void OnPlayerDelete(ObjectGuid guid, uint32 accountId); void OnPlayerFailedDelete(ObjectGuid guid, uint32 accountId); void OnPlayerSave(Player* player); - void OnPlayerBindToInstance(Player* player, Difficulty difficulty, uint32 mapid, bool permanent); + void OnPlayerBindToInstance(Player* player, Difficulty difficulty, uint32 mapid, bool permanent, uint8 extendState); void OnPlayerUpdateZone(Player* player, uint32 newZone, uint32 newArea); void OnQuestStatusChange(Player* player, uint32 questId, QuestStatus status); diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index a2d357cbc4d..36029113055 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -25,6 +25,17 @@ #include <memory> +class EncryptablePacket : public WorldPacket +{ +public: + EncryptablePacket(WorldPacket const& packet, bool encrypt) : WorldPacket(packet), _encrypt(encrypt) { } + + bool NeedsEncryption() const { return _encrypt; } + +private: + bool _encrypt; +}; + using boost::asio::ip::tcp; WorldSocket::WorldSocket(tcp::socket&& socket) @@ -40,11 +51,8 @@ void WorldSocket::Start() stmt->setString(0, ip_address); stmt->setUInt32(1, inet_addr(ip_address.c_str())); - { - std::lock_guard<std::mutex> guard(_queryLock); - _queryCallback = io_service().wrap(std::bind(&WorldSocket::CheckIpCallback, this, std::placeholders::_1)); - _queryFuture = LoginDatabase.AsyncQuery(stmt); - } + _queryCallback = std::bind(&WorldSocket::CheckIpCallback, this, std::placeholders::_1); + _queryFuture = LoginDatabase.AsyncQuery(stmt); } void WorldSocket::CheckIpCallback(PreparedQueryResult result) @@ -78,17 +86,50 @@ void WorldSocket::CheckIpCallback(PreparedQueryResult result) bool WorldSocket::Update() { + EncryptablePacket* queued; + MessageBuffer buffer; + while (_bufferQueue.Dequeue(queued)) + { + ServerPktHeader header(queued->size() + 2, queued->GetOpcode()); + if (queued->NeedsEncryption()) + _authCrypt.EncryptSend(header.header, header.getHeaderLength()); + + if (buffer.GetRemainingSpace() < queued->size() + header.getHeaderLength()) + { + QueuePacket(std::move(buffer)); + buffer.Resize(4096); + } + + if (buffer.GetRemainingSpace() >= queued->size() + header.getHeaderLength()) + { + buffer.Write(header.header, header.getHeaderLength()); + if (!queued->empty()) + buffer.Write(queued->contents(), queued->size()); + } + else // single packet larger than 4096 bytes + { + MessageBuffer packetBuffer(queued->size() + header.getHeaderLength()); + packetBuffer.Write(header.header, header.getHeaderLength()); + if (!queued->empty()) + packetBuffer.Write(queued->contents(), queued->size()); + + QueuePacket(std::move(packetBuffer)); + } + + delete queued; + } + + if (buffer.GetActiveSize() > 0) + QueuePacket(std::move(buffer)); + if (!BaseSocket::Update()) return false; + if (_queryFuture.valid() && _queryFuture.wait_for(std::chrono::seconds(0)) == std::future_status::ready) { - std::lock_guard<std::mutex> guard(_queryLock); - if (_queryFuture.valid() && _queryFuture.wait_for(std::chrono::seconds(0)) == std::future_status::ready) - { - auto callback = std::move(_queryCallback); - _queryCallback = nullptr; - callback(_queryFuture.get()); - } + auto callback = _queryCallback; + _queryCallback = nullptr; + callback(_queryFuture.get()); } return true; @@ -351,29 +392,7 @@ void WorldSocket::SendPacket(WorldPacket const& packet) if (sPacketLog->CanLogPacket()) sPacketLog->LogPacket(packet, SERVER_TO_CLIENT, GetRemoteIpAddress(), GetRemotePort()); - ServerPktHeader header(packet.size() + 2, packet.GetOpcode()); - - std::unique_lock<std::mutex> guard(_writeLock); - - _authCrypt.EncryptSend(header.header, header.getHeaderLength()); - -#ifndef TC_SOCKET_USE_IOCP - if (_writeQueue.empty() && _writeBuffer.GetRemainingSpace() >= header.getHeaderLength() + packet.size()) - { - _writeBuffer.Write(header.header, header.getHeaderLength()); - if (!packet.empty()) - _writeBuffer.Write(packet.contents(), packet.size()); - } - else -#endif - { - MessageBuffer buffer(header.getHeaderLength() + packet.size()); - buffer.Write(header.header, header.getHeaderLength()); - if (!packet.empty()) - buffer.Write(packet.contents(), packet.size()); - - QueuePacket(std::move(buffer), guard); - } + _bufferQueue.Enqueue(new EncryptablePacket(packet, _authCrypt.IsInitialized())); } void WorldSocket::HandleAuthSession(WorldPacket& recvPacket) @@ -398,11 +417,8 @@ void WorldSocket::HandleAuthSession(WorldPacket& recvPacket) stmt->setInt32(0, int32(realmID)); stmt->setString(1, authSession->Account); - { - std::lock_guard<std::mutex> guard(_queryLock); - _queryCallback = io_service().wrap(std::bind(&WorldSocket::HandleAuthSessionCallback, this, authSession, std::placeholders::_1)); - _queryFuture = LoginDatabase.AsyncQuery(stmt); - } + _queryCallback = std::bind(&WorldSocket::HandleAuthSessionCallback, this, authSession, std::placeholders::_1); + _queryFuture = LoginDatabase.AsyncQuery(stmt); } void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<AuthSession> authSession, PreparedQueryResult result) @@ -559,7 +575,7 @@ void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<AuthSession> authSes if (wardenActive) _worldSession->InitWarden(&account.SessionKey, account.OS); - _queryCallback = io_service().wrap(std::bind(&WorldSocket::LoadSessionPermissionsCallback, this, std::placeholders::_1)); + _queryCallback = std::bind(&WorldSocket::LoadSessionPermissionsCallback, this, std::placeholders::_1); _queryFuture = _worldSession->LoadPermissionsAsync(); AsyncRead(); } diff --git a/src/server/game/Server/WorldSocket.h b/src/server/game/Server/WorldSocket.h index 9e5b35992a6..08a5b185cf1 100644 --- a/src/server/game/Server/WorldSocket.h +++ b/src/server/game/Server/WorldSocket.h @@ -26,11 +26,13 @@ #include "Util.h" #include "WorldPacket.h" #include "WorldSession.h" +#include "MPSCQueue.h" #include <chrono> #include <boost/asio/ip/tcp.hpp> #include <boost/asio/buffer.hpp> using boost::asio::ip::tcp; +class EncryptablePacket; #pragma pack(push, 1) @@ -104,8 +106,8 @@ private: MessageBuffer _headerBuffer; MessageBuffer _packetBuffer; + MPSCQueue<EncryptablePacket> _bufferQueue; - std::mutex _queryLock; PreparedQueryResultFuture _queryFuture; std::function<void(PreparedQueryResult&&)> _queryCallback; std::string _ipCountry; diff --git a/src/server/game/Server/WorldSocketMgr.cpp b/src/server/game/Server/WorldSocketMgr.cpp index 529396b3966..e8f8c59f4af 100644 --- a/src/server/game/Server/WorldSocketMgr.cpp +++ b/src/server/game/Server/WorldSocketMgr.cpp @@ -24,9 +24,9 @@ #include <boost/system/error_code.hpp> -static void OnSocketAccept(tcp::socket&& sock) +static void OnSocketAccept(tcp::socket&& sock, uint32 threadIndex) { - sWorldSocketMgr.OnSocketOpen(std::forward<tcp::socket>(sock)); + sWorldSocketMgr.OnSocketOpen(std::forward<tcp::socket>(sock), threadIndex); } class WorldSocketThread : public NetworkThread<WorldSocket> @@ -67,7 +67,9 @@ bool WorldSocketMgr::StartNetwork(boost::asio::io_service& service, std::string BaseSocketMgr::StartNetwork(service, bindIp, port); - _acceptor->AsyncAcceptManaged(&OnSocketAccept); + _acceptor->SetSocketFactory(std::bind(&BaseSocketMgr::GetSocketForAccept, this)); + + _acceptor->AsyncAcceptWithCallback<&OnSocketAccept>(); sScriptMgr->OnNetworkStart(); return true; @@ -80,7 +82,7 @@ void WorldSocketMgr::StopNetwork() sScriptMgr->OnNetworkStop(); } -void WorldSocketMgr::OnSocketOpen(tcp::socket&& sock) +void WorldSocketMgr::OnSocketOpen(tcp::socket&& sock, uint32 threadIndex) { // set some options here if (_socketSendBufferSize >= 0) @@ -108,7 +110,7 @@ void WorldSocketMgr::OnSocketOpen(tcp::socket&& sock) //sock->m_OutBufferSize = static_cast<size_t> (m_SockOutUBuff); - BaseSocketMgr::OnSocketOpen(std::forward<tcp::socket>(sock)); + BaseSocketMgr::OnSocketOpen(std::forward<tcp::socket>(sock), threadIndex); } NetworkThread<WorldSocket>* WorldSocketMgr::CreateThreads() const diff --git a/src/server/game/Server/WorldSocketMgr.h b/src/server/game/Server/WorldSocketMgr.h index 92a28d0c135..38e2e7abb69 100644 --- a/src/server/game/Server/WorldSocketMgr.h +++ b/src/server/game/Server/WorldSocketMgr.h @@ -47,7 +47,7 @@ public: /// Stops all network threads, It will wait for all running threads . void StopNetwork() override; - void OnSocketOpen(tcp::socket&& sock) override; + void OnSocketOpen(tcp::socket&& sock, uint32 threadIndex) override; protected: WorldSocketMgr(); diff --git a/src/server/game/Skills/SkillDiscovery.cpp b/src/server/game/Skills/SkillDiscovery.cpp index 36a7d147192..8860b391f48 100644 --- a/src/server/game/Skills/SkillDiscovery.cpp +++ b/src/server/game/Skills/SkillDiscovery.cpp @@ -88,7 +88,7 @@ void LoadSkillDiscoveryTable() { if (reportedReqSpells.find(absReqSkillOrSpell) == reportedReqSpells.end()) { - TC_LOG_ERROR("sql.sql", "Spell (ID: %u) have not existed spell (ID: %i) in `reqSpell` field in `skill_discovery_template` table", spellId, reqSkillOrSpell); + TC_LOG_ERROR("sql.sql", "Spell (ID: %u) has a non-existing spell (ID: %i) in `reqSpell` field in the `skill_discovery_template` table.", spellId, reqSkillOrSpell); reportedReqSpells.insert(absReqSkillOrSpell); } continue; @@ -101,8 +101,8 @@ void LoadSkillDiscoveryTable() { if (reportedReqSpells.find(absReqSkillOrSpell) == reportedReqSpells.end()) { - TC_LOG_ERROR("sql.sql", "Spell (ID: %u) not have MECHANIC_DISCOVERY (28) value in Mechanic field in spell.dbc" - " and not 100%% chance random discovery ability but listed for spellId %u (and maybe more) in `skill_discovery_template` table", + TC_LOG_ERROR("sql.sql", "Spell (ID: %u) does not have any MECHANIC_DISCOVERY (28) value in the Mechanic field in spell.dbc" + " nor 100%% chance random discovery ability, but is listed for spellId %u (and maybe more) in the `skill_discovery_template` table.", absReqSkillOrSpell, spellId); reportedReqSpells.insert(absReqSkillOrSpell); } @@ -117,7 +117,7 @@ void LoadSkillDiscoveryTable() if (bounds.first == bounds.second) { - TC_LOG_ERROR("sql.sql", "Spell (ID: %u) not listed in `SkillLineAbility.dbc` but listed with `reqSpell`=0 in `skill_discovery_template` table", spellId); + TC_LOG_ERROR("sql.sql", "Spell (ID: %u) is not listed in `SkillLineAbility.dbc`, but listed with `reqSpell`= 0 in the `skill_discovery_template` table.", spellId); continue; } @@ -126,7 +126,7 @@ void LoadSkillDiscoveryTable() } else { - TC_LOG_ERROR("sql.sql", "Spell (ID: %u) have negative value in `reqSpell` field in `skill_discovery_template` table", spellId); + TC_LOG_ERROR("sql.sql", "Spell (ID: %u) has a negative value in `reqSpell` field in the `skill_discovery_template` table.", spellId); continue; } @@ -135,7 +135,7 @@ void LoadSkillDiscoveryTable() while (result->NextRow()); if (!ssNonDiscoverableEntries.str().empty()) - TC_LOG_ERROR("sql.sql", "Some items can't be successfully discovered: have in chance field value < 0.000001 in `skill_discovery_template` DB table . List:\n%s", ssNonDiscoverableEntries.str().c_str()); + TC_LOG_ERROR("sql.sql", "Some items can't be successfully discovered, their chance field value is < 0.000001 in the `skill_discovery_template` DB table. List:\n%s", ssNonDiscoverableEntries.str().c_str()); // report about empty data for explicit discovery spells for (uint32 spell_id = 1; spell_id < sSpellMgr->GetSpellInfoStoreSize(); ++spell_id) @@ -149,10 +149,10 @@ void LoadSkillDiscoveryTable() continue; if (SkillDiscoveryStore.find(int32(spell_id)) == SkillDiscoveryStore.end()) - TC_LOG_ERROR("sql.sql", "Spell (ID: %u) is 100%% chance random discovery ability but not have data in `skill_discovery_template` table", spell_id); + TC_LOG_ERROR("sql.sql", "Spell (ID: %u) has got 100%% chance random discovery ability, but does not have data in the `skill_discovery_template` table.", spell_id); } - TC_LOG_INFO("server.loading", ">> Loaded %u skill discovery definitions in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u skill discovery definitions in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } uint32 GetExplicitDiscoverySpell(uint32 spellId, Player* player) diff --git a/src/server/game/Skills/SkillExtraItems.cpp b/src/server/game/Skills/SkillExtraItems.cpp index 5213944cc90..f76e4623137 100644 --- a/src/server/game/Skills/SkillExtraItems.cpp +++ b/src/server/game/Skills/SkillExtraItems.cpp @@ -74,28 +74,28 @@ void LoadSkillPerfectItemTable() if (!sSpellMgr->GetSpellInfo(spellId)) { - TC_LOG_ERROR("sql.sql", "Skill perfection data for spell %u has non-existent spell id in `skill_perfect_item_template`!", spellId); + TC_LOG_ERROR("sql.sql", "Skill perfection data for spell %u has a non-existing spell id in the `skill_perfect_item_template`!", spellId); continue; } uint32 requiredSpecialization = fields[1].GetUInt32(); if (!sSpellMgr->GetSpellInfo(requiredSpecialization)) { - TC_LOG_ERROR("sql.sql", "Skill perfection data for spell %u has non-existent required specialization spell id %u in `skill_perfect_item_template`!", spellId, requiredSpecialization); + TC_LOG_ERROR("sql.sql", "Skill perfection data for spell %u has a non-existing required specialization spell id %u in the `skill_perfect_item_template`!", spellId, requiredSpecialization); continue; } float perfectCreateChance = fields[2].GetFloat(); if (perfectCreateChance <= 0.0f) { - TC_LOG_ERROR("sql.sql", "Skill perfection data for spell %u has impossibly low proc chance in `skill_perfect_item_template`!", spellId); + TC_LOG_ERROR("sql.sql", "Skill perfection data for spell %u has impossibly low proc chance in the `skill_perfect_item_template`!", spellId); continue; } uint32 perfectItemType = fields[3].GetUInt32(); if (!sObjectMgr->GetItemTemplate(perfectItemType)) { - TC_LOG_ERROR("sql.sql", "Skill perfection data for spell %u references non-existent perfect item id %u in `skill_perfect_item_template`!", spellId, perfectItemType); + TC_LOG_ERROR("sql.sql", "Skill perfection data for spell %u references a non-existing perfect item id %u in the `skill_perfect_item_template`!", spellId, perfectItemType); continue; } @@ -109,7 +109,7 @@ void LoadSkillPerfectItemTable() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u spell perfection definitions in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u spell perfection definitions in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } // struct to store information about extra item creation @@ -161,28 +161,28 @@ void LoadSkillExtraItemTable() if (!sSpellMgr->GetSpellInfo(spellId)) { - TC_LOG_ERROR("sql.sql", "Skill specialization %u has non-existent spell id in `skill_extra_item_template`!", spellId); + TC_LOG_ERROR("sql.sql", "Skill specialization %u has a non-existing spell id in the `skill_extra_item_template`!", spellId); continue; } uint32 requiredSpecialization = fields[1].GetUInt32(); if (!sSpellMgr->GetSpellInfo(requiredSpecialization)) { - TC_LOG_ERROR("sql.sql", "Skill specialization %u have not existed required specialization spell id %u in `skill_extra_item_template`!", spellId, requiredSpecialization); + TC_LOG_ERROR("sql.sql", "Skill specialization %u has a non-existing required specialization spell id %u in the `skill_extra_item_template`!", spellId, requiredSpecialization); continue; } float additionalCreateChance = fields[2].GetFloat(); if (additionalCreateChance <= 0.0f) { - TC_LOG_ERROR("sql.sql", "Skill specialization %u has too low additional create chance in `skill_extra_item_template`!", spellId); + TC_LOG_ERROR("sql.sql", "Skill specialization %u has too low additional create chance in the `skill_extra_item_template`!", spellId); continue; } uint8 additionalMaxNum = fields[3].GetUInt8(); if (!additionalMaxNum) { - TC_LOG_ERROR("sql.sql", "Skill specialization %u has 0 max number of extra items in `skill_extra_item_template`!", spellId); + TC_LOG_ERROR("sql.sql", "Skill specialization %u has 0 max number of extra items in the `skill_extra_item_template`!", spellId); continue; } diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index b72ceecfff0..207908c6d51 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -4683,11 +4683,6 @@ void AuraEffect::HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool if (target->GetTypeId() == TYPEID_PLAYER) target->ToPlayer()->RemoveAmmo(); // not use ammo and not allow use break; - case 52916: // Honor Among Thieves - if (target->GetTypeId() == TYPEID_PLAYER) - if (Unit* spellTarget = ObjectAccessor::GetUnit(*target, target->ToPlayer()->GetComboTarget())) - target->CastSpell(spellTarget, 51699, true); - break; case 71563: if (Aura* newAura = target->AddAura(71564, target)) newAura->SetStackAmount(newAura->GetSpellInfo()->StackAmount); diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 63fe148dd93..23e2f144ff2 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -2429,7 +2429,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target) if (missInfo != SPELL_MISS_EVADE && !m_caster->IsFriendlyTo(unit) && (!m_spellInfo->IsPositive() || m_spellInfo->HasEffect(SPELL_EFFECT_DISPEL))) { - m_caster->CombatStart(unit, !m_spellInfo->HasAttribute(SPELL_ATTR3_NO_INITIAL_AGGRO)); + m_caster->CombatStart(unit, m_spellInfo->HasInitialAggro()); if (!unit->IsStandState()) unit->SetStandState(UNIT_STAND_STATE_STAND); @@ -2535,7 +2535,7 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleA if (m_caster->GetTypeId() == TYPEID_PLAYER) m_caster->ToPlayer()->UpdatePvP(true); } - if (unit->IsInCombat() && !m_spellInfo->HasAttribute(SPELL_ATTR3_NO_INITIAL_AGGRO)) + if (unit->IsInCombat() && m_spellInfo->HasInitialAggro()) { m_caster->SetInCombatState(unit->GetCombatTimer() > 0, unit); unit->getHostileRefManager().threatAssist(m_caster, 0.0f); @@ -4611,8 +4611,7 @@ void Spell::HandleThreatSpells() if (m_UniqueTargetInfo.empty()) return; - if (m_spellInfo->HasAttribute(SPELL_ATTR1_NO_THREAT) || - m_spellInfo->HasAttribute(SPELL_ATTR3_NO_INITIAL_AGGRO)) + if (!m_spellInfo->HasInitialAggro()) return; float threat = 0.0f; @@ -4623,7 +4622,7 @@ void Spell::HandleThreatSpells() threat += threatEntry->flatMod; } - else if (m_spellInfo->HasAttribute(SPELL_ATTR0_CU_NO_INITIAL_THREAT) == 0) + else if (!m_spellInfo->HasAttribute(SPELL_ATTR0_CU_NO_INITIAL_THREAT)) threat += m_spellInfo->SpellLevel; // past this point only multiplicative effects occur @@ -5477,7 +5476,7 @@ SpellCastResult Spell::CheckCast(bool strict) if (m_originalCaster && m_originalCaster->GetTypeId() == TYPEID_PLAYER && m_originalCaster->IsAlive()) { Battlefield* Bf = sBattlefieldMgr->GetBattlefieldToZoneId(m_originalCaster->GetZoneId()); - if (AreaTableEntry const* area = GetAreaEntryByAreaID(m_originalCaster->GetAreaId())) + if (AreaTableEntry const* area = sAreaTableStore.LookupEntry(m_originalCaster->GetAreaId())) if (area->flags & AREA_FLAG_NO_FLY_ZONE || (Bf && !Bf->CanFlyIn())) return (_triggeredCastFlags & TRIGGERED_DONT_REPORT_CAST_ERROR) ? SPELL_FAILED_DONT_REPORT : SPELL_FAILED_NOT_HERE; } diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index f961654f279..f9bf33553cc 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -893,7 +893,7 @@ void Spell::EffectTriggerMissileSpell(SpellEffIndex effIndex) SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(triggered_spell_id); if (!spellInfo) { - TC_LOG_ERROR("spells", "Spell::EffectTriggerMissileSpell spell %u tried to trigger unknown spell %u", m_spellInfo->Id, triggered_spell_id); + TC_LOG_ERROR("spells", "Spell::EffectTriggerMissileSpell spell %u tried to trigger unknown spell %u.", m_spellInfo->Id, triggered_spell_id); return; } @@ -944,7 +944,7 @@ void Spell::EffectForceCast(SpellEffIndex effIndex) if (!spellInfo) { - TC_LOG_ERROR("spells", "Spell::EffectForceCast of spell %u: triggering unknown spell id %i", m_spellInfo->Id, triggered_spell_id); + TC_LOG_ERROR("spells", "Spell::EffectForceCast of spell %u: triggering unknown spell id %i.", m_spellInfo->Id, triggered_spell_id); return; } @@ -996,7 +996,7 @@ void Spell::EffectTriggerRitualOfSummoning(SpellEffIndex effIndex) if (!spellInfo) { - TC_LOG_ERROR("spells", "EffectTriggerRitualOfSummoning of spell %u: triggering unknown spell id %i", m_spellInfo->Id, triggered_spell_id); + TC_LOG_ERROR("spells", "EffectTriggerRitualOfSummoning of spell %u: triggering unknown spell id %i.", m_spellInfo->Id, triggered_spell_id); return; } @@ -1021,7 +1021,7 @@ void Spell::EffectJump(SpellEffIndex effIndex) float speedXY, speedZ; CalculateJumpSpeeds(effIndex, m_caster->GetExactDist2d(x, y), speedXY, speedZ); - m_caster->GetMotionMaster()->MoveJump(x, y, z, speedXY, speedZ); + m_caster->GetMotionMaster()->MoveJump(x, y, z, 0.0f, speedXY, speedZ, EVENT_JUMP, false); } void Spell::EffectJumpDest(SpellEffIndex effIndex) @@ -1035,13 +1035,9 @@ void Spell::EffectJumpDest(SpellEffIndex effIndex) if (!m_targets.HasDst()) return; - // Init dest coordinates - float x, y, z; - destTarget->GetPosition(x, y, z); - float speedXY, speedZ; - CalculateJumpSpeeds(effIndex, m_caster->GetExactDist2d(x, y), speedXY, speedZ); - m_caster->GetMotionMaster()->MoveJump(x, y, z, speedXY, speedZ); + CalculateJumpSpeeds(effIndex, m_caster->GetExactDist2d(destTarget), speedXY, speedZ); + m_caster->GetMotionMaster()->MoveJump(*destTarget, speedXY, speedZ, EVENT_JUMP, true); } void Spell::CalculateJumpSpeeds(uint8 i, float dist, float & speedXY, float & speedZ) @@ -1066,7 +1062,7 @@ void Spell::EffectTeleportUnits(SpellEffIndex /*effIndex*/) // If not exist data for dest location - return if (!m_targets.HasDst()) { - TC_LOG_ERROR("spells", "Spell::EffectTeleportUnits - does not have destination for spellId %u.", m_spellInfo->Id); + TC_LOG_ERROR("spells", "Spell::EffectTeleportUnits - does not have a destination for spellId %u.", m_spellInfo->Id); return; } @@ -1397,7 +1393,7 @@ void Spell::EffectHeal(SpellEffIndex /*effIndex*/) if (!targetAura) { - TC_LOG_ERROR("spells", "Target (%s) has aurastate AURA_STATE_SWIFTMEND but no matching aura.", unitTarget->GetGUID().ToString().c_str()); + TC_LOG_ERROR("spells", "Target (%s) has the aurastate AURA_STATE_SWIFTMEND, but no matching aura.", unitTarget->GetGUID().ToString().c_str()); return; } @@ -1890,7 +1886,7 @@ void Spell::SendLoot(ObjectGuid guid, LootType loottype) // Players shouldn't be able to loot gameobjects that are currently despawned if (!gameObjTarget->isSpawned() && !player->IsGameMaster()) { - TC_LOG_ERROR("spells", "Possible hacking attempt: Player %s [guid: %u] tried to loot a gameobject [entry: %u id: %u] which is on respawn time without being in GM mode!", + TC_LOG_ERROR("spells", "Possible hacking attempt: Player %s [guid: %u] tried to loot a gameobject [entry: %u id: %u] which is on respawn timer without being in GM mode!", player->GetName().c_str(), player->GetGUID().GetCounter(), gameObjTarget->GetEntry(), gameObjTarget->GetGUID().GetCounter()); return; } @@ -2195,7 +2191,7 @@ void Spell::EffectSummonType(SpellEffIndex effIndex) SummonPropertiesEntry const* properties = sSummonPropertiesStore.LookupEntry(m_spellInfo->Effects[effIndex].MiscValueB); if (!properties) { - TC_LOG_ERROR("spells", "EffectSummonType: Unhandled summon type %u", m_spellInfo->Effects[effIndex].MiscValueB); + TC_LOG_ERROR("spells", "EffectSummonType: Unhandled summon type %u.", m_spellInfo->Effects[effIndex].MiscValueB); return; } @@ -2383,7 +2379,7 @@ void Spell::EffectLearnSpell(SpellEffIndex effIndex) uint32 spellToLearn = (m_spellInfo->Id == 483 || m_spellInfo->Id == 55884) ? damage : m_spellInfo->Effects[effIndex].TriggerSpell; player->LearnSpell(spellToLearn, false); - TC_LOG_DEBUG("spells", "Spell: Player %u has learned spell %u from NpcGUID=%u", player->GetGUID().GetCounter(), spellToLearn, m_caster->GetGUID().GetCounter()); + TC_LOG_DEBUG("spells", "Spell: Player %u has learned spell %u from NpcGUID: %u", player->GetGUID().GetCounter(), spellToLearn, m_caster->GetGUID().GetCounter()); } void Spell::EffectDispel(SpellEffIndex effIndex) @@ -2762,7 +2758,7 @@ void Spell::EffectEnchantItemPrismatic(SpellEffIndex effIndex) } if (!add_socket) { - TC_LOG_ERROR("spells", "Spell::EffectEnchantItemPrismatic: attempt apply enchant spell %u with SPELL_EFFECT_ENCHANT_ITEM_PRISMATIC (%u) but without ITEM_ENCHANTMENT_TYPE_PRISMATIC_SOCKET (%u), not suppoted yet.", + TC_LOG_ERROR("spells", "Spell::EffectEnchantItemPrismatic: attempt to apply the enchant spell %u with SPELL_EFFECT_ENCHANT_ITEM_PRISMATIC (%u), but without ITEM_ENCHANTMENT_TYPE_PRISMATIC_SOCKET (%u), not supported yet.", m_spellInfo->Id, SPELL_EFFECT_ENCHANT_ITEM_PRISMATIC, ITEM_ENCHANTMENT_TYPE_PRISMATIC_SOCKET); return; } @@ -2827,7 +2823,7 @@ void Spell::EffectEnchantItemTmp(SpellEffIndex effIndex) case 10: spell_id = 36758; break; // 14% case 11: spell_id = 36760; break; // 20% default: - TC_LOG_ERROR("spells", "Spell::EffectEnchantItemTmp: Damage %u not handled in S'RW", damage); + TC_LOG_ERROR("spells", "Spell::EffectEnchantItemTmp: Damage %u not handled in S'RW.", damage); return; } @@ -2861,14 +2857,14 @@ void Spell::EffectEnchantItemTmp(SpellEffIndex effIndex) if (!enchant_id) { - TC_LOG_ERROR("spells", "Spell %u Effect %u (SPELL_EFFECT_ENCHANT_ITEM_TEMPORARY) have 0 as enchanting id", m_spellInfo->Id, effIndex); + TC_LOG_ERROR("spells", "Spell %u Effect %u (SPELL_EFFECT_ENCHANT_ITEM_TEMPORARY) has enchanting id 0.", m_spellInfo->Id, effIndex); return; } SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id); if (!pEnchant) { - TC_LOG_ERROR("spells", "Spell %u Effect %u (SPELL_EFFECT_ENCHANT_ITEM_TEMPORARY) have not existed enchanting id %u ", m_spellInfo->Id, effIndex, enchant_id); + TC_LOG_ERROR("spells", "Spell %u Effect %u (SPELL_EFFECT_ENCHANT_ITEM_TEMPORARY) has a non-existing enchanting id %u ", m_spellInfo->Id, effIndex, enchant_id); return; } @@ -3984,7 +3980,7 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex) case 31893: spell_heal = 48084; break; case 31883: spell_heal = 48085; break; default: - TC_LOG_ERROR("spells", "Unknown Lightwell spell caster %u", m_caster->GetEntry()); + TC_LOG_ERROR("spells", "Unknown Lightwell spell caster %u.", m_caster->GetEntry()); return; } @@ -4137,14 +4133,14 @@ void Spell::EffectDuel(SpellEffIndex effIndex) return; // Players can only fight a duel in zones with this flag - AreaTableEntry const* casterAreaEntry = GetAreaEntryByAreaID(caster->GetAreaId()); + AreaTableEntry const* casterAreaEntry = sAreaTableStore.LookupEntry(caster->GetAreaId()); if (casterAreaEntry && !(casterAreaEntry->flags & AREA_FLAG_ALLOW_DUELS)) { SendCastResult(SPELL_FAILED_NO_DUELING); // Dueling isn't allowed here return; } - AreaTableEntry const* targetAreaEntry = GetAreaEntryByAreaID(target->GetAreaId()); + AreaTableEntry const* targetAreaEntry = sAreaTableStore.LookupEntry(target->GetAreaId()); if (targetAreaEntry && !(targetAreaEntry->flags & AREA_FLAG_ALLOW_DUELS)) { SendCastResult(SPELL_FAILED_NO_DUELING); // Dueling isn't allowed here @@ -4223,7 +4219,7 @@ void Spell::EffectStuck(SpellEffIndex /*effIndex*/) return; TC_LOG_DEBUG("spells", "Spell Effect: Stuck"); - TC_LOG_DEBUG("spells", "Player %s (guid %u) used auto-unstuck future at map %u (%f, %f, %f)", player->GetName().c_str(), player->GetGUID().GetCounter(), player->GetMapId(), player->GetPositionX(), player->GetPositionY(), player->GetPositionZ()); + TC_LOG_DEBUG("spells", "Player %s (guid %u) used the auto-unstuck feature at map %u (%f, %f, %f).", player->GetName().c_str(), player->GetGUID().GetCounter(), player->GetMapId(), player->GetPositionX(), player->GetPositionY(), player->GetPositionZ()); if (player->IsInFlight()) return; @@ -4903,7 +4899,7 @@ void Spell::EffectPullTowards(SpellEffIndex effIndex) float speedXY = float(m_spellInfo->Effects[effIndex].MiscValue) * 0.1f; float speedZ = unitTarget->GetDistance(pos) / speedXY * 0.5f * Movement::gravity; - unitTarget->GetMotionMaster()->MoveJump(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), speedXY, speedZ); + unitTarget->GetMotionMaster()->MoveJump(pos, speedXY, speedZ); } void Spell::EffectDispelMechanic(SpellEffIndex effIndex) @@ -5105,7 +5101,7 @@ void Spell::EffectTransmitted(SpellEffIndex effIndex) if (!goinfo) { - TC_LOG_ERROR("sql.sql", "Gameobject (Entry: %u) not exist and not created at spell (ID: %u) cast", name_id, m_spellInfo->Id); + TC_LOG_ERROR("sql.sql", "Gameobject (Entry: %u) does not exist and is not created by spell (ID: %u) cast.", name_id, m_spellInfo->Id); return; } @@ -5746,7 +5742,7 @@ void Spell::EffectPlayMusic(SpellEffIndex effIndex) if (!sSoundEntriesStore.LookupEntry(soundid)) { - TC_LOG_ERROR("spells", "EffectPlayMusic: Sound (Id: %u) not exist in spell %u.", soundid, m_spellInfo->Id); + TC_LOG_ERROR("spells", "EffectPlayMusic: Sound (Id: %u) does not exist in spell %u.", soundid, m_spellInfo->Id); return; } @@ -5803,7 +5799,7 @@ void Spell::EffectPlaySound(SpellEffIndex effIndex) if (!sSoundEntriesStore.LookupEntry(soundId)) { - TC_LOG_ERROR("spells", "EffectPlaySound: Sound (Id: %u) not exist in spell %u.", soundId, m_spellInfo->Id); + TC_LOG_ERROR("spells", "EffectPlaySound: Sound (Id: %u) does not exist in spell %u.", soundId, m_spellInfo->Id); return; } diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 699e4857ee0..069c794ca8b 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -1180,6 +1180,11 @@ bool SpellInfo::IsAutoRepeatRangedSpell() const return HasAttribute(SPELL_ATTR2_AUTOREPEAT_FLAG); } +bool SpellInfo::HasInitialAggro() const +{ + return !(HasAttribute(SPELL_ATTR1_NO_THREAT) || HasAttribute(SPELL_ATTR3_NO_INITIAL_AGGRO)); +} + bool SpellInfo::IsAffectedBySpellMods() const { return !HasAttribute(SPELL_ATTR3_NO_DONE_BONUS); diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h index dbbab5fb30b..ba658c885fa 100644 --- a/src/server/game/Spells/SpellInfo.h +++ b/src/server/game/Spells/SpellInfo.h @@ -420,6 +420,7 @@ public: bool IsBreakingStealth() const; bool IsRangedWeaponSpell() const; bool IsAutoRepeatRangedSpell() const; + bool HasInitialAggro() const; bool IsAffectedBySpellMods() const; bool IsAffectedBySpellMod(SpellModifier const* mod) const; diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index ff8fc4539ff..0f80d83e0ff 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -376,29 +376,29 @@ bool SpellMgr::IsSpellValid(SpellInfo const* spellInfo, Player* player, bool msg { if (spellInfo->Effects[i].ItemType == 0) { - // skip auto-loot crafting spells, its not need explicit item info (but have special fake items sometime) + // skip auto-loot crafting spells, it does not need explicit item info (but has special fake items sometimes). if (!spellInfo->IsLootCrafting()) { if (msg) { if (player) - ChatHandler(player->GetSession()).PSendSysMessage("Craft spell %u not have create item entry.", spellInfo->Id); + ChatHandler(player->GetSession()).PSendSysMessage("The craft spell %u does not have a create item entry.", spellInfo->Id); else - TC_LOG_ERROR("sql.sql", "Craft spell %u not have create item entry.", spellInfo->Id); + TC_LOG_ERROR("sql.sql", "The craft spell %u does not have a create item entry.", spellInfo->Id); } return false; } } - // also possible IsLootCrafting case but fake item must exist anyway + // also possible IsLootCrafting case but fake items must exist anyway else if (!sObjectMgr->GetItemTemplate(spellInfo->Effects[i].ItemType)) { if (msg) { if (player) - ChatHandler(player->GetSession()).PSendSysMessage("Craft spell %u create not-exist in DB item (Entry: %u) and then...", spellInfo->Id, spellInfo->Effects[i].ItemType); + ChatHandler(player->GetSession()).PSendSysMessage("Craft spell %u has created a non-existing item in DB (Entry: %u) and then...", spellInfo->Id, spellInfo->Effects[i].ItemType); else - TC_LOG_ERROR("sql.sql", "Craft spell %u create not-exist in DB item (Entry: %u) and then...", spellInfo->Id, spellInfo->Effects[i].ItemType); + TC_LOG_ERROR("sql.sql", "Craft spell %u has created a non-existing item in DB (Entry: %u) and then...", spellInfo->Id, spellInfo->Effects[i].ItemType); } return false; } @@ -434,9 +434,9 @@ bool SpellMgr::IsSpellValid(SpellInfo const* spellInfo, Player* player, bool msg if (msg) { if (player) - ChatHandler(player->GetSession()).PSendSysMessage("Craft spell %u have not-exist reagent in DB item (Entry: %u) and then...", spellInfo->Id, spellInfo->Reagent[j]); + ChatHandler(player->GetSession()).PSendSysMessage("Craft spell %u refers a non-existing reagent in DB item (Entry: %u) and then...", spellInfo->Id, spellInfo->Reagent[j]); else - TC_LOG_ERROR("sql.sql", "Craft spell %u have not-exist reagent in DB item (Entry: %u) and then...", spellInfo->Id, spellInfo->Reagent[j]); + TC_LOG_ERROR("sql.sql", "Craft spell %u refers to a non-existing reagent in DB, item (Entry: %u) and then...", spellInfo->Id, spellInfo->Reagent[j]); } return false; } @@ -455,7 +455,7 @@ uint32 SpellMgr::GetSpellDifficultyId(uint32 spellId) const void SpellMgr::SetSpellDifficultyId(uint32 spellId, uint32 id) { if (uint32 i = GetSpellDifficultyId(spellId)) - TC_LOG_ERROR("spells", "SpellMgr::SetSpellDifficultyId: Spell %u has already spellDifficultyId %u. Will override with spellDifficultyId %u.", spellId, i, id); + TC_LOG_ERROR("spells", "SpellMgr::SetSpellDifficultyId: The spell %u already has spellDifficultyId %u. Will override with spellDifficultyId %u.", spellId, i, id); mSpellDifficultySearcherMap[spellId] = id; } @@ -470,7 +470,7 @@ uint32 SpellMgr::GetSpellIdForDifficulty(uint32 spellId, Unit const* caster) con uint32 mode = uint32(caster->GetMap()->GetSpawnMode()); if (mode >= MAX_DIFFICULTY) { - TC_LOG_ERROR("spells", "SpellMgr::GetSpellIdForDifficulty: Incorrect Difficulty for spell %u.", spellId); + TC_LOG_ERROR("spells", "SpellMgr::GetSpellIdForDifficulty: Incorrect difficulty for spell %u.", spellId); return spellId; //return source spell } @@ -481,7 +481,7 @@ uint32 SpellMgr::GetSpellIdForDifficulty(uint32 spellId, Unit const* caster) con SpellDifficultyEntry const* difficultyEntry = sSpellDifficultyStore.LookupEntry(difficultyId); if (!difficultyEntry) { - TC_LOG_ERROR("spells", "SpellMgr::GetSpellIdForDifficulty: SpellDifficultyEntry not found for spell %u. This should never happen.", spellId); + TC_LOG_ERROR("spells", "SpellMgr::GetSpellIdForDifficulty: SpellDifficultyEntry was not found for spell %u. This should never happen.", spellId); return spellId; //return source spell } @@ -874,7 +874,7 @@ bool SpellMgr::IsSpellProcEventCanTriggeredBy(SpellInfo const* spellProto, Spell // For melee triggers if (procSpell == NULL) { - // Check (if set) for school (melee attack have Normal school) + // Check (if set) for school (melee attack has Normal school) if (spellProcEvent->schoolMask && (spellProcEvent->schoolMask & SPELL_SCHOOL_MASK_NORMAL) == 0) return false; } @@ -894,7 +894,7 @@ bool SpellMgr::IsSpellProcEventCanTriggeredBy(SpellInfo const* spellProto, Spell if (!(spellProcEvent->spellFamilyMask & procSpell->SpellFamilyFlags)) return false; hasFamilyMask = true; - // Some spells are not considered as active even with have spellfamilyflags + // Some spells are not considered as active even with spellfamilyflags set if (!(procEvent_procEx & PROC_EX_ONLY_ACTIVE_SPELL)) active = true; } @@ -1121,27 +1121,27 @@ SpellAreaForAreaMapBounds SpellMgr::GetSpellAreaForAreaMapBounds(uint32 area_id) bool SpellArea::IsFitToRequirements(Player const* player, uint32 newZone, uint32 newArea) const { - if (gender != GENDER_NONE) // not in expected gender + if (gender != GENDER_NONE) // is not expected gender if (!player || gender != player->getGender()) return false; - if (raceMask) // not in expected race + if (raceMask) // is not expected race if (!player || !(raceMask & player->getRaceMask())) return false; - if (areaId) // not in expected zone + if (areaId) // is not in expected zone if (newZone != areaId && newArea != areaId) return false; - if (questStart) // not in expected required quest state + if (questStart) // is not in expected required quest state if (!player || (((1 << player->GetQuestStatus(questStart)) & questStartStatus) == 0)) return false; - if (questEnd) // not in expected forbidden quest state + if (questEnd) // is not in expected forbidden quest state if (!player || (((1 << player->GetQuestStatus(questEnd)) & questEndStatus) == 0)) return false; - if (auraSpell) // not have expected aura + if (auraSpell) // does not have expected aura if (!player || (auraSpell > 0 && !player->HasAura(auraSpell)) || (auraSpell < 0 && player->HasAura(-auraSpell))) return false; @@ -1159,7 +1159,7 @@ bool SpellArea::IsFitToRequirements(Player const* player, uint32 newZone, uint32 if (!player) return false; - AreaTableEntry const* pArea = GetAreaEntryByAreaID(player->GetAreaId()); + AreaTableEntry const* pArea = sAreaTableStore.LookupEntry(player->GetAreaId()); if (!(pArea && pArea->flags & AREA_FLAG_NO_FLY_ZONE)) return false; if (!player->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED) && !player->HasAuraType(SPELL_AURA_FLY)) @@ -1341,7 +1341,7 @@ void SpellMgr::LoadSpellRanks() SpellInfo const* first = GetSpellInfo(lastSpell); if (!first) { - TC_LOG_ERROR("sql.sql", "Spell rank identifier(first_spell_id) %u listed in `spell_ranks` does not exist!", lastSpell); + TC_LOG_ERROR("sql.sql", "The spell rank identifier(first_spell_id) %u listed in `spell_ranks` does not exist!", lastSpell); continue; } // check if chain is long enough @@ -1358,14 +1358,14 @@ void SpellMgr::LoadSpellRanks() SpellInfo const* spell = GetSpellInfo(itr->first); if (!spell) { - TC_LOG_ERROR("sql.sql", "Spell %u (rank %u) listed in `spell_ranks` for chain %u does not exist!", itr->first, itr->second, lastSpell); + TC_LOG_ERROR("sql.sql", "The spell %u (rank %u) listed in `spell_ranks` for chain %u does not exist!", itr->first, itr->second, lastSpell); valid = false; break; } ++curRank; if (itr->second != curRank) { - TC_LOG_ERROR("sql.sql", "Spell %u (rank %u) listed in `spell_ranks` for chain %u does not have proper rank value(should be %u)!", itr->first, itr->second, lastSpell, curRank); + TC_LOG_ERROR("sql.sql", "The spell %u (rank %u) listed in `spell_ranks` for chain %u does not have a proper rank value (should be %u)!", itr->first, itr->second, lastSpell, curRank); valid = false; break; } @@ -1381,7 +1381,7 @@ void SpellMgr::LoadSpellRanks() int32 addedSpell = itr->first; if (mSpellInfoMap[addedSpell]->ChainEntry) - TC_LOG_ERROR("sql.sql", "Spell %u (rank: %u, first: %u) listed in `spell_ranks` has already ChainEntry from dbc.", addedSpell, itr->second, lastSpell); + TC_LOG_ERROR("sql.sql", "The spell %u (rank: %u, first: %u) listed in `spell_ranks` already has ChainEntry from dbc.", addedSpell, itr->second, lastSpell); mSpellChains[addedSpell].first = GetSpellInfo(lastSpell); mSpellChains[addedSpell].last = GetSpellInfo(rankChain.back().first); @@ -1435,26 +1435,26 @@ void SpellMgr::LoadSpellRequired() SpellInfo const* spell = GetSpellInfo(spell_id); if (!spell) { - TC_LOG_ERROR("sql.sql", "spell_id %u in `spell_required` table is not found in dbcs, skipped", spell_id); + TC_LOG_ERROR("sql.sql", "spell_id %u in `spell_required` table could not be found in dbc, skipped.", spell_id); continue; } SpellInfo const* reqSpell = GetSpellInfo(spell_req); if (!reqSpell) { - TC_LOG_ERROR("sql.sql", "req_spell %u in `spell_required` table is not found in dbcs, skipped", spell_req); + TC_LOG_ERROR("sql.sql", "req_spell %u in `spell_required` table could not be found in dbc, skipped.", spell_req); continue; } if (spell->IsRankOf(reqSpell)) { - TC_LOG_ERROR("sql.sql", "req_spell %u and spell_id %u in `spell_required` table are ranks of the same spell, entry not needed, skipped", spell_req, spell_id); + TC_LOG_ERROR("sql.sql", "req_spell %u and spell_id %u in `spell_required` table are ranks of the same spell, entry not needed, skipped.", spell_req, spell_id); continue; } if (IsSpellRequiringSpell(spell_id, spell_req)) { - TC_LOG_ERROR("sql.sql", "duplicated entry of req_spell %u and spell_id %u in `spell_required`, skipped", spell_req, spell_id); + TC_LOG_ERROR("sql.sql", "Duplicate entry of req_spell %u and spell_id %u in `spell_required`, skipped.", spell_req, spell_id); continue; } @@ -1532,19 +1532,19 @@ void SpellMgr::LoadSpellLearnSpells() if (!GetSpellInfo(spell_id)) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_learn_spell` does not exist", spell_id); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_learn_spell` does not exist.", spell_id); continue; } if (!GetSpellInfo(node.spell)) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_learn_spell` learning not existed spell %u", spell_id, node.spell); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_learn_spell` learning non-existing spell %u.", spell_id, node.spell); continue; } if (GetTalentSpellCost(node.spell)) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_learn_spell` attempt learning talent spell %u, skipped", spell_id, node.spell); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_learn_spell` attempts learning talent spell %u, skipped.", spell_id, node.spell); continue; } @@ -1586,7 +1586,7 @@ void SpellMgr::LoadSpellLearnSpells() { if (itr->second.spell == dbc_node.spell) { - TC_LOG_ERROR("sql.sql", "Spell %u auto-learn spell %u in spell.dbc then the record in `spell_learn_spell` is redundant, please fix DB.", + TC_LOG_ERROR("sql.sql", "The spell %u is an auto-learn spell %u in spell.dbc and the record in `spell_learn_spell` is redundant. Please update your DB.", spell, dbc_node.spell); found = true; break; @@ -1663,7 +1663,7 @@ void SpellMgr::LoadSpellTargetPositions() } else { - TC_LOG_ERROR("sql.sql", "Spell (Id: %u, effIndex: %u) listed in `spell_target_position` does not have target TARGET_DEST_DB (17).", Spell_ID, effIndex); + TC_LOG_ERROR("sql.sql", "Spell (Id: %u, effIndex: %u) listed in `spell_target_position` does not have a target TARGET_DEST_DB (17).", Spell_ID, effIndex); continue; } @@ -1700,7 +1700,7 @@ void SpellMgr::LoadSpellTargetPositions() if (found) { if (!sSpellMgr->GetSpellTargetPosition(i)) - TC_LOG_DEBUG("spells", "Spell (ID: %u) does not have record in `spell_target_position`", i); + TC_LOG_DEBUG("spells", "Spell (ID: %u) does not have a record in `spell_target_position`.", i); } }*/ @@ -1759,12 +1759,12 @@ void SpellMgr::LoadSpellGroups() if (!spellInfo) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_group` does not exist", itr->second); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_group` does not exist", itr->second); mSpellGroupSpell.erase(itr++); } else if (spellInfo->GetRank() > 1) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_group` is not first rank of spell", itr->second); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_group` is not the first rank of the spell.", itr->second); mSpellGroupSpell.erase(itr++); } else @@ -1810,7 +1810,7 @@ void SpellMgr::LoadSpellGroupStackRules() uint8 stack_rule = fields[1].GetInt8(); if (stack_rule >= SPELL_GROUP_STACK_RULE_MAX) { - TC_LOG_ERROR("sql.sql", "SpellGroupStackRule %u listed in `spell_group_stack_rules` does not exist", stack_rule); + TC_LOG_ERROR("sql.sql", "SpellGroupStackRule %u listed in `spell_group_stack_rules` does not exist.", stack_rule); continue; } @@ -1818,7 +1818,7 @@ void SpellMgr::LoadSpellGroupStackRules() if (spellGroup.first == spellGroup.second) { - TC_LOG_ERROR("sql.sql", "SpellGroup id %u listed in `spell_group_stack_rules` does not exist", group_id); + TC_LOG_ERROR("sql.sql", "SpellGroup id %u listed in `spell_group_stack_rules` does not exist.", group_id); continue; } @@ -1862,18 +1862,18 @@ void SpellMgr::LoadSpellProcEvents() SpellInfo const* spellInfo = GetSpellInfo(spellId); if (!spellInfo) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_proc_event` does not exist", spellId); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_proc_event` does not exist.", spellId); continue; } if (allRanks) { if (!spellInfo->IsRanked()) - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_proc_event` with all ranks, but spell has no ranks.", spellId); + TC_LOG_ERROR("sql.sql", "The spell %u is listed in `spell_proc_event` with all ranks, but spell has no ranks.", spellId); if (spellInfo->GetFirstRankSpell()->Id != uint32(spellId)) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_proc_event` is not first rank of spell.", spellId); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_proc_event` is not first rank of spell.", spellId); continue; } } @@ -1895,12 +1895,12 @@ void SpellMgr::LoadSpellProcEvents() { if (mSpellProcEventMap.find(spellInfo->Id) != mSpellProcEventMap.end()) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_proc_event` already has its first rank in table.", spellInfo->Id); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_proc_event` already has its first rank in table.", spellInfo->Id); break; } if (!spellInfo->ProcFlags && !spellProcEvent.procFlags) - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_proc_event` probably not triggered spell", spellInfo->Id); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_proc_event` is probably not a triggered spell.", spellInfo->Id); mSpellProcEventMap[spellInfo->Id] = spellProcEvent; @@ -1948,18 +1948,18 @@ void SpellMgr::LoadSpellProcs() SpellInfo const* spellInfo = GetSpellInfo(spellId); if (!spellInfo) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_proc` does not exist", spellId); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_proc` does not exist", spellId); continue; } if (allRanks) { if (!spellInfo->IsRanked()) - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_proc` with all ranks, but spell has no ranks.", spellId); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_proc` with all ranks, but spell has no ranks.", spellId); if (spellInfo->GetFirstRankSpell()->Id != uint32(spellId)) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_proc` is not first rank of spell.", spellId); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_proc` is not the first rank of the spell.", spellId); continue; } } @@ -1986,7 +1986,7 @@ void SpellMgr::LoadSpellProcs() { if (mSpellProcMap.find(spellInfo->Id) != mSpellProcMap.end()) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_proc` already has its first rank in table.", spellInfo->Id); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_proc` already has its first rank in the table.", spellInfo->Id); break; } @@ -2007,42 +2007,42 @@ void SpellMgr::LoadSpellProcs() TC_LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId %u has wrong `spellFamilyName` set: %u", spellInfo->Id, procEntry.spellFamilyName); if (procEntry.chance < 0) { - TC_LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId %u has negative value in `chance` field", spellInfo->Id); + TC_LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId %u has negative value in the `chance` field", spellInfo->Id); procEntry.chance = 0; } if (procEntry.ratePerMinute < 0) { - TC_LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId %u has negative value in `ratePerMinute` field", spellInfo->Id); + TC_LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId %u has negative value in the `ratePerMinute` field", spellInfo->Id); procEntry.ratePerMinute = 0; } if (cooldown < 0) { - TC_LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId %u has negative value in `cooldown` field", spellInfo->Id); + TC_LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId %u has negative value in the `cooldown` field", spellInfo->Id); procEntry.cooldown = 0; } if (procEntry.chance == 0 && procEntry.ratePerMinute == 0) - TC_LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId %u doesn't have `chance` and `ratePerMinute` values defined, proc will not be triggered", spellInfo->Id); + TC_LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId %u doesn't have any `chance` and `ratePerMinute` values defined, proc will not be triggered", spellInfo->Id); if (procEntry.charges > 99) { - TC_LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId %u has too big value in `charges` field", spellInfo->Id); + TC_LOG_ERROR("sql.sql", "The `spell_proc` table entry for spellId %u has a too big `charges` field value.", spellInfo->Id); procEntry.charges = 99; } if (!procEntry.typeMask) - TC_LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId %u doesn't have `typeMask` value defined, proc will not be triggered", spellInfo->Id); + TC_LOG_ERROR("sql.sql", "The `spell_proc` table entry for spellId %u doesn't have any `typeMask` value defined, proc will not be triggered.", spellInfo->Id); if (procEntry.spellTypeMask & ~PROC_SPELL_TYPE_MASK_ALL) TC_LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId %u has wrong `spellTypeMask` set: %u", spellInfo->Id, procEntry.spellTypeMask); if (procEntry.spellTypeMask && !(procEntry.typeMask & (SPELL_PROC_FLAG_MASK | PERIODIC_PROC_FLAG_MASK))) - TC_LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId %u has `spellTypeMask` value defined, but it won't be used for defined `typeMask` value", spellInfo->Id); + TC_LOG_ERROR("sql.sql", "The `spell_proc` table entry for spellId %u has `spellTypeMask` value defined, but it will not be used for the defined `typeMask` value.", spellInfo->Id); if (!procEntry.spellPhaseMask && procEntry.typeMask & REQ_SPELL_PHASE_PROC_FLAG_MASK) - TC_LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId %u doesn't have `spellPhaseMask` value defined, but it's required for defined `typeMask` value, proc will not be triggered", spellInfo->Id); + TC_LOG_ERROR("sql.sql", "The `spell_proc` table entry for spellId %u doesn't have any `spellPhaseMask` value defined, but it is required for the defined `typeMask` value. Proc will not be triggered.", spellInfo->Id); if (procEntry.spellPhaseMask & ~PROC_SPELL_PHASE_MASK_ALL) - TC_LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId %u has wrong `spellPhaseMask` set: %u", spellInfo->Id, procEntry.spellPhaseMask); + TC_LOG_ERROR("sql.sql", "The `spell_proc` table entry for spellId %u has wrong `spellPhaseMask` set: %u", spellInfo->Id, procEntry.spellPhaseMask); if (procEntry.spellPhaseMask && !(procEntry.typeMask & REQ_SPELL_PHASE_PROC_FLAG_MASK)) - TC_LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId %u has `spellPhaseMask` value defined, but it won't be used for defined `typeMask` value", spellInfo->Id); + TC_LOG_ERROR("sql.sql", "The `spell_proc` table entry for spellId %u has a `spellPhaseMask` value defined, but it will not be used for the defined `typeMask` value.", spellInfo->Id); if (procEntry.hitMask & ~PROC_HIT_MASK_ALL) - TC_LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId %u has wrong `hitMask` set: %u", spellInfo->Id, procEntry.hitMask); + TC_LOG_ERROR("sql.sql", "The `spell_proc` table entry for spellId %u has wrong `hitMask` set: %u", spellInfo->Id, procEntry.hitMask); if (procEntry.hitMask && !(procEntry.typeMask & TAKEN_HIT_PROC_FLAG_MASK || (procEntry.typeMask & DONE_HIT_PROC_FLAG_MASK && (!procEntry.spellPhaseMask || procEntry.spellPhaseMask & (PROC_SPELL_PHASE_HIT | PROC_SPELL_PHASE_FINISH))))) - TC_LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId %u has `hitMask` value defined, but it won't be used for defined `typeMask` and `spellPhaseMask` values", spellInfo->Id); + TC_LOG_ERROR("sql.sql", "The `spell_proc` table entry for spellId %u has `hitMask` value defined, but it will not be used for defined `typeMask` and `spellPhaseMask` values.", spellInfo->Id); mSpellProcMap[spellInfo->Id] = procEntry; @@ -2081,7 +2081,7 @@ void SpellMgr::LoadSpellBonusess() SpellInfo const* spell = GetSpellInfo(entry); if (!spell) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_bonus_data` does not exist", entry); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_bonus_data` does not exist.", entry); continue; } @@ -2120,7 +2120,7 @@ void SpellMgr::LoadSpellThreats() if (!GetSpellInfo(entry)) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_threat` does not exist", entry); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_threat` does not exist.", entry); continue; } @@ -2189,21 +2189,21 @@ void SpellMgr::LoadSpellPetAuras() SpellInfo const* spellInfo = GetSpellInfo(spell); if (!spellInfo) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_pet_auras` does not exist", spell); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_pet_auras` does not exist.", spell); continue; } if (spellInfo->Effects[eff].Effect != SPELL_EFFECT_DUMMY && (spellInfo->Effects[eff].Effect != SPELL_EFFECT_APPLY_AURA || spellInfo->Effects[eff].ApplyAuraName != SPELL_AURA_DUMMY)) { - TC_LOG_ERROR("spells", "Spell %u listed in `spell_pet_auras` does not have dummy aura or dummy effect", spell); + TC_LOG_ERROR("spells", "The spell %u listed in `spell_pet_auras` does not have any dummy aura or dummy effect.", spell); continue; } SpellInfo const* spellInfo2 = GetSpellInfo(aura); if (!spellInfo2) { - TC_LOG_ERROR("sql.sql", "Aura %u listed in `spell_pet_auras` does not exist", aura); + TC_LOG_ERROR("sql.sql", "The aura %u listed in `spell_pet_auras` does not exist.", aura); continue; } @@ -2281,7 +2281,7 @@ void SpellMgr::LoadSpellEnchantProcData() SpellItemEnchantmentEntry const* ench = sSpellItemEnchantmentStore.LookupEntry(enchantId); if (!ench) { - TC_LOG_ERROR("sql.sql", "Enchancment %u listed in `spell_enchant_proc_data` does not exist", enchantId); + TC_LOG_ERROR("sql.sql", "The enchancment %u listed in `spell_enchant_proc_data` does not exist.", enchantId); continue; } @@ -2325,7 +2325,7 @@ void SpellMgr::LoadSpellLinked() SpellInfo const* spellInfo = GetSpellInfo(abs(trigger)); if (!spellInfo) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_linked_spell` does not exist", abs(trigger)); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_linked_spell` does not exist.", abs(trigger)); continue; } @@ -2333,13 +2333,13 @@ void SpellMgr::LoadSpellLinked() for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j) { if (spellInfo->Effects[j].CalcValue() == abs(effect)) - TC_LOG_ERROR("sql.sql", "Spell %u Effect: %u listed in `spell_linked_spell` has same bp%u like effect (possible hack)", abs(trigger), abs(effect), j); + TC_LOG_ERROR("sql.sql", "The spell %u Effect: %u listed in `spell_linked_spell` has same bp%u like effect (possible hack).", abs(trigger), abs(effect), j); } spellInfo = GetSpellInfo(abs(effect)); if (!spellInfo) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_linked_spell` does not exist", abs(effect)); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_linked_spell` does not exist.", abs(effect)); continue; } @@ -2584,7 +2584,7 @@ void SpellMgr::LoadSpellAreas() } else { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_area` does not exist", spell); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_area` does not exist", spell); continue; } @@ -2613,20 +2613,20 @@ void SpellMgr::LoadSpellAreas() if (!ok) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_area` already listed with similar requirements.", spell); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_area` is already listed with similar requirements.", spell); continue; } } - if (spellArea.areaId && !GetAreaEntryByAreaID(spellArea.areaId)) + if (spellArea.areaId && !sAreaTableStore.LookupEntry(spellArea.areaId)) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_area` have wrong area (%u) requirement", spell, spellArea.areaId); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_area` has a wrong area (%u) requirement.", spell, spellArea.areaId); continue; } if (spellArea.questStart && !sObjectMgr->GetQuestTemplate(spellArea.questStart)) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_area` have wrong start quest (%u) requirement", spell, spellArea.questStart); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_area` has a wrong start quest (%u) requirement.", spell, spellArea.questStart); continue; } @@ -2634,7 +2634,7 @@ void SpellMgr::LoadSpellAreas() { if (!sObjectMgr->GetQuestTemplate(spellArea.questEnd)) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_area` have wrong end quest (%u) requirement", spell, spellArea.questEnd); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_area` has a wrong ending quest (%u) requirement.", spell, spellArea.questEnd); continue; } } @@ -2644,13 +2644,13 @@ void SpellMgr::LoadSpellAreas() SpellInfo const* spellInfo = GetSpellInfo(abs(spellArea.auraSpell)); if (!spellInfo) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_area` have wrong aura spell (%u) requirement", spell, abs(spellArea.auraSpell)); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_area` has wrong aura spell (%u) requirement", spell, abs(spellArea.auraSpell)); continue; } if (uint32(abs(spellArea.auraSpell)) == spellArea.spellId) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_area` have aura spell (%u) requirement for itself", spell, abs(spellArea.auraSpell)); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_area` has aura spell (%u) requirement for itself", spell, abs(spellArea.auraSpell)); continue; } @@ -2670,7 +2670,7 @@ void SpellMgr::LoadSpellAreas() if (chain) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_area` have aura spell (%u) requirement that itself autocast from aura", spell, spellArea.auraSpell); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_area` has the aura spell (%u) requirement that it autocasts itself from the aura.", spell, spellArea.auraSpell); continue; } @@ -2686,7 +2686,7 @@ void SpellMgr::LoadSpellAreas() if (chain) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_area` have aura spell (%u) requirement that itself autocast from aura", spell, spellArea.auraSpell); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_area` has the aura spell (%u) requirement that the spell itself autocasts from the aura.", spell, spellArea.auraSpell); continue; } } @@ -2694,13 +2694,13 @@ void SpellMgr::LoadSpellAreas() if (spellArea.raceMask && (spellArea.raceMask & RACEMASK_ALL_PLAYABLE) == 0) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_area` have wrong race mask (%u) requirement", spell, spellArea.raceMask); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_area` has wrong race mask (%u) requirement.", spell, spellArea.raceMask); continue; } if (spellArea.gender != GENDER_NONE && spellArea.gender != GENDER_FEMALE && spellArea.gender != GENDER_MALE) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_area` have wrong gender (%u) requirement", spell, spellArea.gender); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_area` has wrong gender (%u) requirement.", spell, spellArea.gender); continue; } @@ -2987,13 +2987,6 @@ void SpellMgr::LoadSpellInfoCorrections() case 36350: // They Must Burn Bomb Aura (self) spellInfo->Effects[EFFECT_0].TriggerSpell = 36325; // They Must Burn Bomb Drop (DND) break; - case 49838: // Stop Time - case 69438: // Sample Satisfaction - case 69445: // Perfume Spritz - case 69489: // Chocolate Sample - case 69563: // Cologne Spritz - spellInfo->AttributesEx3 |= SPELL_ATTR3_NO_INITIAL_AGGRO; - break; case 61407: // Energize Cores case 62136: // Energize Cores case 54069: // Energize Cores diff --git a/src/server/game/Texts/CreatureTextMgr.cpp b/src/server/game/Texts/CreatureTextMgr.cpp index 8d3ee939e2c..499f0c9cbf0 100644 --- a/src/server/game/Texts/CreatureTextMgr.cpp +++ b/src/server/game/Texts/CreatureTextMgr.cpp @@ -191,7 +191,6 @@ void CreatureTextMgr::LoadCreatureTextLocales() } while (result->NextRow()); TC_LOG_INFO("server.loading", ">> Loaded %u creature localized texts in %u ms", textCount, GetMSTimeDiffToNow(oldMSTime)); - } uint32 CreatureTextMgr::SendChat(Creature* source, uint8 textGroup, WorldObject const* whisperTarget /*= nullptr*/, ChatMsg msgType /*= CHAT_MSG_ADDON*/, Language language /*= LANG_ADDON*/, CreatureTextRange range /*= TEXT_RANGE_NORMAL*/, uint32 sound /*= 0*/, Team team /*= TEAM_OTHER*/, bool gmOnly /*= false*/, Player* srcPlr /*= nullptr*/) @@ -228,42 +227,10 @@ uint32 CreatureTextMgr::SendChat(Creature* source, uint8 textGroup, WorldObject tempGroup = textGroupContainer; } - uint8 count = 0; - float lastChance = -1; - bool isEqualChanced = true; - - float totalChance = 0; - - for (CreatureTextGroup::const_iterator iter = tempGroup.begin(); iter != tempGroup.end(); ++iter) + auto iter = Trinity::Containers::SelectRandomWeightedContainerElement(tempGroup, [](CreatureTextEntry const& t) -> double { - if (lastChance >= 0 && lastChance != iter->probability) - isEqualChanced = false; - - lastChance = iter->probability; - totalChance += iter->probability; - ++count; - } - - int32 offset = -1; - if (!isEqualChanced) - { - for (CreatureTextGroup::const_iterator iter = tempGroup.begin(); iter != tempGroup.end(); ++iter) - { - uint32 chance = uint32(iter->probability); - uint32 r = urand(0, 100); - ++offset; - if (r <= chance) - break; - } - } - - uint32 pos = 0; - if (isEqualChanced || offset < 0) - pos = urand(0, count - 1); - else if (offset >= 0) - pos = offset; - - CreatureTextGroup::const_iterator iter = tempGroup.begin() + pos; + return t.probability; + }); ChatMsg finalType = (msgType == CHAT_MSG_ADDON) ? iter->type : msgType; Language finalLang = (language == LANG_ADDON) ? iter->lang : language; @@ -293,9 +260,7 @@ uint32 CreatureTextMgr::SendChat(Creature* source, uint8 textGroup, WorldObject SendChatPacket(finalSource, builder, finalType, whisperTarget, range, team, gmOnly); } - if (isEqualChanced || totalChance == 100.0f) - SetRepeatId(source, textGroup, iter->id); - + SetRepeatId(source, textGroup, iter->id); return iter->duration; } diff --git a/src/server/game/Weather/Weather.cpp b/src/server/game/Weather/Weather.cpp index f774916f4a5..7ef16e32031 100644 --- a/src/server/game/Weather/Weather.cpp +++ b/src/server/game/Weather/Weather.cpp @@ -152,7 +152,7 @@ bool Weather::ReGenerate() uint32 chance2 = chance1+ m_weatherChances->data[season].snowChance; uint32 chance3 = chance2+ m_weatherChances->data[season].stormChance; - uint32 rnd = urand(0, 99); + uint32 rnd = urand(1, 100); if (rnd <= chance1) m_type = WEATHER_TYPE_RAIN; else if (rnd <= chance2) diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 289a4d47666..b238b0a356d 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1003,7 +1003,7 @@ void World::LoadConfigSettings(bool reload) m_bool_configs[CONFIG_DETECT_POS_COLLISION] = sConfigMgr->GetBoolDefault("DetectPosCollision", true); m_bool_configs[CONFIG_RESTRICTED_LFG_CHANNEL] = sConfigMgr->GetBoolDefault("Channel.RestrictedLfg", true); - m_bool_configs[CONFIG_TALENTS_INSPECTING] = sConfigMgr->GetBoolDefault("TalentsInspecting", true); + m_int_configs[CONFIG_TALENTS_INSPECTING] = sConfigMgr->GetIntDefault("TalentsInspecting", 1); m_bool_configs[CONFIG_CHAT_FAKE_MESSAGE_PREVENTING] = sConfigMgr->GetBoolDefault("ChatFakeMessagePreventing", false); m_int_configs[CONFIG_CHAT_STRICT_LINK_CHECKING_SEVERITY] = sConfigMgr->GetIntDefault("ChatStrictLinkChecking.Severity", 0); m_int_configs[CONFIG_CHAT_STRICT_LINK_CHECKING_KICK] = sConfigMgr->GetIntDefault("ChatStrictLinkChecking.Kick", 0); diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 00b244c9efb..2f1580d887c 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -113,7 +113,6 @@ enum WorldBoolConfigs CONFIG_QUEST_IGNORE_RAID, CONFIG_DETECT_POS_COLLISION, CONFIG_RESTRICTED_LFG_CHANNEL, - CONFIG_TALENTS_INSPECTING, CONFIG_CHAT_FAKE_MESSAGE_PREVENTING, CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP, CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE, @@ -358,6 +357,7 @@ enum WorldIntConfigs CONFIG_NO_GRAY_AGGRO_BELOW, CONFIG_AUCTION_GETALL_DELAY, CONFIG_AUCTION_SEARCH_DELAY, + CONFIG_TALENTS_INSPECTING, INT_CONFIG_VALUE_COUNT }; diff --git a/src/server/scripts/CMakeLists.txt b/src/server/scripts/CMakeLists.txt index a15b6f8ad07..ea0b058b91d 100644 --- a/src/server/scripts/CMakeLists.txt +++ b/src/server/scripts/CMakeLists.txt @@ -16,9 +16,15 @@ if (USE_SCRIPTPCH) endif () message(STATUS "SCRIPT PREPARATIONS") -include(Spells/CMakeLists.txt) -include(Commands/CMakeLists.txt) +macro(PrepareScripts name out) + file(GLOB_RECURSE found + ${name}/*.h + ${name}/*.cpp + ) + list(APPEND ${out} ${found}) + message(STATUS " -> Prepared: ${name}") +endmacro(PrepareScripts) set(scripts_STAT_SRCS ${scripts_STAT_SRCS} @@ -28,16 +34,19 @@ set(scripts_STAT_SRCS ../game/Maps/AreaBoundary.cpp ) +PrepareScripts(Spells scripts_STAT_SRCS) +PrepareScripts(Commands scripts_STAT_SRCS) + if(SCRIPTS) - include(Custom/CMakeLists.txt) - include(World/CMakeLists.txt) - include(OutdoorPvP/CMakeLists.txt) - include(EasternKingdoms/CMakeLists.txt) - include(Kalimdor/CMakeLists.txt) - include(Outland/CMakeLists.txt) - include(Northrend/CMakeLists.txt) - include(Events/CMakeLists.txt) - include(Pet/CMakeLists.txt) + PrepareScripts(Custom scripts_STAT_SRCS) + PrepareScripts(World scripts_STAT_SRCS) + PrepareScripts(OutdoorPvP scripts_STAT_SRCS) + PrepareScripts(EasternKingdoms scripts_STAT_SRCS) + PrepareScripts(Kalimdor scripts_STAT_SRCS) + PrepareScripts(Outland scripts_STAT_SRCS) + PrepareScripts(Northrend scripts_STAT_SRCS) + PrepareScripts(Events scripts_STAT_SRCS) + PrepareScripts(Pet scripts_STAT_SRCS) endif() message(STATUS "SCRIPT PREPARATION COMPLETE") @@ -63,6 +72,7 @@ include_directories( ${CMAKE_SOURCE_DIR}/src/server/game/Addons ${CMAKE_SOURCE_DIR}/src/server/game/AI ${CMAKE_SOURCE_DIR}/src/server/game/AI/CoreAI + ${CMAKE_SOURCE_DIR}/src/server/game/AI/PlayerAI ${CMAKE_SOURCE_DIR}/src/server/game/AI/ScriptedAI ${CMAKE_SOURCE_DIR}/src/server/game/AI/SmartScripts ${CMAKE_SOURCE_DIR}/src/server/game/AuctionHouse diff --git a/src/server/scripts/Commands/CMakeLists.txt b/src/server/scripts/Commands/CMakeLists.txt deleted file mode 100644 index d4d75cd175f..00000000000 --- a/src/server/scripts/Commands/CMakeLists.txt +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> -# -# This file is free software; as a special exception the author gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -file(GLOB_RECURSE sources_Commands Commands/*.cpp Commands/*.h) - -set(scripts_STAT_SRCS - ${scripts_STAT_SRCS} - ${sources_Commands} -) - -message(" -> Prepared: Commands") diff --git a/src/server/scripts/Commands/cs_character.cpp b/src/server/scripts/Commands/cs_character.cpp index e048aabd4d7..eb1aa98f4ff 100644 --- a/src/server/scripts/Commands/cs_character.cpp +++ b/src/server/scripts/Commands/cs_character.cpp @@ -133,7 +133,7 @@ public: info.name = fields[1].GetString(); info.accountId = fields[2].GetUInt32(); - // account name will be empty for not existed account + // account name will be empty for nonexisting account AccountMgr::GetName(info.accountId, info.accountName); info.deleteDate = time_t(fields[3].GetUInt32()); foundList.push_back(info); @@ -169,11 +169,11 @@ public: if (!handler->GetSession()) handler->PSendSysMessage(LANG_CHARACTER_DELETED_LIST_LINE_CONSOLE, - itr->guid.GetCounter(), itr->name.c_str(), itr->accountName.empty() ? "<Not existed>" : itr->accountName.c_str(), + itr->guid.GetCounter(), itr->name.c_str(), itr->accountName.empty() ? "<Not existing>" : itr->accountName.c_str(), itr->accountId, dateStr.c_str()); else handler->PSendSysMessage(LANG_CHARACTER_DELETED_LIST_LINE_CHAT, - itr->guid.GetCounter(), itr->name.c_str(), itr->accountName.empty() ? "<Not existed>" : itr->accountName.c_str(), + itr->guid.GetCounter(), itr->name.c_str(), itr->accountName.empty() ? "<Not existing>" : itr->accountName.c_str(), itr->accountId, dateStr.c_str()); } @@ -193,7 +193,7 @@ public: */ static void HandleCharacterDeletedRestoreHelper(DeletedInfo const& delInfo, ChatHandler* handler) { - if (delInfo.accountName.empty()) // account not exist + if (delInfo.accountName.empty()) // account does not exist { handler->PSendSysMessage(LANG_CHARACTER_DELETED_SKIP_ACCOUNT, delInfo.name.c_str(), delInfo.guid.GetCounter(), delInfo.accountId); return; @@ -660,7 +660,7 @@ public: if (newCharName.empty()) { - // Drop not existed account cases + // Drop nonexisting account cases for (DeletedInfoList::iterator itr = foundList.begin(); itr != foundList.end(); ++itr) HandleCharacterDeletedRestoreHelper(*itr, handler); } @@ -810,7 +810,7 @@ public: if (levelStr && isalpha(levelStr[0])) { nameStr = levelStr; - levelStr = NULL; // current level will used + levelStr = NULL; // current level will be used } Player* target; diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index 9902b83ff63..b937fc4e0a4 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -93,7 +93,8 @@ public: { "moveflags", rbac::RBAC_PERM_COMMAND_DEBUG_MOVEFLAGS, false, &HandleDebugMoveflagsCommand, "" }, { "transport", rbac::RBAC_PERM_COMMAND_DEBUG_TRANSPORT, false, &HandleDebugTransportCommand, "" }, { "loadcells", rbac::RBAC_PERM_COMMAND_DEBUG_LOADCELLS, false, &HandleDebugLoadCellsCommand, "" }, - { "boundary", rbac::RBAC_PERM_COMMAND_DEBUG_BOUNDARY, false, &HandleDebugBoundaryCommand, "" } + { "boundary", rbac::RBAC_PERM_COMMAND_DEBUG_BOUNDARY, false, &HandleDebugBoundaryCommand, "" }, + { "raidreset", rbac::RBAC_PERM_COMMAND_INSTANCE_UNBIND, false, &HandleDebugRaidResetCommand, "" } }; static std::vector<ChatCommand> commandTable = { @@ -1442,6 +1443,32 @@ public: return true; } + + static bool HandleDebugRaidResetCommand(ChatHandler* /*handler*/, char const* args) + { + char* map_str = args ? strtok((char*)args, " ") : nullptr; + char* difficulty_str = args ? strtok(nullptr, " ") : nullptr; + + int32 map = map_str ? atoi(map_str) : -1; + if (map <= 0) + return false; + MapEntry const* mEntry = sMapStore.LookupEntry(map); + if (!mEntry || !mEntry->IsRaid()) + return false; + int32 difficulty = difficulty_str ? atoi(difficulty_str) : -1; + if (difficulty >= MAX_RAID_DIFFICULTY || difficulty < -1) + return false; + + if (difficulty == -1) + for (uint8 diff = 0; diff < MAX_RAID_DIFFICULTY; ++diff) + { + if (GetMapDifficultyData(mEntry->MapID, Difficulty(diff))) + sInstanceSaveMgr->ForceGlobalReset(mEntry->MapID, Difficulty(diff)); + } + else + sInstanceSaveMgr->ForceGlobalReset(mEntry->MapID, Difficulty(difficulty)); + return true; + } }; void AddSC_debug_commandscript() diff --git a/src/server/scripts/Commands/cs_go.cpp b/src/server/scripts/Commands/cs_go.cpp index b7acfb85f50..039af61c010 100644 --- a/src/server/scripts/Commands/cs_go.cpp +++ b/src/server/scripts/Commands/cs_go.cpp @@ -424,7 +424,7 @@ public: uint32 areaId = id ? (uint32)atoi(id) : player->GetZoneId(); - AreaTableEntry const* areaEntry = GetAreaEntryByAreaID(areaId); + AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(areaId); if (x < 0 || x > 100 || y < 0 || y > 100 || !areaEntry) { @@ -434,7 +434,7 @@ public: } // update to parent zone if exist (client map show only zones without parents) - AreaTableEntry const* zoneEntry = areaEntry->zone ? GetAreaEntryByAreaID(areaEntry->zone) : areaEntry; + AreaTableEntry const* zoneEntry = areaEntry->zone ? sAreaTableStore.LookupEntry(areaEntry->zone) : areaEntry; ASSERT(zoneEntry); Map const* map = sMapMgr->CreateBaseMap(zoneEntry->mapid); diff --git a/src/server/scripts/Commands/cs_group.cpp b/src/server/scripts/Commands/cs_group.cpp index 5e8952ce881..9f2bc86f9c0 100644 --- a/src/server/scripts/Commands/cs_group.cpp +++ b/src/server/scripts/Commands/cs_group.cpp @@ -348,10 +348,10 @@ public: phase = (!p->IsGameMaster() ? p->GetPhaseMask() : -1); uint32 locale = handler->GetSessionDbcLocale(); - AreaTableEntry const* area = GetAreaEntryByAreaID(p->GetAreaId()); + AreaTableEntry const* area = sAreaTableStore.LookupEntry(p->GetAreaId()); if (area) { - AreaTableEntry const* zone = GetAreaEntryByAreaID(area->zone); + AreaTableEntry const* zone = sAreaTableStore.LookupEntry(area->zone); if (zone) zoneName = zone->area_name[locale]; } diff --git a/src/server/scripts/Commands/cs_instance.cpp b/src/server/scripts/Commands/cs_instance.cpp index a53d1f00b54..d0325a317db 100644 --- a/src/server/scripts/Commands/cs_instance.cpp +++ b/src/server/scripts/Commands/cs_instance.cpp @@ -82,7 +82,7 @@ public: { InstanceSave* save = itr->second.save; std::string timeleft = GetTimeString(save->GetResetTime() - time(NULL)); - handler->PSendSysMessage(LANG_COMMAND_LIST_BIND_INFO, itr->first, save->GetInstanceId(), itr->second.perm ? "yes" : "no", save->GetDifficulty(), save->CanReset() ? "yes" : "no", timeleft.c_str()); + handler->PSendSysMessage(LANG_COMMAND_LIST_BIND_INFO, itr->first, save->GetInstanceId(), itr->second.perm ? "yes" : "no", itr->second.extendState == EXTEND_STATE_EXPIRED ? "expired" : itr->second.extendState == EXTEND_STATE_EXTENDED ? "yes" : "no", save->GetDifficulty(), save->CanReset() ? "yes" : "no", timeleft.c_str()); counter++; } } @@ -98,7 +98,7 @@ public: { InstanceSave* save = itr->second.save; std::string timeleft = GetTimeString(save->GetResetTime() - time(NULL)); - handler->PSendSysMessage(LANG_COMMAND_LIST_BIND_INFO, itr->first, save->GetInstanceId(), itr->second.perm ? "yes" : "no", save->GetDifficulty(), save->CanReset() ? "yes" : "no", timeleft.c_str()); + handler->PSendSysMessage(LANG_COMMAND_LIST_BIND_INFO, itr->first, save->GetInstanceId(), itr->second.perm ? "yes" : "no", "-", save->GetDifficulty(), save->CanReset() ? "yes" : "no", timeleft.c_str()); counter++; } } diff --git a/src/server/scripts/Commands/cs_lookup.cpp b/src/server/scripts/Commands/cs_lookup.cpp index 4e749d33fcf..61e6acfb4d8 100644 --- a/src/server/scripts/Commands/cs_lookup.cpp +++ b/src/server/scripts/Commands/cs_lookup.cpp @@ -97,9 +97,9 @@ public: wstrToLower(wNamePart); // Search in AreaTable.dbc - for (uint32 areaflag = 0; areaflag < sAreaStore.GetNumRows(); ++areaflag) + for (uint32 i = 0; i < sAreaTableStore.GetNumRows(); ++i) { - AreaTableEntry const* areaEntry = sAreaStore.LookupEntry(areaflag); + AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(i); if (areaEntry) { int locale = handler->GetSessionDbcLocale(); diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index 6ae509af443..c70246f7fb5 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -198,8 +198,8 @@ public: uint32 mapId = object->GetMapId(); MapEntry const* mapEntry = sMapStore.LookupEntry(mapId); - AreaTableEntry const* zoneEntry = GetAreaEntryByAreaID(zoneId); - AreaTableEntry const* areaEntry = GetAreaEntryByAreaID(areaId); + AreaTableEntry const* zoneEntry = sAreaTableStore.LookupEntry(zoneId); + AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(areaId); float zoneX = object->GetPositionX(); float zoneY = object->GetPositionY(); @@ -961,7 +961,7 @@ public: uint32 zoneId = player->GetZoneId(); - AreaTableEntry const* areaEntry = GetAreaEntryByAreaID(zoneId); + AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(zoneId); if (!areaEntry || areaEntry->zone !=0) { handler->PSendSysMessage(LANG_COMMAND_GRAVEYARDWRONGZONE, graveyardId, zoneId); @@ -1052,17 +1052,23 @@ public: return false; } - int32 area = GetAreaFlagByAreaID(atoi((char*)args)); - int32 offset = area / 32; + AreaTableEntry const* area = sAreaTableStore.LookupEntry(atoi(args)); + if (!area) + { + handler->SendSysMessage(LANG_BAD_VALUE); + handler->SetSentErrorMessage(true); + return false; + } - if (area<0 || offset >= PLAYER_EXPLORED_ZONES_SIZE) + int32 offset = area->exploreFlag / 32; + if (offset >= PLAYER_EXPLORED_ZONES_SIZE) { handler->SendSysMessage(LANG_BAD_VALUE); handler->SetSentErrorMessage(true); return false; } - uint32 val = uint32((1 << (area % 32))); + uint32 val = uint32((1 << (area->exploreFlag % 32))); uint32 currFields = playerTarget->GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset); playerTarget->SetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset, uint32((currFields | val))); @@ -1083,17 +1089,23 @@ public: return false; } - int32 area = GetAreaFlagByAreaID(atoi((char*)args)); - int32 offset = area / 32; + AreaTableEntry const* area = sAreaTableStore.LookupEntry(atoi(args)); + if (!area) + { + handler->SendSysMessage(LANG_BAD_VALUE); + handler->SetSentErrorMessage(true); + return false; + } - if (area < 0 || offset >= PLAYER_EXPLORED_ZONES_SIZE) + int32 offset = area->exploreFlag / 32; + if (offset >= PLAYER_EXPLORED_ZONES_SIZE) { handler->SendSysMessage(LANG_BAD_VALUE); handler->SetSentErrorMessage(true); return false; } - uint32 val = uint32((1 << (area % 32))); + uint32 val = uint32((1 << (area->exploreFlag % 32))); uint32 currFields = playerTarget->GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset); playerTarget->SetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset, uint32((currFields ^ val))); @@ -1737,12 +1749,12 @@ public: // Position data MapEntry const* map = sMapStore.LookupEntry(mapId); - AreaTableEntry const* area = GetAreaEntryByAreaID(areaId); + AreaTableEntry const* area = sAreaTableStore.LookupEntry(areaId); if (area) { areaName = area->area_name[locale]; - AreaTableEntry const* zone = GetAreaEntryByAreaID(area->zone); + AreaTableEntry const* zone = sAreaTableStore.LookupEntry(area->zone); if (zone) zoneName = zone->area_name[locale]; } diff --git a/src/server/scripts/Commands/cs_script_loader.cpp b/src/server/scripts/Commands/cs_script_loader.cpp new file mode 100644 index 00000000000..449e7053942 --- /dev/null +++ b/src/server/scripts/Commands/cs_script_loader.cpp @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +// This is where scripts' loading functions should be declared: +void AddSC_account_commandscript(); +void AddSC_achievement_commandscript(); +void AddSC_ahbot_commandscript(); +void AddSC_arena_commandscript(); +void AddSC_ban_commandscript(); +void AddSC_bf_commandscript(); +void AddSC_cast_commandscript(); +void AddSC_character_commandscript(); +void AddSC_cheat_commandscript(); +void AddSC_debug_commandscript(); +void AddSC_deserter_commandscript(); +void AddSC_disable_commandscript(); +void AddSC_event_commandscript(); +void AddSC_gm_commandscript(); +void AddSC_go_commandscript(); +void AddSC_gobject_commandscript(); +void AddSC_group_commandscript(); +void AddSC_guild_commandscript(); +void AddSC_honor_commandscript(); +void AddSC_instance_commandscript(); +void AddSC_learn_commandscript(); +void AddSC_lfg_commandscript(); +void AddSC_list_commandscript(); +void AddSC_lookup_commandscript(); +void AddSC_message_commandscript(); +void AddSC_misc_commandscript(); +void AddSC_mmaps_commandscript(); +void AddSC_modify_commandscript(); +void AddSC_npc_commandscript(); +void AddSC_pet_commandscript(); +void AddSC_quest_commandscript(); +void AddSC_rbac_commandscript(); +void AddSC_reload_commandscript(); +void AddSC_reset_commandscript(); +void AddSC_send_commandscript(); +void AddSC_server_commandscript(); +void AddSC_tele_commandscript(); +void AddSC_ticket_commandscript(); +void AddSC_titles_commandscript(); +void AddSC_wp_commandscript(); + +// The name of this function should match: +// void Add${NameOfDirectory}Scripts() +void AddCommandsScripts() +{ + AddSC_account_commandscript(); + AddSC_achievement_commandscript(); + AddSC_ahbot_commandscript(); + AddSC_arena_commandscript(); + AddSC_ban_commandscript(); + AddSC_bf_commandscript(); + AddSC_cast_commandscript(); + AddSC_character_commandscript(); + AddSC_cheat_commandscript(); + AddSC_debug_commandscript(); + AddSC_deserter_commandscript(); + AddSC_disable_commandscript(); + AddSC_event_commandscript(); + AddSC_gm_commandscript(); + AddSC_go_commandscript(); + AddSC_gobject_commandscript(); + AddSC_group_commandscript(); + AddSC_guild_commandscript(); + AddSC_honor_commandscript(); + AddSC_instance_commandscript(); + AddSC_learn_commandscript(); + AddSC_lookup_commandscript(); + AddSC_lfg_commandscript(); + AddSC_list_commandscript(); + AddSC_message_commandscript(); + AddSC_misc_commandscript(); + AddSC_mmaps_commandscript(); + AddSC_modify_commandscript(); + AddSC_npc_commandscript(); + AddSC_quest_commandscript(); + AddSC_pet_commandscript(); + AddSC_rbac_commandscript(); + AddSC_reload_commandscript(); + AddSC_reset_commandscript(); + AddSC_send_commandscript(); + AddSC_server_commandscript(); + AddSC_tele_commandscript(); + AddSC_ticket_commandscript(); + AddSC_titles_commandscript(); + AddSC_wp_commandscript(); +} diff --git a/src/server/scripts/Commands/cs_send.cpp b/src/server/scripts/Commands/cs_send.cpp index 672db3a3ab0..31544543426 100644 --- a/src/server/scripts/Commands/cs_send.cpp +++ b/src/server/scripts/Commands/cs_send.cpp @@ -74,7 +74,7 @@ public: std::string subject = msgSubject; std::string text = msgText; - // from console show not existed sender + // from console, use non-existing sender MailSender sender(MAIL_NORMAL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetGUID().GetCounter() : 0, MAIL_STATIONERY_GM); /// @todo Fix poor design @@ -173,7 +173,7 @@ public: } } - // from console show not existed sender + // from console show nonexisting sender MailSender sender(MAIL_NORMAL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetGUID().GetCounter() : 0, MAIL_STATIONERY_GM); // fill mail @@ -185,7 +185,7 @@ public: { if (Item* item = Item::CreateItem(itr->first, itr->second, handler->GetSession() ? handler->GetSession()->GetPlayer() : 0)) { - item->SaveToDB(trans); // save for prevent lost at next mail load, if send fail then item will deleted + item->SaveToDB(trans); // Save to prevent being lost at next mail load. If send fails, the item will be deleted. draft.AddItem(item); } } @@ -233,7 +233,7 @@ public: std::string subject = msgSubject; std::string text = msgText; - // from console show not existed sender + // from console show nonexisting sender MailSender sender(MAIL_NORMAL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetGUID().GetCounter() : 0, MAIL_STATIONERY_GM); SQLTransaction trans = CharacterDatabase.BeginTransaction(); @@ -260,7 +260,7 @@ public: if (!msgStr) return false; - ///- Check that he is not logging out. + /// - Check if player is logging out. if (player->GetSession()->isLogingOut()) { handler->SendSysMessage(LANG_PLAYER_NOT_FOUND); diff --git a/src/server/scripts/Commands/cs_titles.cpp b/src/server/scripts/Commands/cs_titles.cpp index 2f5d7b8364c..6309e7279c9 100644 --- a/src/server/scripts/Commands/cs_titles.cpp +++ b/src/server/scripts/Commands/cs_titles.cpp @@ -225,7 +225,7 @@ public: if (CharTitlesEntry const* tEntry = sCharTitlesStore.LookupEntry(i)) titles2 &= ~(uint64(1) << tEntry->bit_index); - titles &= ~titles2; // remove not existed titles + titles &= ~titles2; // remove non-existing titles target->SetUInt64Value(PLAYER__FIELD_KNOWN_TITLES, titles); handler->SendSysMessage(LANG_DONE); diff --git a/src/server/scripts/Custom/CMakeLists.txt b/src/server/scripts/Custom/CMakeLists.txt deleted file mode 100644 index 595ff801813..00000000000 --- a/src/server/scripts/Custom/CMakeLists.txt +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> -# -# This file is free software; as a special exception the author gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -# file(GLOB_RECURSE sources_Custom Custom/*.cpp Custom/*.h) - -set(scripts_STAT_SRCS - ${scripts_STAT_SRCS} -# ${sources_Custom} -) - -message(" -> Prepared: Custom") diff --git a/src/server/scripts/Custom/custom_script_loader.cpp b/src/server/scripts/Custom/custom_script_loader.cpp new file mode 100644 index 00000000000..dd4b5e99d77 --- /dev/null +++ b/src/server/scripts/Custom/custom_script_loader.cpp @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +// This is where scripts' loading functions should be declared: + + +// The name of this function should match: +// void Add${NameOfDirectory}Scripts() +void AddCustomScripts() +{ +} diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp index 9cd724e5596..79709734e18 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp @@ -508,19 +508,11 @@ public: }; // npc_lokhtos_darkbargainer -enum LokhtosItems +enum Lokhtos { + QUEST_A_BINDING_CONTRACT = 7604, + ITEM_SULFURON_INGOT = 17203, ITEM_THRORIUM_BROTHERHOOD_CONTRACT = 18628, - ITEM_SULFURON_INGOT = 17203 -}; - -enum LokhtosQuests -{ - QUEST_A_BINDING_CONTRACT = 7604 -}; - -enum LokhtosSpells -{ SPELL_CREATE_THORIUM_BROTHERHOOD_CONTRACT_DND = 23059 }; @@ -570,67 +562,12 @@ public: } }; -// npc_dughal_stormwing -enum DughalQuests -{ - QUEST_JAIL_BREAK = 4322 -}; - -#define SAY_DUGHAL_FREE "Thank you, $N! I'm free!!!" -#define GOSSIP_DUGHAL "You're free, Dughal! Get out of here!" - -// npc_marshal_windsor -#define SAY_WINDSOR_AGGRO1 "You locked up the wrong Marshal. Prepare to be destroyed!" -#define SAY_WINDSOR_AGGRO2 "I bet you're sorry now, aren't you !?!!" -#define SAY_WINDSOR_AGGRO3 "You better hold me back $N or they are going to feel some prison house beatings." -#define SAY_WINDSOR_1 "Let's get a move on. My gear should be in the storage area up this way..." -#define SAY_WINDSOR_4_1 "Check that cell, $N. If someone is alive in there, we need to get them out." -#define SAY_WINDSOR_4_2 "Get him out of there!" -#define SAY_WINDSOR_4_3 "Good work! We're almost there, $N. This way." -#define SAY_WINDSOR_6 "This is it, $N. My stuff should be in that room. Cover me, I'm going in!" -#define SAY_WINDSOR_9 "Ah, there it is!" - -enum MarshalWindsor -{ - NPC_REGINALD_WINDSOR = 9682 -}; - -// npc_marshal_reginald_windsor -#define SAY_REGINALD_WINDSOR_0_1 "Can you feel the power, $N??? It's time to ROCK!" -#define SAY_REGINALD_WINDSOR_0_2 "Now we just have to free Tobias and we can get out of here. This way!" -#define SAY_REGINALD_WINDSOR_5_1 "Open it." -#define SAY_REGINALD_WINDSOR_5_2 "I never did like those two. Let's get moving." -#define SAY_REGINALD_WINDSOR_7_1 "Open it and be careful this time!" -#define SAY_REGINALD_WINDSOR_7_2 "That intolerant dirtbag finally got what was coming to him. Good riddance!" -#define SAY_REGINALD_WINDSOR_7_3 "Alright, let's go." -#define SAY_REGINALD_WINDSOR_13_1 "Open it. We need to hurry up. I can smell those Dark Irons coming a mile away and I can tell you one thing, they're COMING!" -#define SAY_REGINALD_WINDSOR_13_2 "Administering fists of fury on Crest Killer!" -#define SAY_REGINALD_WINDSOR_13_3 "He has to be in the last cell. Unless... they killed him." -#define SAY_REGINALD_WINDSOR_14_1 "Get him out of there!" -#define SAY_REGINALD_WINDSOR_14_2 "Excellent work, $N. Let's find the exit. I think I know the way. Follow me!" -#define SAY_REGINALD_WINDSOR_20_1 "We made it!" -#define SAY_REGINALD_WINDSOR_20_2 "Meet me at Maxwell's encampment. We'll go over the next stages of the plan there and figure out a way to decode my tablets without the decryption ring." - -enum MarshalReginaldWindor -{ - NPC_SHILL_DINGER = 9678, - NPC_CREST_KILLER = 9680 -}; - // npc_rocknot -enum RocknotSays -{ - SAY_GOT_BEER = 0 -}; - -enum RocknotSpells -{ - SPELL_DRUNKEN_RAGE = 14872 -}; - -enum RocknotQuests +enum Rocknot { - QUEST_ALE = 4295 + SAY_GOT_BEER = 0, + QUEST_ALE = 4295, + SPELL_DRUNKEN_RAGE = 14872 }; class npc_rocknot : public CreatureScript diff --git a/src/server/scripts/EasternKingdoms/CMakeLists.txt b/src/server/scripts/EasternKingdoms/CMakeLists.txt deleted file mode 100644 index 8e6616347f9..00000000000 --- a/src/server/scripts/EasternKingdoms/CMakeLists.txt +++ /dev/null @@ -1,204 +0,0 @@ -# Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> -# -# This file is free software; as a special exception the author gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -set(scripts_STAT_SRCS - ${scripts_STAT_SRCS} - EasternKingdoms/zone_ghostlands.cpp - EasternKingdoms/AlteracValley/boss_galvangar.cpp - EasternKingdoms/AlteracValley/boss_balinda.cpp - EasternKingdoms/AlteracValley/boss_drekthar.cpp - EasternKingdoms/AlteracValley/boss_vanndar.cpp - EasternKingdoms/AlteracValley/alterac_valley.cpp - EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_high_interrogator_gerstahn.cpp - EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp - EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp - EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_general_angerforge.cpp - EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_ambassador_flamelash.cpp - EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp - EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_moira_bronzebeard.cpp - EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.h - EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp - EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_magmus.cpp - EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp - EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp - EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp - EasternKingdoms/BlackrockMountain/BlackwingLair/boss_broodlord_lashlayer.cpp - EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp - EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp - EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp - EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp - EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp - EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h - EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_pyroguard_emberseer.cpp - EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_drakkisath.cpp - EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_warmaster_voone.cpp - EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_mother_smolderweb.cpp - EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_quartermaster_zigris.cpp - EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_halycon.cpp - EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_overlord_wyrmthalak.cpp - EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_shadow_hunter_voshgajin.cpp - EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gyth.cpp - EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp - EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_highlord_omokk.cpp - EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_the_beast.cpp - EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gizrul_the_slavener.cpp - EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_urok_doomhowl.cpp - EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_lord_valthalak.cpp - EasternKingdoms/BlackrockMountain/BlackrockSpire/blackrock_spire.h - EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp - EasternKingdoms/BlackrockMountain/MoltenCore/boss_gehennas.cpp - EasternKingdoms/BlackrockMountain/MoltenCore/boss_lucifron.cpp - EasternKingdoms/BlackrockMountain/MoltenCore/boss_golemagg.cpp - EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp - EasternKingdoms/BlackrockMountain/MoltenCore/boss_baron_geddon.cpp - EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp - EasternKingdoms/BlackrockMountain/MoltenCore/boss_garr.cpp - EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.h - EasternKingdoms/BlackrockMountain/MoltenCore/instance_molten_core.cpp - EasternKingdoms/BlackrockMountain/MoltenCore/boss_sulfuron_harbinger.cpp - EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp - EasternKingdoms/BlackrockMountain/MoltenCore/boss_shazzrah.cpp - EasternKingdoms/Scholomance/boss_the_ravenian.cpp - EasternKingdoms/Scholomance/boss_instructor_malicia.cpp - EasternKingdoms/Scholomance/boss_death_knight_darkreaver.cpp - EasternKingdoms/Scholomance/boss_illucia_barov.cpp - EasternKingdoms/Scholomance/scholomance.h - EasternKingdoms/Scholomance/boss_vectus.cpp - EasternKingdoms/Scholomance/boss_jandice_barov.cpp - EasternKingdoms/Scholomance/boss_kormok.cpp - EasternKingdoms/Scholomance/boss_lord_alexei_barov.cpp - EasternKingdoms/Scholomance/boss_doctor_theolen_krastinov.cpp - EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp - EasternKingdoms/Scholomance/instance_scholomance.cpp - EasternKingdoms/Scholomance/boss_lorekeeper_polkelt.cpp - EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp - EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp - EasternKingdoms/zone_isle_of_queldanas.cpp - EasternKingdoms/ZulGurub/boss_hakkar.cpp - EasternKingdoms/ZulGurub/boss_mandokir.cpp - EasternKingdoms/ZulGurub/boss_marli.cpp - EasternKingdoms/ZulGurub/boss_hazzarah.cpp - EasternKingdoms/ZulGurub/boss_jeklik.cpp - EasternKingdoms/ZulGurub/boss_grilek.cpp - EasternKingdoms/ZulGurub/zulgurub.h - EasternKingdoms/ZulGurub/boss_renataki.cpp - EasternKingdoms/ZulGurub/boss_arlokk.cpp - EasternKingdoms/ZulGurub/boss_gahzranka.cpp - EasternKingdoms/ZulGurub/boss_venoxis.cpp - EasternKingdoms/ZulGurub/instance_zulgurub.cpp - EasternKingdoms/ZulGurub/boss_jindo.cpp - EasternKingdoms/ZulGurub/boss_wushoolay.cpp - EasternKingdoms/ZulGurub/boss_thekal.cpp - EasternKingdoms/zone_wetlands.cpp - EasternKingdoms/zone_arathi_highlands.cpp - EasternKingdoms/Gnomeregan/instance_gnomeregan.cpp - EasternKingdoms/Gnomeregan/gnomeregan.cpp - EasternKingdoms/Gnomeregan/gnomeregan.h - EasternKingdoms/zone_redridge_mountains.cpp - EasternKingdoms/ScarletEnclave/chapter2.cpp - EasternKingdoms/ScarletEnclave/chapter5.cpp - EasternKingdoms/ScarletEnclave/chapter1.cpp - EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp - EasternKingdoms/zone_eastern_plaguelands.cpp - EasternKingdoms/Stratholme/boss_baroness_anastari.cpp - EasternKingdoms/Stratholme/boss_nerubenkan.cpp - EasternKingdoms/Stratholme/instance_stratholme.cpp - EasternKingdoms/Stratholme/boss_dathrohan_balnazzar.cpp - EasternKingdoms/Stratholme/boss_timmy_the_cruel.cpp - EasternKingdoms/Stratholme/boss_baron_rivendare.cpp - EasternKingdoms/Stratholme/boss_magistrate_barthilas.cpp - EasternKingdoms/Stratholme/boss_order_of_silver_hand.cpp - EasternKingdoms/Stratholme/boss_ramstein_the_gorger.cpp - EasternKingdoms/Stratholme/boss_cannon_master_willey.cpp - EasternKingdoms/Stratholme/boss_maleki_the_pallid.cpp - EasternKingdoms/Stratholme/boss_postmaster_malown.cpp - EasternKingdoms/Stratholme/stratholme.h - EasternKingdoms/Stratholme/stratholme.cpp - EasternKingdoms/zone_tirisfal_glades.cpp - EasternKingdoms/SunkenTemple/sunken_temple.cpp - EasternKingdoms/SunkenTemple/sunken_temple.h - EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp - EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp - EasternKingdoms/MagistersTerrace/magisters_terrace.h - EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp - EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp - EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp - EasternKingdoms/MagistersTerrace/boss_vexallus.cpp - EasternKingdoms/MagistersTerrace/magisters_terrace.cpp - EasternKingdoms/Uldaman/uldaman.cpp - EasternKingdoms/Uldaman/boss_ironaya.cpp - EasternKingdoms/Uldaman/uldaman.h - EasternKingdoms/Uldaman/instance_uldaman.cpp - EasternKingdoms/Uldaman/boss_archaedas.cpp - EasternKingdoms/zone_swamp_of_sorrows.cpp - EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp - EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp - EasternKingdoms/SunwellPlateau/sunwell_plateau.h - EasternKingdoms/SunwellPlateau/boss_muru.cpp - EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp - EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp - EasternKingdoms/SunwellPlateau/boss_brutallus.cpp - EasternKingdoms/SunwellPlateau/sunwell_plateau.cpp - EasternKingdoms/SunwellPlateau/boss_felmyst.cpp - EasternKingdoms/zone_stranglethorn_vale.cpp - EasternKingdoms/Deadmines/deadmines.h - EasternKingdoms/Deadmines/deadmines.cpp - EasternKingdoms/Deadmines/boss_mr_smite.cpp - EasternKingdoms/Deadmines/instance_deadmines.cpp - EasternKingdoms/zone_duskwood.cpp - EasternKingdoms/ScarletMonastery/boss_azshir_the_sleepless.cpp - EasternKingdoms/ScarletMonastery/boss_mograine_and_whitemane.cpp - EasternKingdoms/ScarletMonastery/boss_bloodmage_thalnos.cpp - EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp - EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp - EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp - EasternKingdoms/ScarletMonastery/boss_houndmaster_loksey.cpp - EasternKingdoms/ScarletMonastery/scarlet_monastery.h - EasternKingdoms/ScarletMonastery/boss_high_inquisitor_fairbanks.cpp - EasternKingdoms/ScarletMonastery/boss_arcanist_doan.cpp - EasternKingdoms/ScarletMonastery/boss_herod.cpp - EasternKingdoms/ScarletMonastery/boss_scorn.cpp - EasternKingdoms/zone_undercity.cpp - EasternKingdoms/zone_loch_modan.cpp - EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp - EasternKingdoms/ShadowfangKeep/instance_shadowfang_keep.cpp - EasternKingdoms/ShadowfangKeep/shadowfang_keep.h - EasternKingdoms/zone_burning_steppes.cpp - EasternKingdoms/zone_blasted_lands.cpp - EasternKingdoms/zone_stormwind_city.cpp - EasternKingdoms/ZulAman/boss_halazzi.cpp - EasternKingdoms/ZulAman/boss_hexlord.cpp - EasternKingdoms/ZulAman/boss_zuljin.cpp - EasternKingdoms/ZulAman/boss_akilzon.cpp - EasternKingdoms/ZulAman/instance_zulaman.cpp - EasternKingdoms/ZulAman/boss_janalai.cpp - EasternKingdoms/ZulAman/boss_nalorakk.cpp - EasternKingdoms/ZulAman/zulaman.cpp - EasternKingdoms/ZulAman/zulaman.h - EasternKingdoms/zone_hinterlands.cpp - EasternKingdoms/zone_western_plaguelands.cpp - EasternKingdoms/zone_silverpine_forest.cpp - EasternKingdoms/Karazhan/instance_karazhan.cpp - EasternKingdoms/Karazhan/boss_nightbane.cpp - EasternKingdoms/Karazhan/karazhan.cpp - EasternKingdoms/Karazhan/boss_curator.cpp - EasternKingdoms/Karazhan/boss_shade_of_aran.cpp - EasternKingdoms/Karazhan/boss_netherspite.cpp - EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp - EasternKingdoms/Karazhan/boss_midnight.cpp - EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp - EasternKingdoms/Karazhan/bosses_opera.cpp - EasternKingdoms/Karazhan/boss_moroes.cpp - EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp - EasternKingdoms/Karazhan/karazhan.h - EasternKingdoms/TheStockade/instance_the_stockade.cpp -) - -message(" -> Prepared: Eastern Kingdoms") diff --git a/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp b/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp index 541ddc0e1c8..8f246ab9bf0 100644 --- a/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp +++ b/src/server/scripts/EasternKingdoms/Deadmines/boss_mr_smite.cpp @@ -25,17 +25,25 @@ EndScriptData */ #include "ScriptedCreature.h" #include "deadmines.h" -enum Spels +enum Spells { SPELL_TRASH = 3391, SPELL_SMITE_STOMP = 6432, SPELL_SMITE_SLAM = 6435, - SPELL_NIMBLE_REFLEXES = 6264, + SPELL_NIMBLE_REFLEXES = 6264 +}; +enum Equips +{ EQUIP_SWORD = 5191, - EQUIP_MACE = 7230, + EQUIP_AXE = 5196, + EQUIP_MACE = 7230 +}; - SAY_AGGRO = 0, +enum Texts +{ + SAY_PHASE_1 = 2, + SAY_PHASE_2 = 3 }; class boss_mr_smite : public CreatureScript @@ -66,6 +74,8 @@ public: uiPhase = 0; uiTimer = 0; + + uiIsMoving = false; } InstanceScript* instance; @@ -79,16 +89,19 @@ public: uint32 uiPhase; uint32 uiTimer; + bool uiIsMoving; + void Reset() override { Initialize(); SetEquipmentSlots(false, EQUIP_SWORD, EQUIP_UNEQUIP, EQUIP_NO_CHANGE); + me->SetStandState(UNIT_STAND_STATE_STAND); + me->SetReactState(REACT_AGGRESSIVE); } void EnterCombat(Unit* /*who*/) override { - Talk(SAY_AGGRO); } bool bCheckChances() @@ -105,38 +118,52 @@ public: if (!UpdateVictim()) return; - /*START ACID-AI*/ - if (uiTrashTimer <= uiDiff) + if (!uiIsMoving) // halt abilities in between phases { - if (bCheckChances()) - DoCast(me, SPELL_TRASH); - uiTrashTimer = urand(6000, 15500); - } else uiTrashTimer -= uiDiff; + if (uiTrashTimer <= uiDiff) + { + if (bCheckChances()) + DoCast(me, SPELL_TRASH); + uiTrashTimer = urand(6000, 15500); + } + else uiTrashTimer -= uiDiff; - if (uiSlamTimer <= uiDiff) - { - if (bCheckChances()) - DoCastVictim(SPELL_SMITE_SLAM); - uiSlamTimer = 11000; - } else uiSlamTimer -= uiDiff; + if (uiSlamTimer <= uiDiff) + { + if (bCheckChances()) + DoCastVictim(SPELL_SMITE_SLAM); + uiSlamTimer = 11000; + } + else uiSlamTimer -= uiDiff; - if (uiNimbleReflexesTimer <= uiDiff) - { - if (bCheckChances()) - DoCast(me, SPELL_NIMBLE_REFLEXES); - uiNimbleReflexesTimer = urand(27300, 60100); - } else uiNimbleReflexesTimer -= uiDiff; - /*END ACID-AI*/ + if (uiNimbleReflexesTimer <= uiDiff) + { + if (bCheckChances()) + DoCast(me, SPELL_NIMBLE_REFLEXES); + uiNimbleReflexesTimer = urand(27300, 60100); + } + else uiNimbleReflexesTimer -= uiDiff; + } if ((uiHealth == 0 && !HealthAbovePct(66)) || (uiHealth == 1 && !HealthAbovePct(33))) { ++uiHealth; DoCastAOE(SPELL_SMITE_STOMP, false); SetCombatMovement(false); - if (GameObject* go = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_SMITE_CHEST))) + me->AttackStop(); + me->InterruptNonMeleeSpells(false); + me->SetReactState(REACT_PASSIVE); + uiTimer = 2500; + uiPhase = 1; + + switch (uiHealth) { - me->GetMotionMaster()->Clear(); - me->GetMotionMaster()->MovePoint(1, go->GetPositionX() - 3.0f, go->GetPositionY(), go->GetPositionZ()); + case 1: + Talk(SAY_PHASE_1); + break; + case 2: + Talk(SAY_PHASE_2); + break; } } @@ -147,21 +174,36 @@ public: switch (uiPhase) { case 1: - me->HandleEmoteCommand(EMOTE_STATE_KNEEL); //dosen't work? - uiTimer = 1000; - uiPhase = 2; + { + if (uiIsMoving) + break; + + if (GameObject* go = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_SMITE_CHEST))) + { + me->GetMotionMaster()->Clear(); + me->GetMotionMaster()->MovePoint(1, go->GetPositionX() - 1.5f, go->GetPositionY() + 1.4f, go->GetPositionZ()); + uiIsMoving = true; + } break; + } case 2: if (uiHealth == 1) - SetEquipmentSlots(false, EQUIP_SWORD, EQUIP_SWORD, EQUIP_NO_CHANGE); + SetEquipmentSlots(false, EQUIP_AXE, EQUIP_AXE, EQUIP_NO_CHANGE); else SetEquipmentSlots(false, EQUIP_MACE, EQUIP_UNEQUIP, EQUIP_NO_CHANGE); uiTimer = 500; uiPhase = 3; break; case 3: + me->SetStandState(UNIT_STAND_STATE_STAND); + uiTimer = 750; + uiPhase = 4; + break; + case 4: + me->SetReactState(REACT_AGGRESSIVE); SetCombatMovement(true); me->GetMotionMaster()->MoveChase(me->GetVictim(), me->m_CombatDistance); + uiIsMoving = false; uiPhase = 0; break; } @@ -176,8 +218,11 @@ public: if (uiType != POINT_MOTION_TYPE) return; - uiTimer = 1500; - uiPhase = 1; + me->SetFacingTo(5.47f); + me->SetStandState(UNIT_STAND_STATE_KNEEL); + + uiTimer = 2000; + uiPhase = 2; } }; }; diff --git a/src/server/scripts/EasternKingdoms/Deadmines/deadmines.h b/src/server/scripts/EasternKingdoms/Deadmines/deadmines.h index dff4243617e..01ebabb160e 100644 --- a/src/server/scripts/EasternKingdoms/Deadmines/deadmines.h +++ b/src/server/scripts/EasternKingdoms/Deadmines/deadmines.h @@ -26,6 +26,7 @@ enum CannonState CANNON_GUNPOWDER_USED, CANNON_BLAST_INITIATED, PIRATES_ATTACK, + SMITE_ALARMED, EVENT_DONE }; @@ -48,4 +49,16 @@ enum GameObjects GO_DOOR_LEVER = 101833, GO_MR_SMITE_CHEST = 144111 }; + +enum CreaturesIds +{ + NPC_MR_SMITE = 646 +}; + +enum InstanceTexts +{ + SAY_ALARM1 = 0, + SAY_ALARM2 = 1 +}; + #endif diff --git a/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp b/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp index 6714b243765..b827fdf7e8b 100644 --- a/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp +++ b/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp @@ -32,18 +32,14 @@ EndScriptData */ enum Sounds { SOUND_CANNONFIRE = 1400, - SOUND_DESTROYDOOR = 3079, - SOUND_MR_SMITE_ALARM1 = 5775, - SOUND_MR_SMITE_ALARM2 = 5777 + SOUND_DESTROYDOOR = 3079 }; -#define SAY_MR_SMITE_ALARM1 "You there, check out that noise!" -#define SAY_MR_SMITE_ALARM2 "We're under attack! A vast, ye swabs! Repel the invaders!" - enum Misc { DATA_CANNON_BLAST_TIMER = 3000, - DATA_PIRATES_DELAY_TIMER = 1000 + DATA_PIRATES_DELAY_TIMER = 1000, + DATA_SMITE_ALARM_DELAY_TIMER = 5000 }; class instance_deadmines : public InstanceMapScript @@ -72,10 +68,12 @@ class instance_deadmines : public InstanceMapScript ObjectGuid DefiasPirate1GUID; ObjectGuid DefiasPirate2GUID; ObjectGuid DefiasCompanionGUID; + ObjectGuid MrSmiteGUID; uint32 State; uint32 CannonBlast_Timer; uint32 PiratesDelay_Timer; + uint32 SmiteAlarmDelay_Timer; ObjectGuid uiSmiteChestGUID; virtual void Update(uint32 diff) override @@ -91,22 +89,20 @@ class instance_deadmines : public InstanceMapScript { case CANNON_GUNPOWDER_USED: CannonBlast_Timer = DATA_CANNON_BLAST_TIMER; - // it's a hack - Mr. Smite should do that but his too far away - //pIronCladDoor->SetName("Mr. Smite"); - //pIronCladDoor->MonsterYell(SAY_MR_SMITE_ALARM1, LANG_UNIVERSAL, NULL); - pIronCladDoor->PlayDirectSound(SOUND_MR_SMITE_ALARM1); State = CANNON_BLAST_INITIATED; break; case CANNON_BLAST_INITIATED: PiratesDelay_Timer = DATA_PIRATES_DELAY_TIMER; + SmiteAlarmDelay_Timer = DATA_SMITE_ALARM_DELAY_TIMER; if (CannonBlast_Timer <= diff) { SummonCreatures(); ShootCannon(); BlastOutDoor(); LeverStucked(); - //pIronCladDoor->MonsterYell(SAY_MR_SMITE_ALARM2, LANG_UNIVERSAL, NULL); - pIronCladDoor->PlayDirectSound(SOUND_MR_SMITE_ALARM2); + instance->LoadGrid(-22.8f, -797.24f); // Loads Mr. Smite's grid. + if (Creature* smite = instance->GetCreature(MrSmiteGUID)) // goes off when door blows up + smite->AI()->Talk(SAY_ALARM1); State = PIRATES_ATTACK; } else CannonBlast_Timer -= diff; break; @@ -114,9 +110,17 @@ class instance_deadmines : public InstanceMapScript if (PiratesDelay_Timer <= diff) { MoveCreaturesInside(); - State = EVENT_DONE; + State = SMITE_ALARMED; } else PiratesDelay_Timer -= diff; break; + case SMITE_ALARMED: + if (SmiteAlarmDelay_Timer <= diff) + { + if (Creature* smite = instance->GetCreature(MrSmiteGUID)) + smite->AI()->Talk(SAY_ALARM2); + State = EVENT_DONE; + } else SmiteAlarmDelay_Timer -= diff; + break; } } @@ -180,6 +184,18 @@ class instance_deadmines : public InstanceMapScript pDoorLever->SetUInt32Value(GAMEOBJECT_FLAGS, 4); } + void OnCreatureCreate(Creature* creature) override + { + switch (creature->GetEntry()) + { + case NPC_MR_SMITE: + MrSmiteGUID = creature->GetGUID(); + break; + default: + break; + } + } + void OnGameObjectCreate(GameObject* go) override { switch (go->GetEntry()) diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp index 9f4a31fdbbc..b694c074879 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp @@ -50,19 +50,9 @@ class boss_maiden_of_virtue : public CreatureScript public: boss_maiden_of_virtue() : CreatureScript("boss_maiden_of_virtue") { } - CreatureAI* GetAI(Creature* creature) const override - { - return new boss_maiden_of_virtueAI(creature); - } - struct boss_maiden_of_virtueAI : public BossAI { - boss_maiden_of_virtueAI(Creature* creature) : BossAI(creature, TYPE_MAIDEN) { } - - void Reset() override - { - _Reset(); - } + boss_maiden_of_virtueAI(Creature* creature) : BossAI(creature, DATA_MAIDEN_OF_VIRTUE) { } void KilledUnit(Unit* /*Victim*/) override { @@ -132,6 +122,11 @@ public: DoMeleeAttackIfReady(); } }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new boss_maiden_of_virtueAI(creature); + } }; void AddSC_boss_maiden_of_virtue() diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp index ced8dd8f37e..d4de862244c 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp @@ -26,6 +26,7 @@ EndScriptData */ #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "SpellInfo.h" +#include "karazhan.h" enum Midnight { @@ -109,6 +110,9 @@ public: Talk(SAY_DEATH); if (Unit* midnight = ObjectAccessor::GetUnit(*me, Midnight)) midnight->KillSelf(); + + if (InstanceScript* instance = me->GetInstanceScript()) + instance->SetBossState(DATA_ATTUMEN, DONE); } void UpdateAI(uint32 diff) override; @@ -157,7 +161,11 @@ public: me->SetVisible(true); } - void EnterCombat(Unit* /*who*/) override { } + void EnterCombat(Unit* /*who*/) override + { + if (InstanceScript* instance = me->GetInstanceScript()) + instance->SetBossState(DATA_ATTUMEN, IN_PROGRESS); + } void KilledUnit(Unit* /*victim*/) override { diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp index 79e36442f4b..e667141fa29 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp @@ -143,12 +143,12 @@ public: if (me->IsAlive()) SpawnAdds(); - instance->SetData(TYPE_MOROES, NOT_STARTED); + instance->SetBossState(DATA_MOROES, NOT_STARTED); } void StartEvent() { - instance->SetData(TYPE_MOROES, IN_PROGRESS); + instance->SetBossState(DATA_MOROES, IN_PROGRESS); DoZoneInCombat(); } @@ -171,7 +171,7 @@ public: { Talk(SAY_DEATH); - instance->SetData(TYPE_MOROES, DONE); + instance->SetBossState(DATA_MOROES, DONE); DeSpawnAdds(); @@ -257,12 +257,6 @@ public: if (!UpdateVictim()) return; - if (!instance->GetData(TYPE_MOROES)) - { - EnterEvadeMode(); - return; - } - if (!Enrage && HealthBelowPct(30)) { DoCast(me, SPELL_FRENZY); @@ -347,7 +341,7 @@ struct boss_moroes_guestAI : public ScriptedAI void Reset() override { - instance->SetData(TYPE_MOROES, NOT_STARTED); + instance->SetBossState(DATA_MOROES, NOT_STARTED); } void AcquireGUID() @@ -373,7 +367,7 @@ struct boss_moroes_guestAI : public ScriptedAI void UpdateAI(uint32 /*diff*/) override { - if (!instance->GetData(TYPE_MOROES)) + if (instance->GetBossState(DATA_MOROES) != IN_PROGRESS) EnterEvadeMode(); DoMeleeAttackIfReady(); diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp index 6f5f2b8f65f..7d7c60ac419 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp @@ -143,10 +143,10 @@ public: me->SetWalk(false); me->setActive(true); - if (instance->GetData(TYPE_NIGHTBANE) == DONE || instance->GetData(TYPE_NIGHTBANE) == IN_PROGRESS) + if (instance->GetBossState(DATA_NIGHTBANE) == DONE || instance->GetBossState(DATA_NIGHTBANE) == IN_PROGRESS) me->DisappearAndDie(); else - instance->SetData(TYPE_NIGHTBANE, NOT_STARTED); + instance->SetBossState(DATA_NIGHTBANE, NOT_STARTED); HandleTerraceDoors(true); @@ -165,10 +165,10 @@ public: void EnterCombat(Unit* /*who*/) override { - instance->SetData(TYPE_NIGHTBANE, IN_PROGRESS); + instance->SetBossState(DATA_NIGHTBANE, IN_PROGRESS); HandleTerraceDoors(false); - Talk(YELL_AGGRO); + Talk(YELL_AGGRO); } void AttackStart(Unit* who) override @@ -179,7 +179,7 @@ public: void JustDied(Unit* /*killer*/) override { - instance->SetData(TYPE_NIGHTBANE, DONE); + instance->SetBossState(DATA_NIGHTBANE, DONE); HandleTerraceDoors(true); } diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp index 450678a0f86..17a23a0b2e7 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp @@ -154,7 +154,7 @@ public: Initialize(); // Not in progress - instance->SetData(TYPE_ARAN, NOT_STARTED); + instance->SetBossState(DATA_ARAN, NOT_STARTED); instance->HandleGameObject(instance->GetGuidData(DATA_GO_LIBRARY_DOOR), true); } @@ -167,7 +167,7 @@ public: { Talk(SAY_DEATH); - instance->SetData(TYPE_ARAN, DONE); + instance->SetBossState(DATA_ARAN, DONE); instance->HandleGameObject(instance->GetGuidData(DATA_GO_LIBRARY_DOOR), true); } @@ -175,7 +175,7 @@ public: { Talk(SAY_AGGRO); - instance->SetData(TYPE_ARAN, IN_PROGRESS); + instance->SetBossState(DATA_ARAN, IN_PROGRESS); instance->HandleGameObject(instance->GetGuidData(DATA_GO_LIBRARY_DOOR), false); } diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp index 7bc835dcced..2e33f0933e3 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp @@ -61,7 +61,6 @@ enum Creatures NPC_DEMONCHAINS = 17248, NPC_FIENDISHIMP = 17267, NPC_PORTAL = 17265, - NPC_KILREK = 17229 }; @@ -316,7 +315,7 @@ public: Initialize(); - instance->SetData(TYPE_TERESTIAN, NOT_STARTED); + instance->SetBossState(DATA_TERESTIAN, NOT_STARTED); me->RemoveAurasDueToSpell(SPELL_BROKEN_PACT); @@ -371,7 +370,7 @@ public: Talk(SAY_DEATH); - instance->SetData(TYPE_TERESTIAN, DONE); + instance->SetBossState(DATA_TERESTIAN, DONE); } void UpdateAI(uint32 diff) override diff --git a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp index d4d0e6fa70d..0f6913b7ebc 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp @@ -708,13 +708,7 @@ public: void JustDied(Unit* /*killer*/) override { Talk(SAY_CRONE_DEATH); - - instance->SetData(TYPE_OPERA, DONE); - instance->HandleGameObject(instance->GetGuidData(DATA_GO_STAGEDOORLEFT), true); - instance->HandleGameObject(instance->GetGuidData(DATA_GO_STAGEDOORRIGHT), true); - - if (GameObject* pSideEntrance = instance->instance->GetGameObject(instance->GetGuidData(DATA_GO_SIDE_ENTRANCE_DOOR))) - pSideEntrance->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); + instance->SetBossState(DATA_OPERA_PERFORMANCE, DONE); } void UpdateAI(uint32 diff) override @@ -908,13 +902,7 @@ public: void JustDied(Unit* /*killer*/) override { DoPlaySoundToSet(me, SOUND_WOLF_DEATH); - - instance->SetData(TYPE_OPERA, DONE); - instance->HandleGameObject(instance->GetGuidData(DATA_GO_STAGEDOORLEFT), true); - instance->HandleGameObject(instance->GetGuidData(DATA_GO_STAGEDOORRIGHT), true); - - if (GameObject* pSideEntrance = instance->instance->GetGameObject(instance->GetGuidData(DATA_GO_SIDE_ENTRANCE_DOOR))) - pSideEntrance->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); + instance->SetBossState(DATA_OPERA_PERFORMANCE, DONE); } void UpdateAI(uint32 diff) override @@ -1158,12 +1146,7 @@ public: void JustDied(Unit* /*killer*/) override { Talk(SAY_JULIANNE_DEATH02); - - instance->SetData(TYPE_OPERA, DONE); - instance->HandleGameObject(instance->GetGuidData(DATA_GO_STAGEDOORLEFT), true); - instance->HandleGameObject(instance->GetGuidData(DATA_GO_STAGEDOORRIGHT), true); - if (GameObject* pSideEntrance = instance->instance->GetGameObject(instance->GetGuidData(DATA_GO_SIDE_ENTRANCE_DOOR))) - pSideEntrance->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); + instance->SetBossState(DATA_OPERA_PERFORMANCE, DONE); } void KilledUnit(Unit* /*victim*/) override @@ -1316,13 +1299,7 @@ public: void JustDied(Unit* /*killer*/) override { Talk(SAY_ROMULO_DEATH); - - instance->SetData(TYPE_OPERA, DONE); - instance->HandleGameObject(instance->GetGuidData(DATA_GO_STAGEDOORLEFT), true); - instance->HandleGameObject(instance->GetGuidData(DATA_GO_STAGEDOORRIGHT), true); - - if (GameObject* pSideEntrance = instance->instance->GetGameObject(instance->GetGuidData(DATA_GO_SIDE_ENTRANCE_DOOR))) - pSideEntrance->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); + instance->SetBossState(DATA_OPERA_PERFORMANCE, DONE); } void KilledUnit(Unit* /*victim*/) override diff --git a/src/server/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp b/src/server/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp index b23b9e645d0..ad403e6aeed 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp @@ -27,8 +27,6 @@ EndScriptData */ #include "InstanceScript.h" #include "karazhan.h" -#define MAX_ENCOUNTER 12 - /* 0 - Attumen + Midnight (optional) 1 - Moroes @@ -44,6 +42,13 @@ EndScriptData */ 11 - Nightbane */ +const Position OptionalSpawn[] = +{ + { -10960.981445f, -1940.138428f, 46.178097f, 4.12f }, // Hyakiss the Lurker + { -10945.769531f, -2040.153320f, 49.474438f, 0.077f }, // Shadikith the Glider + { -10899.903320f, -2085.573730f, 49.474449f, 1.38f } // Rokad the Ravager +}; + class instance_karazhan : public InstanceMapScript { public: @@ -59,150 +64,169 @@ public: instance_karazhan_InstanceMapScript(Map* map) : InstanceScript(map) { SetHeaders(DataHeader); - memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); + SetBossNumber(EncounterCount); // 1 - OZ, 2 - HOOD, 3 - RAJ, this never gets altered. - m_uiOperaEvent = urand(1, 3); - m_uiOzDeathCount = 0; + OperaEvent = urand(EVENT_OZ, EVENT_RAJ); + OzDeathCount = 0; + OptionalBossCount = 0; } - uint32 m_auiEncounter[MAX_ENCOUNTER]; - std::string strSaveData; - - uint32 m_uiOperaEvent; - uint32 m_uiOzDeathCount; - - ObjectGuid m_uiCurtainGUID; - ObjectGuid m_uiStageDoorLeftGUID; - ObjectGuid m_uiStageDoorRightGUID; - ObjectGuid m_uiKilrekGUID; - ObjectGuid m_uiTerestianGUID; - ObjectGuid m_uiMoroesGUID; - ObjectGuid m_uiLibraryDoor; // Door at Shade of Aran - ObjectGuid m_uiMassiveDoor; // Door at Netherspite - ObjectGuid m_uiSideEntranceDoor; // Side Entrance - ObjectGuid m_uiGamesmansDoor; // Door before Chess - ObjectGuid m_uiGamesmansExitDoor; // Door after Chess - ObjectGuid m_uiNetherspaceDoor; // Door at Malchezaar - ObjectGuid MastersTerraceDoor[2]; - ObjectGuid ImageGUID; - ObjectGuid DustCoveredChest; - - bool IsEncounterInProgress() const override + void OnCreatureCreate(Creature* creature) override { - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) - return true; - - return false; + switch (creature->GetEntry()) + { + case NPC_KILREK: + KilrekGUID = creature->GetGUID(); + break; + case NPC_TERESTIAN_ILLHOOF: + TerestianGUID = creature->GetGUID(); + break; + case NPC_MOROES: + MoroesGUID = creature->GetGUID(); + break; + } } - void OnCreatureCreate(Creature* creature) override + void OnUnitDeath(Unit* unit) override { + Creature* creature = unit->ToCreature(); + if (!creature) + return; + switch (creature->GetEntry()) { - case 17229: m_uiKilrekGUID = creature->GetGUID(); break; - case 15688: m_uiTerestianGUID = creature->GetGUID(); break; - case 15687: m_uiMoroesGUID = creature->GetGUID(); break; + case NPC_COLDMIST_WIDOW: + case NPC_COLDMIST_STALKER: + case NPC_SHADOWBAT: + case NPC_VAMPIRIC_SHADOWBAT: + case NPC_GREATER_SHADOWBAT: + case NPC_PHASE_HOUND: + case NPC_DREADBEAST: + case NPC_SHADOWBEAST: + if (GetBossState(DATA_OPTIONAL_BOSS) == TO_BE_DECIDED) + { + ++OptionalBossCount; + if (OptionalBossCount == OPTIONAL_BOSS_REQUIRED_DEATH_COUNT) + { + switch (urand(NPC_HYAKISS_THE_LURKER, NPC_ROKAD_THE_RAVAGER)) + { + case NPC_HYAKISS_THE_LURKER: + instance->SummonCreature(NPC_HYAKISS_THE_LURKER, OptionalSpawn[0]); + break; + case NPC_SHADIKITH_THE_GLIDER: + instance->SummonCreature(NPC_SHADIKITH_THE_GLIDER, OptionalSpawn[1]); + break; + case NPC_ROKAD_THE_RAVAGER: + instance->SummonCreature(NPC_ROKAD_THE_RAVAGER, OptionalSpawn[2]); + break; + } + } + } + break; + default: + break; } } - void SetData(uint32 type, uint32 uiData) override + void SetData(uint32 type, uint32 data) override { switch (type) { - case TYPE_ATTUMEN: m_auiEncounter[0] = uiData; break; - case TYPE_MOROES: - if (m_auiEncounter[1] == DONE) - break; - m_auiEncounter[1] = uiData; + case DATA_OPERA_OZ_DEATHCOUNT: + if (data == SPECIAL) + ++OzDeathCount; + else if (data == IN_PROGRESS) + OzDeathCount = 0; break; - case TYPE_MAIDEN: m_auiEncounter[2] = uiData; break; - case TYPE_OPTIONAL_BOSS: m_auiEncounter[3] = uiData; break; - case TYPE_OPERA: - m_auiEncounter[4] = uiData; - if (uiData == DONE) + } + } + + bool SetBossState(uint32 type, EncounterState state) override + { + if (!InstanceScript::SetBossState(type, state)) + return false; + + switch (type) + { + case DATA_OPERA_PERFORMANCE: + if (state == DONE) + { + HandleGameObject(StageDoorLeftGUID, true); + HandleGameObject(StageDoorRightGUID, true); + if (GameObject* sideEntrance = instance->GetGameObject(SideEntranceDoor)) + sideEntrance->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, 16812, NULL); + } break; - case TYPE_CURATOR: m_auiEncounter[5] = uiData; break; - case TYPE_ARAN: m_auiEncounter[6] = uiData; break; - case TYPE_TERESTIAN: m_auiEncounter[7] = uiData; break; - case TYPE_NETHERSPITE: m_auiEncounter[8] = uiData; break; - case TYPE_CHESS: - if (uiData == DONE) + case DATA_CHESS: + if (state == DONE) DoRespawnGameObject(DustCoveredChest, DAY); - m_auiEncounter[9] = uiData; break; - case TYPE_MALCHEZZAR: m_auiEncounter[10] = uiData; break; - case TYPE_NIGHTBANE: - if (m_auiEncounter[11] != DONE) - m_auiEncounter[11] = uiData; - break; - case DATA_OPERA_OZ_DEATHCOUNT: - if (uiData == SPECIAL) - ++m_uiOzDeathCount; - else if (uiData == IN_PROGRESS) - m_uiOzDeathCount = 0; + default: break; } - if (uiData == DONE) - { - OUT_SAVE_INST_DATA; - - std::ostringstream saveStream; - saveStream << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' ' << m_auiEncounter[2] << ' ' - << m_auiEncounter[3] << ' ' << m_auiEncounter[4] << ' ' << m_auiEncounter[5] << ' ' << m_auiEncounter[6] << ' ' - << m_auiEncounter[7] << ' ' << m_auiEncounter[8] << ' ' << m_auiEncounter[9] << ' ' << m_auiEncounter[10] << ' ' << m_auiEncounter[11]; - - strSaveData = saveStream.str(); - - SaveToDB(); - OUT_SAVE_INST_DATA_COMPLETE; - } + return true; } - void SetGuidData(uint32 identifier, ObjectGuid data) override + void SetGuidData(uint32 type, ObjectGuid data) override { - switch (identifier) - { - case DATA_IMAGE_OF_MEDIVH: ImageGUID = data; - } + if (type == DATA_IMAGE_OF_MEDIVH) + ImageGUID = data; } void OnGameObjectCreate(GameObject* go) override { switch (go->GetEntry()) { - case 183932: m_uiCurtainGUID = go->GetGUID(); break; - case 184278: - m_uiStageDoorLeftGUID = go->GetGUID(); - if (m_auiEncounter[4] == DONE) + case GO_STAGE_CURTAIN: + CurtainGUID = go->GetGUID(); + break; + case GO_STAGE_DOOR_LEFT: + StageDoorLeftGUID = go->GetGUID(); + if (GetBossState(DATA_OPERA_PERFORMANCE) == DONE) go->SetGoState(GO_STATE_ACTIVE); break; - case 184279: - m_uiStageDoorRightGUID = go->GetGUID(); - if (m_auiEncounter[4] == DONE) + case GO_STAGE_DOOR_RIGHT: + StageDoorRightGUID = go->GetGUID(); + if (GetBossState(DATA_OPERA_PERFORMANCE) == DONE) go->SetGoState(GO_STATE_ACTIVE); break; - case 184517: m_uiLibraryDoor = go->GetGUID(); break; - case 185521: m_uiMassiveDoor = go->GetGUID(); break; - case 184276: m_uiGamesmansDoor = go->GetGUID(); break; - case 184277: m_uiGamesmansExitDoor = go->GetGUID(); break; - case 185134: m_uiNetherspaceDoor = go->GetGUID(); break; - case 184274: MastersTerraceDoor[0] = go->GetGUID(); break; - case 184280: MastersTerraceDoor[1] = go->GetGUID(); break; - case 184275: - m_uiSideEntranceDoor = go->GetGUID(); - if (m_auiEncounter[4] == DONE) + case GO_PRIVATE_LIBRARY_DOOR: + LibraryDoor = go->GetGUID(); + break; + case GO_MASSIVE_DOOR: + MassiveDoor = go->GetGUID(); + break; + case GO_GAMESMAN_HALL_DOOR: + GamesmansDoor = go->GetGUID(); + break; + case GO_GAMESMAN_HALL_EXIT_DOOR: + GamesmansExitDoor = go->GetGUID(); + break; + case GO_NETHERSPACE_DOOR: + NetherspaceDoor = go->GetGUID(); + break; + case GO_MASTERS_TERRACE_DOOR: + MastersTerraceDoor[0] = go->GetGUID(); + break; + case GO_MASTERS_TERRACE_DOOR2: + MastersTerraceDoor[1] = go->GetGUID(); + break; + case GO_SIDE_ENTRANCE_DOOR: + SideEntranceDoor = go->GetGUID(); + if (GetBossState(DATA_OPERA_PERFORMANCE) == DONE) go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); else go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); break; - case 185119: DustCoveredChest = go->GetGUID(); break; + case GO_DUST_COVERED_CHEST: + DustCoveredChest = go->GetGUID(); + break; } - switch (m_uiOperaEvent) + switch (OperaEvent) { /// @todo Set Object visibilities for Opera based on performance case EVENT_OZ: @@ -216,77 +240,77 @@ public: } } - std::string GetSaveData() override + uint32 GetData(uint32 type) const override { - return strSaveData; - } - - uint32 GetData(uint32 uiData) const override - { - switch (uiData) + switch (type) { - case TYPE_ATTUMEN: return m_auiEncounter[0]; - case TYPE_MOROES: return m_auiEncounter[1]; - case TYPE_MAIDEN: return m_auiEncounter[2]; - case TYPE_OPTIONAL_BOSS: return m_auiEncounter[3]; - case TYPE_OPERA: return m_auiEncounter[4]; - case TYPE_CURATOR: return m_auiEncounter[5]; - case TYPE_ARAN: return m_auiEncounter[6]; - case TYPE_TERESTIAN: return m_auiEncounter[7]; - case TYPE_NETHERSPITE: return m_auiEncounter[8]; - case TYPE_CHESS: return m_auiEncounter[9]; - case TYPE_MALCHEZZAR: return m_auiEncounter[10]; - case TYPE_NIGHTBANE: return m_auiEncounter[11]; - case DATA_OPERA_PERFORMANCE: return m_uiOperaEvent; - case DATA_OPERA_OZ_DEATHCOUNT: return m_uiOzDeathCount; + case DATA_OPERA_PERFORMANCE: + return OperaEvent; + case DATA_OPERA_OZ_DEATHCOUNT: + return OzDeathCount; } return 0; } - ObjectGuid GetGuidData(uint32 uiData) const override + ObjectGuid GetGuidData(uint32 type) const override { - switch (uiData) + switch (type) { - case DATA_KILREK: return m_uiKilrekGUID; - case DATA_TERESTIAN: return m_uiTerestianGUID; - case DATA_MOROES: return m_uiMoroesGUID; - case DATA_GO_STAGEDOORLEFT: return m_uiStageDoorLeftGUID; - case DATA_GO_STAGEDOORRIGHT: return m_uiStageDoorRightGUID; - case DATA_GO_CURTAINS: return m_uiCurtainGUID; - case DATA_GO_LIBRARY_DOOR: return m_uiLibraryDoor; - case DATA_GO_MASSIVE_DOOR: return m_uiMassiveDoor; - case DATA_GO_SIDE_ENTRANCE_DOOR: return m_uiSideEntranceDoor; - case DATA_GO_GAME_DOOR: return m_uiGamesmansDoor; - case DATA_GO_GAME_EXIT_DOOR: return m_uiGamesmansExitDoor; - case DATA_GO_NETHER_DOOR: return m_uiNetherspaceDoor; - case DATA_MASTERS_TERRACE_DOOR_1: return MastersTerraceDoor[0]; - case DATA_MASTERS_TERRACE_DOOR_2: return MastersTerraceDoor[1]; - case DATA_IMAGE_OF_MEDIVH: return ImageGUID; + case DATA_KILREK: + return KilrekGUID; + case DATA_TERESTIAN: + return TerestianGUID; + case DATA_MOROES: + return MoroesGUID; + case DATA_GO_STAGEDOORLEFT: + return StageDoorLeftGUID; + case DATA_GO_STAGEDOORRIGHT: + return StageDoorRightGUID; + case DATA_GO_CURTAINS: + return CurtainGUID; + case DATA_GO_LIBRARY_DOOR: + return LibraryDoor; + case DATA_GO_MASSIVE_DOOR: + return MassiveDoor; + case DATA_GO_SIDE_ENTRANCE_DOOR: + return SideEntranceDoor; + case DATA_GO_GAME_DOOR: + return GamesmansDoor; + case DATA_GO_GAME_EXIT_DOOR: + return GamesmansExitDoor; + case DATA_GO_NETHER_DOOR: + return NetherspaceDoor; + case DATA_MASTERS_TERRACE_DOOR_1: + return MastersTerraceDoor[0]; + case DATA_MASTERS_TERRACE_DOOR_2: + return MastersTerraceDoor[1]; + case DATA_IMAGE_OF_MEDIVH: + return ImageGUID; } return ObjectGuid::Empty; } - void Load(char const* chrIn) override - { - if (!chrIn) - { - OUT_LOAD_INST_DATA_FAIL; - return; - } - - OUT_LOAD_INST_DATA(chrIn); - std::istringstream loadStream(chrIn); - - loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2] >> m_auiEncounter[3] - >> m_auiEncounter[4] >> m_auiEncounter[5] >> m_auiEncounter[6] >> m_auiEncounter[7] - >> m_auiEncounter[8] >> m_auiEncounter[9] >> m_auiEncounter[10] >> m_auiEncounter[11]; - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) // Do not load an encounter as "In Progress" - reset it instead. - m_auiEncounter[i] = NOT_STARTED; - OUT_LOAD_INST_DATA_COMPLETE; - } + private: + uint32 OperaEvent; + uint32 OzDeathCount; + uint32 OptionalBossCount; + ObjectGuid CurtainGUID; + ObjectGuid StageDoorLeftGUID; + ObjectGuid StageDoorRightGUID; + ObjectGuid KilrekGUID; + ObjectGuid TerestianGUID; + ObjectGuid MoroesGUID; + ObjectGuid LibraryDoor; // Door at Shade of Aran + ObjectGuid MassiveDoor; // Door at Netherspite + ObjectGuid SideEntranceDoor; // Side Entrance + ObjectGuid GamesmansDoor; // Door before Chess + ObjectGuid GamesmansExitDoor; // Door after Chess + ObjectGuid NetherspaceDoor; // Door at Malchezaar + ObjectGuid MastersTerraceDoor[2]; + ObjectGuid ImageGUID; + ObjectGuid DustCoveredChest; }; }; diff --git a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp index aa2da8cc391..4aef3c8d4a3 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp @@ -168,7 +168,7 @@ public: void StartEvent() { - instance->SetData(TYPE_OPERA, IN_PROGRESS); + instance->SetBossState(DATA_OPERA_PERFORMANCE, IN_PROGRESS); //resets count for this event, in case earlier failed if (m_uiEventId == EVENT_OZ) @@ -377,7 +377,7 @@ public: if (InstanceScript* instance = creature->GetInstanceScript()) { // Check for death of Moroes and if opera event is not done already - if (instance->GetData(TYPE_MOROES) == DONE && instance->GetData(TYPE_OPERA) != DONE) + if (instance->GetBossState(DATA_MOROES) == DONE && instance->GetBossState(DATA_OPERA_PERFORMANCE) != DONE) { player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, OZ_GOSSIP1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); diff --git a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.h b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.h index db68484c4a8..05de9e43a91 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.h +++ b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.h @@ -21,27 +21,26 @@ #define DataHeader "KZ" +uint32 const EncounterCount = 12; + enum DataTypes { - TYPE_ATTUMEN = 1, - TYPE_MOROES = 2, - TYPE_MAIDEN = 3, - TYPE_OPTIONAL_BOSS = 4, - TYPE_OPERA = 5, - TYPE_CURATOR = 6, - TYPE_ARAN = 7, - TYPE_TERESTIAN = 8, - TYPE_NETHERSPITE = 9, - TYPE_CHESS = 10, - TYPE_MALCHEZZAR = 11, - TYPE_NIGHTBANE = 12, + DATA_ATTUMEN = 0, + DATA_MOROES = 1, + DATA_MAIDEN_OF_VIRTUE = 2, + DATA_OPTIONAL_BOSS = 3, + DATA_OPERA_PERFORMANCE = 4, + DATA_CURATOR = 5, + DATA_ARAN = 6, + DATA_TERESTIAN = 7, + DATA_NETHERSPITE = 8, + DATA_CHESS = 9, + DATA_MALCHEZZAR = 10, + DATA_NIGHTBANE = 11, - DATA_OPERA_PERFORMANCE = 13, DATA_OPERA_OZ_DEATHCOUNT = 14, DATA_KILREK = 15, - DATA_TERESTIAN = 16, - DATA_MOROES = 17, DATA_GO_CURTAINS = 18, DATA_GO_STAGEDOORLEFT = 19, DATA_GO_STAGEDOORRIGHT = 20, @@ -64,4 +63,45 @@ enum OperaEvents EVENT_RAJ = 3 }; +enum MiscCreatures +{ + NPC_HYAKISS_THE_LURKER = 16179, + NPC_ROKAD_THE_RAVAGER = 16181, + NPC_SHADIKITH_THE_GLIDER = 16180, + NPC_TERESTIAN_ILLHOOF = 15688, + NPC_MOROES = 15687, + + // Trash + NPC_COLDMIST_WIDOW = 16171, + NPC_COLDMIST_STALKER = 16170, + NPC_SHADOWBAT = 16173, + NPC_VAMPIRIC_SHADOWBAT = 16175, + NPC_GREATER_SHADOWBAT = 16174, + NPC_PHASE_HOUND = 16178, + NPC_DREADBEAST = 16177, + NPC_SHADOWBEAST = 16176, + NPC_KILREK = 17229 +}; + +enum GameObjectIds +{ + GO_STAGE_CURTAIN = 183932, + GO_STAGE_DOOR_LEFT = 184278, + GO_STAGE_DOOR_RIGHT = 184279, + GO_PRIVATE_LIBRARY_DOOR = 184517, + GO_MASSIVE_DOOR = 185521, + GO_GAMESMAN_HALL_DOOR = 184276, + GO_GAMESMAN_HALL_EXIT_DOOR = 184277, + GO_NETHERSPACE_DOOR = 185134, + GO_MASTERS_TERRACE_DOOR = 184274, + GO_MASTERS_TERRACE_DOOR2 = 184280, + GO_SIDE_ENTRANCE_DOOR = 184275, + GO_DUST_COVERED_CHEST = 185119 +}; + +enum Misc +{ + OPTIONAL_BOSS_REQUIRED_DEATH_COUNT = 50 +}; + #endif diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp index b48f0edec25..6386bb50e1a 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp @@ -16,8 +16,10 @@ */ #include "ScriptMgr.h" +#include "ScriptedCreature.h" #include "InstanceScript.h" #include "magisters_terrace.h" +#include "EventMap.h" /* 0 - Selin Fireheart @@ -36,6 +38,8 @@ DoorData const doorData[] = { 0, 0, DOOR_TYPE_ROOM } // END }; +Position const KalecgosSpawnPos = { 164.3747f, -397.1197f, 2.151798f, 1.66219f }; + class instance_magisters_terrace : public InstanceMapScript { public: @@ -93,6 +97,10 @@ class instance_magisters_terrace : public InstanceMapScript case NPC_DELRISSA: DelrissaGUID = creature->GetGUID(); break; + case NPC_KALECGOS: + case NPC_HUMAN_KALECGOS: + KalecgosGUID = creature->GetGUID(); + break; default: break; } @@ -139,6 +147,25 @@ class instance_magisters_terrace : public InstanceMapScript } } + void ProcessEvent(WorldObject* obj, uint32 eventId) override + { + if (eventId == EVENT_SPAWN_KALECGOS) + if (!ObjectAccessor::GetCreature(*obj, KalecgosGUID) && Events.Empty()) + Events.ScheduleEvent(EVENT_SPAWN_KALECGOS, Minutes(1)); + } + + void Update(uint32 diff) override + { + Events.Update(diff); + + if (Events.ExecuteEvent() == EVENT_SPAWN_KALECGOS) + if (Creature* kalecgos = instance->SummonCreature(NPC_KALECGOS, KalecgosSpawnPos)) + { + kalecgos->GetMotionMaster()->MovePath(PATH_KALECGOS_FLIGHT, false); + kalecgos->AI()->Talk(SAY_KALECGOS_SPAWN); + } + } + bool SetBossState(uint32 type, EncounterState state) override { if (!InstanceScript::SetBossState(type, state)) @@ -177,10 +204,12 @@ class instance_magisters_terrace : public InstanceMapScript } protected: + EventMap Events; ObjectGuid SelinGUID; ObjectGuid DelrissaGUID; ObjectGuid KaelStatue[2]; ObjectGuid EscapeOrbGUID; + ObjectGuid KalecgosGUID; uint32 DelrissaDeathCount; }; diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp index e216a024468..5b90ac8ccf4 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.cpp @@ -31,7 +31,8 @@ EndContentData */ #include "ScriptedCreature.h" #include "ScriptedGossip.h" #include "Player.h" -#include "SpellInfo.h" +#include "magisters_terrace.h" +#include "EventMap.h" /*###### ## npc_kalecgos @@ -39,30 +40,29 @@ EndContentData */ enum Spells { - SPELL_TRANSFORM_TO_KAEL = 44670, + SPELL_KALECGOS_TRANSFORM = 44670, + SPELL_TRANSFORM_VISUAL = 24085, + SPELL_CAMERA_SHAKE = 44762, SPELL_ORB_KILL_CREDIT = 46307 }; -enum Creatures +enum MovementPoints { - NPC_KAEL = 24848 //human form entry + POINT_ID_PREPARE_LANDING = 6 }; -enum Misc +enum EventIds { - POINT_ID_LAND = 1 + EVENT_KALECGOS_TRANSFORM = 1, + EVENT_KALECGOS_LANDING = 2 }; -const float afKaelLandPoint[] = {225.045f, -276.236f, -5.434f}; - #define GOSSIP_ITEM_KAEL_1 "Who are you?" #define GOSSIP_ITEM_KAEL_2 "What can we do to assist you?" #define GOSSIP_ITEM_KAEL_3 "What brings you to the Sunwell?" #define GOSSIP_ITEM_KAEL_4 "You're not alone here?" #define GOSSIP_ITEM_KAEL_5 "What would Kil'jaeden want with a mortal woman?" -// This is friendly keal that appear after used Orb. -// If we assume DB handle summon, summon appear somewhere outside the platform where Orb is class npc_kalecgos : public CreatureScript { public: @@ -115,52 +115,46 @@ public: struct npc_kalecgosAI : public ScriptedAI { - npc_kalecgosAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - } + npc_kalecgosAI(Creature* creature) : ScriptedAI(creature) { } - void Initialize() + void MovementInform(uint32 type, uint32 pointId) override { - m_uiTransformTimer = 0; - } - - uint32 m_uiTransformTimer; - - void Reset() override - { - Initialize(); - - // we must assume he appear as dragon somewhere outside the platform of orb, and then move directly to here - if (me->GetEntry() != NPC_KAEL) - me->GetMotionMaster()->MovePoint(POINT_ID_LAND, afKaelLandPoint[0], afKaelLandPoint[1], afKaelLandPoint[2]); - } - - void MovementInform(uint32 uiType, uint32 uiPointId) override - { - if (uiType != POINT_MOTION_TYPE) + if (type != WAYPOINT_MOTION_TYPE) return; - if (uiPointId == POINT_ID_LAND) - m_uiTransformTimer = MINUTE*IN_MILLISECONDS; + if (pointId == POINT_ID_PREPARE_LANDING) + { + me->HandleEmoteCommand(EMOTE_ONESHOT_LAND); + me->SetDisableGravity(false); + me->SetHover(false); + events.ScheduleEvent(EVENT_KALECGOS_LANDING, Seconds(2)); + } } - void UpdateAI(uint32 uiDiff) override + void UpdateAI(uint32 diff) override { - if (m_uiTransformTimer) + events.Update(diff); + + switch (events.ExecuteEvent()) { - if (m_uiTransformTimer <= uiDiff) - { + case EVENT_KALECGOS_LANDING: + DoCastAOE(SPELL_CAMERA_SHAKE); + me->SetObjectScale(0.6f); + events.ScheduleEvent(EVENT_KALECGOS_TRANSFORM, Seconds(1)); + break; + case EVENT_KALECGOS_TRANSFORM: DoCast(me, SPELL_ORB_KILL_CREDIT, true); - - // Transform and update entry, now ready for quest/read gossip - DoCast(me, SPELL_TRANSFORM_TO_KAEL, false); - me->UpdateEntry(NPC_KAEL); - - m_uiTransformTimer = 0; - } else m_uiTransformTimer -= uiDiff; + DoCast(me, SPELL_TRANSFORM_VISUAL, false); + DoCast(me, SPELL_KALECGOS_TRANSFORM, false); + me->UpdateEntry(NPC_HUMAN_KALECGOS); + break; + default: + break; } } + + private: + EventMap events; }; }; diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.h b/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.h index 917ad0eb50b..05718dfc1dd 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.h +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/magisters_terrace.h @@ -42,7 +42,9 @@ enum CreatureIds { NPC_SELIN = 24723, NPC_DELRISSA = 24560, - NPC_FEL_CRYSTAL = 24722 + NPC_FEL_CRYSTAL = 24722, + NPC_KALECGOS = 24844, + NPC_HUMAN_KALECGOS = 24848 }; enum GameObjectIds @@ -57,4 +59,19 @@ enum GameObjectIds GO_ESCAPE_ORB = 188173 }; +enum InstanceEventIds +{ + EVENT_SPAWN_KALECGOS = 16547 +}; + +enum InstanceText +{ + SAY_KALECGOS_SPAWN = 0 +}; + +enum MovementData +{ + PATH_KALECGOS_FLIGHT = 248440 +}; + #endif diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp index dff0a66cec0..74b300919d8 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp @@ -134,8 +134,6 @@ static char const* Text[]= "Now, know demise!" }; -#define EMOTE_LAUGHS "Headless Horseman laughs" // needs assigned to db. - class npc_wisp_invis : public CreatureScript { public: @@ -347,7 +345,6 @@ public: Creature* speaker = DoSpawnCreature(HELPER, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 1000); if (speaker) speaker->CastSpell(speaker, SPELL_HEAD_SPEAKS, false); - me->TextEmote(EMOTE_LAUGHS); } else laugh -= diff; } @@ -724,7 +721,6 @@ public: if (laugh <= diff) { laugh = urand(11000, 22000); - me->TextEmote(EMOTE_LAUGHS); DoPlaySoundToSet(me, RandomLaugh[rand32() % 3]); } else laugh -= diff; diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp index cc55f758a22..5ec57fc44b6 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp @@ -29,109 +29,104 @@ EndScriptData */ #include "SpellAuraEffects.h" #include "zulaman.h" -#define YELL_AGGRO "Da shadow gonna fall on you... " -#define SOUND_YELL_AGGRO 12041 -#define YELL_SPIRIT_BOLTS "Your soul gonna bleed!" -#define SOUND_YELL_SPIRIT_BOLTS 12047 -#define YELL_DRAIN_POWER "Darkness comin\' for you" -#define SOUND_YELL_DRAIN_POWER 12046 -#define YELL_KILL_ONE "Dis a nightmare ya don\' wake up from!" -#define SOUND_YELL_KILL_ONE 12043 -#define YELL_KILL_TWO "Azzaga choogo zinn!" -#define SOUND_YELL_KILL_TWO 12044 -#define YELL_DEATH "Dis not... da end of me..." -#define SOUND_YELL_DEATH 12051 - +enum Yells +{ + YELL_AGGRO = 0, + YELL_KILL_ONE = 1, + YELL_KILL_TWO = 2, + YELL_DRAIN_POWER = 3, + YELL_SPIRIT_BOLTS = 4, + YELL_DEATH = 5 +}; enum Creatures { - NPC_TEMP_TRIGGER = 23920 + NPC_TEMP_TRIGGER = 23920 }; enum Spells { - SPELL_SPIRIT_BOLTS = 43383, - SPELL_DRAIN_POWER = 44131, - SPELL_SIPHON_SOUL = 43501, + SPELL_SPIRIT_BOLTS = 43383, + SPELL_DRAIN_POWER = 44131, + SPELL_SIPHON_SOUL = 43501, // Druid - SPELL_DR_THORNS = 43420, - SPELL_DR_LIFEBLOOM = 43421, - SPELL_DR_MOONFIRE = 43545, + SPELL_DR_THORNS = 43420, + SPELL_DR_LIFEBLOOM = 43421, + SPELL_DR_MOONFIRE = 43545, // Hunter - SPELL_HU_EXPLOSIVE_TRAP = 43444, - SPELL_HU_FREEZING_TRAP = 43447, - SPELL_HU_SNAKE_TRAP = 43449, + SPELL_HU_EXPLOSIVE_TRAP = 43444, + SPELL_HU_FREEZING_TRAP = 43447, + SPELL_HU_SNAKE_TRAP = 43449, // Mage - SPELL_MG_FIREBALL = 41383, - SPELL_MG_FROST_NOVA = 43426, - SPELL_MG_ICE_LANCE = 43427, - SPELL_MG_FROSTBOLT = 43428, + SPELL_MG_FIREBALL = 41383, + SPELL_MG_FROST_NOVA = 43426, + SPELL_MG_ICE_LANCE = 43427, + SPELL_MG_FROSTBOLT = 43428, // Paladin - SPELL_PA_CONSECRATION = 43429, - SPELL_PA_AVENGING_WRATH = 43430, - SPELL_PA_HOLY_LIGHT = 43451, + SPELL_PA_CONSECRATION = 43429, + SPELL_PA_AVENGING_WRATH = 43430, + SPELL_PA_HOLY_LIGHT = 43451, // Priest - SPELL_PR_HEAL = 41372, - SPELL_PR_MIND_BLAST = 41374, - SPELL_PR_SW_DEATH = 41375, - SPELL_PR_PSYCHIC_SCREAM = 43432, - SPELL_PR_MIND_CONTROL = 43550, - SPELL_PR_PAIN_SUPP = 44416, + SPELL_PR_HEAL = 41372, + SPELL_PR_MIND_BLAST = 41374, + SPELL_PR_SW_DEATH = 41375, + SPELL_PR_PSYCHIC_SCREAM = 43432, + SPELL_PR_MIND_CONTROL = 43550, + SPELL_PR_PAIN_SUPP = 44416, // Rogue - SPELL_RO_BLIND = 43433, - SPELL_RO_SLICE_DICE = 43457, - SPELL_RO_WOUND_POISON = 43461, + SPELL_RO_BLIND = 43433, + SPELL_RO_SLICE_DICE = 43457, + SPELL_RO_WOUND_POISON = 43461, // Shaman - SPELL_SH_CHAIN_LIGHT = 43435, - SPELL_SH_FIRE_NOVA = 43436, - SPELL_SH_HEALING_WAVE = 43548, + SPELL_SH_CHAIN_LIGHT = 43435, + SPELL_SH_FIRE_NOVA = 43436, + SPELL_SH_HEALING_WAVE = 43548, // Warlock - SPELL_WL_CURSE_OF_DOOM = 43439, - SPELL_WL_RAIN_OF_FIRE = 43440, - SPELL_WL_UNSTABLE_AFFL = 43522, - SPELL_WL_UNSTABLE_AFFL_DISPEL = 43523, + SPELL_WL_CURSE_OF_DOOM = 43439, + SPELL_WL_RAIN_OF_FIRE = 43440, + SPELL_WL_UNSTABLE_AFFL = 43522, + SPELL_WL_UNSTABLE_AFFL_DISPEL = 43523, // Warrior - SPELL_WR_MORTAL_STRIKE = 43441, - SPELL_WR_WHIRLWIND = 43442, - SPELL_WR_SPELL_REFLECT = 43443, + SPELL_WR_MORTAL_STRIKE = 43441, + SPELL_WR_WHIRLWIND = 43442, + SPELL_WR_SPELL_REFLECT = 43443, // Thurg - SPELL_BLOODLUST = 43578, - SPELL_CLEAVE = 15496, + SPELL_BLOODLUST = 43578, + SPELL_CLEAVE = 15496, // Gazakroth - SPELL_FIREBOLT = 43584, + SPELL_FIREBOLT = 43584, // Alyson Antille - SPELL_FLASH_HEAL = 43575, - SPELL_DISPEL_MAGIC = 43577, + SPELL_FLASH_HEAL = 43575, + SPELL_DISPEL_MAGIC = 43577, // Lord Raadan - SPELL_FLAME_BREATH = 43582, - SPELL_THUNDERCLAP = 43583, + SPELL_FLAME_BREATH = 43582, + SPELL_THUNDERCLAP = 43583, // Darkheart - SPELL_PSYCHIC_WAIL = 43590, + SPELL_PSYCHIC_WAIL = 43590, // Slither - SPELL_VENOM_SPIT = 43579, + SPELL_VENOM_SPIT = 43579, // Fenstalker - SPELL_VOLATILE_INFECTION = 43586, + SPELL_VOLATILE_INFECTION = 43586, // Koragg - SPELL_COLD_STARE = 43593, - SPELL_MIGHTY_BLOW = 43592 - + SPELL_COLD_STARE = 43593, + SPELL_MIGHTY_BLOW = 43592 }; #define ORIENT 1.5696f @@ -306,8 +301,7 @@ class boss_hexlord_malacrass : public CreatureScript instance->SetData(DATA_HEXLORDEVENT, IN_PROGRESS); DoZoneInCombat(); - me->Yell(YELL_AGGRO, LANG_UNIVERSAL); - DoPlaySoundToSet(me, SOUND_YELL_AGGRO); + Talk(YELL_AGGRO); for (uint8 i = 0; i < 4; ++i) { @@ -327,12 +321,10 @@ class boss_hexlord_malacrass : public CreatureScript switch (urand(0, 1)) { case 0: - me->Yell(YELL_KILL_ONE, LANG_UNIVERSAL); - DoPlaySoundToSet(me, SOUND_YELL_KILL_ONE); + Talk(YELL_KILL_ONE); break; case 1: - me->Yell(YELL_KILL_TWO, LANG_UNIVERSAL); - DoPlaySoundToSet(me, SOUND_YELL_KILL_TWO); + Talk(YELL_KILL_TWO); break; } } @@ -341,8 +333,7 @@ class boss_hexlord_malacrass : public CreatureScript { instance->SetData(DATA_HEXLORDEVENT, DONE); - me->Yell(YELL_DEATH, LANG_UNIVERSAL); - DoPlaySoundToSet(me, SOUND_YELL_DEATH); + Talk(YELL_DEATH); for (uint8 i = 0; i < 4; ++i) { @@ -415,8 +406,7 @@ class boss_hexlord_malacrass : public CreatureScript if (DrainPower_Timer <= diff) { DoCast(me, SPELL_DRAIN_POWER, true); - me->Yell(YELL_DRAIN_POWER, LANG_UNIVERSAL); - DoPlaySoundToSet(me, SOUND_YELL_DRAIN_POWER); + Talk(YELL_DRAIN_POWER); DrainPower_Timer = urand(40000, 55000); // must cast in 60 sec, or buff/debuff will disappear } else DrainPower_Timer -= diff; @@ -427,8 +417,7 @@ class boss_hexlord_malacrass : public CreatureScript else { DoCast(me, SPELL_SPIRIT_BOLTS, false); - me->Yell(YELL_SPIRIT_BOLTS, LANG_UNIVERSAL); - DoPlaySoundToSet(me, SOUND_YELL_SPIRIT_BOLTS); + Talk(YELL_SPIRIT_BOLTS); SpiritBolts_Timer = 40000; SiphonSoul_Timer = 10000; // ready to drain PlayerAbility_Timer = 99999; diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp index 37505a8b74d..0407cb6cd7c 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp @@ -30,21 +30,41 @@ EndScriptData */ #include "GridNotifiersImpl.h" #include "CellImpl.h" -enum Spells +enum Yells { - SPELL_BERSERK = 45078, + YELL_NALORAKK_WAVE1 = 0, + YELL_NALORAKK_WAVE2 = 1, + YELL_NALORAKK_WAVE3 = 2, + YELL_NALORAKK_WAVE4 = 3, + YELL_AGGRO = 4, + YELL_SURGE = 5, + YELL_SHIFTEDTOBEAR = 6, + YELL_SHIFTEDTOTROLL = 7, + YELL_BERSERK = 8, + YELL_KILL_ONE = 9, + YELL_KILL_TWO = 10, + YELL_DEATH = 11 + +// Not yet implemented +// YELL_NALORAKK_EVENT1 = 12, +// YELL_NALORAKK_EVENT2 = 13 +}; +enum Spells +{ // Troll form - SPELL_BRUTALSWIPE = 42384, - SPELL_MANGLE = 42389, - SPELL_MANGLEEFFECT = 44955, - SPELL_SURGE = 42402, - SPELL_BEARFORM = 42377, + SPELL_BRUTALSWIPE = 42384, + SPELL_MANGLE = 42389, + SPELL_MANGLEEFFECT = 44955, + SPELL_SURGE = 42402, + SPELL_BEARFORM = 42377, // Bear form - SPELL_LACERATINGSLASH = 42395, - SPELL_RENDFLESH = 42397, - SPELL_DEAFENINGROAR = 42398 + SPELL_LACERATINGSLASH = 42395, + SPELL_RENDFLESH = 42397, + SPELL_DEAFENINGROAR = 42398, + + SPELL_BERSERK = 45078 }; // Trash Waves @@ -57,45 +77,9 @@ float NalorakkWay[8][3] = {-79.929f, 1395.958f, 27.31f}, {-80.072f, 1374.555f, 40.87f}, // waypoint 3 {-80.072f, 1314.398f, 40.87f}, - {-80.072f, 1295.775f, 48.60f} // waypoint 4 + {-80.072f, 1295.775f, 48.60f} // waypoint 4 }; -#define YELL_NALORAKK_WAVE1 "Get da move on, guards! It be killin' time!" -#define SOUND_NALORAKK_WAVE1 12066 -#define YELL_NALORAKK_WAVE2 "Guards, go already! Who you more afraid of, dem... or me?" -#define SOUND_NALORAKK_WAVE2 12067 -#define YELL_NALORAKK_WAVE3 "Ride now! Ride out dere and bring me back some heads!" -#define SOUND_NALORAKK_WAVE3 12068 -#define YELL_NALORAKK_WAVE4 "I be losin' me patience! Go on: make dem wish dey was never born!" -#define SOUND_NALORAKK_WAVE4 12069 - -//Unimplemented SoundIDs -/* -#define SOUND_NALORAKK_EVENT1 12078 -#define SOUND_NALORAKK_EVENT2 12079 -*/ - -//General defines -#define YELL_AGGRO "You be dead soon enough!" -#define SOUND_YELL_AGGRO 12070 -#define YELL_KILL_ONE "Mua-ha-ha! Now whatchoo got to say?" -#define SOUND_YELL_KILL_ONE 12075 -#define YELL_KILL_TWO "Da Amani gonna rule again!" -#define SOUND_YELL_KILL_TWO 12076 -#define YELL_DEATH "I... be waitin' on da udda side...." -#define SOUND_YELL_DEATH 12077 -#define YELL_BERSERK "You had your chance, now it be too late!" //Never seen this being used, so just guessing from what I hear. -#define SOUND_YELL_BERSERK 12074 -#define YELL_SURGE "I bring da pain!" -#define SOUND_YELL_SURGE 12071 - -#define YELL_SHIFTEDTOTROLL "Make way for Nalorakk!" -#define SOUND_YELL_TOTROLL 12073 - - -#define YELL_SHIFTEDTOBEAR "You call on da beast, you gonna get more dan you bargain for!" -#define SOUND_YELL_TOBEAR 12072 - class boss_nalorakk : public CreatureScript { public: @@ -227,8 +211,7 @@ class boss_nalorakk : public CreatureScript case 0: if (me->IsWithinDistInMap(who, 50)) { - me->Yell(YELL_NALORAKK_WAVE1, LANG_UNIVERSAL); - DoPlaySoundToSet(me, SOUND_NALORAKK_WAVE1); + Talk(YELL_NALORAKK_WAVE1); (*me).GetMotionMaster()->MovePoint(1, NalorakkWay[1][0], NalorakkWay[1][1], NalorakkWay[1][2]); MovePhase ++; @@ -240,8 +223,7 @@ class boss_nalorakk : public CreatureScript case 2: if (me->IsWithinDistInMap(who, 40)) { - me->Yell(YELL_NALORAKK_WAVE2, LANG_UNIVERSAL); - DoPlaySoundToSet(me, SOUND_NALORAKK_WAVE2); + Talk(YELL_NALORAKK_WAVE2); (*me).GetMotionMaster()->MovePoint(3, NalorakkWay[3][0], NalorakkWay[3][1], NalorakkWay[3][2]); MovePhase ++; @@ -253,8 +235,7 @@ class boss_nalorakk : public CreatureScript case 5: if (me->IsWithinDistInMap(who, 40)) { - me->Yell(YELL_NALORAKK_WAVE3, LANG_UNIVERSAL); - DoPlaySoundToSet(me, SOUND_NALORAKK_WAVE3); + Talk(YELL_NALORAKK_WAVE3); (*me).GetMotionMaster()->MovePoint(6, NalorakkWay[6][0], NalorakkWay[6][1], NalorakkWay[6][2]); MovePhase ++; @@ -268,8 +249,7 @@ class boss_nalorakk : public CreatureScript { SendAttacker(who); - me->Yell(YELL_NALORAKK_WAVE4, LANG_UNIVERSAL); - DoPlaySoundToSet(me, SOUND_NALORAKK_WAVE4); + Talk(YELL_NALORAKK_WAVE4); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); @@ -287,8 +267,7 @@ class boss_nalorakk : public CreatureScript { instance->SetData(DATA_NALORAKKEVENT, IN_PROGRESS); - me->Yell(YELL_AGGRO, LANG_UNIVERSAL); - DoPlaySoundToSet(me, SOUND_YELL_AGGRO); + Talk(YELL_AGGRO); DoZoneInCombat(); } @@ -296,8 +275,7 @@ class boss_nalorakk : public CreatureScript { instance->SetData(DATA_NALORAKKEVENT, DONE); - me->Yell(YELL_DEATH, LANG_UNIVERSAL); - DoPlaySoundToSet(me, SOUND_YELL_DEATH); + Talk(YELL_DEATH); } void KilledUnit(Unit* /*victim*/) override @@ -305,12 +283,10 @@ class boss_nalorakk : public CreatureScript switch (urand(0, 1)) { case 0: - me->Yell(YELL_KILL_ONE, LANG_UNIVERSAL); - DoPlaySoundToSet(me, SOUND_YELL_KILL_ONE); + Talk(YELL_KILL_ONE); break; case 1: - me->Yell(YELL_KILL_TWO, LANG_UNIVERSAL); - DoPlaySoundToSet(me, SOUND_YELL_KILL_TWO); + Talk(YELL_KILL_TWO); break; } } @@ -373,8 +349,7 @@ class boss_nalorakk : public CreatureScript if (Berserk_Timer <= diff) { DoCast(me, SPELL_BERSERK, true); - me->Yell(YELL_BERSERK, LANG_UNIVERSAL); - DoPlaySoundToSet(me, SOUND_YELL_BERSERK); + Talk(YELL_BERSERK); Berserk_Timer = 600000; } else Berserk_Timer -= diff; @@ -383,8 +358,7 @@ class boss_nalorakk : public CreatureScript if (inBearForm) { // me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, 5122); - me->Yell(YELL_SHIFTEDTOTROLL, LANG_UNIVERSAL); - DoPlaySoundToSet(me, SOUND_YELL_TOTROLL); + Talk(YELL_SHIFTEDTOTROLL); me->RemoveAurasDueToSpell(SPELL_BEARFORM); Surge_Timer = urand(15000, 20000); BrutalSwipe_Timer = urand(7000, 12000); @@ -395,8 +369,7 @@ class boss_nalorakk : public CreatureScript else { // me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, 0); - me->Yell(YELL_SHIFTEDTOBEAR, LANG_UNIVERSAL); - DoPlaySoundToSet(me, SOUND_YELL_TOBEAR); + Talk(YELL_SHIFTEDTOBEAR); DoCast(me, SPELL_BEARFORM, true); LaceratingSlash_Timer = 2000; // dur 18s RendFlesh_Timer = 3000; // dur 5s @@ -426,8 +399,7 @@ class boss_nalorakk : public CreatureScript if (Surge_Timer <= diff) { - me->Yell(YELL_SURGE, LANG_UNIVERSAL); - DoPlaySoundToSet(me, SOUND_YELL_SURGE); + Talk(YELL_SURGE); Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 45, true); if (target) DoCast(target, SPELL_SURGE); diff --git a/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp b/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp new file mode 100644 index 00000000000..8c781bb9001 --- /dev/null +++ b/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp @@ -0,0 +1,372 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +// This is where scripts' loading functions should be declared: +void AddSC_alterac_valley(); //Alterac Valley +void AddSC_boss_balinda(); +void AddSC_boss_drekthar(); +void AddSC_boss_galvangar(); +void AddSC_boss_vanndar(); +void AddSC_blackrock_depths(); //Blackrock Depths +void AddSC_boss_ambassador_flamelash(); +void AddSC_boss_draganthaurissan(); +void AddSC_boss_general_angerforge(); +void AddSC_boss_high_interrogator_gerstahn(); +void AddSC_boss_magmus(); +void AddSC_boss_moira_bronzebeard(); +void AddSC_boss_tomb_of_seven(); +void AddSC_instance_blackrock_depths(); +void AddSC_boss_drakkisath(); //Blackrock Spire +void AddSC_boss_halycon(); +void AddSC_boss_highlordomokk(); +void AddSC_boss_mothersmolderweb(); +void AddSC_boss_overlordwyrmthalak(); +void AddSC_boss_shadowvosh(); +void AddSC_boss_thebeast(); +void AddSC_boss_warmastervoone(); +void AddSC_boss_quatermasterzigris(); +void AddSC_boss_pyroguard_emberseer(); +void AddSC_boss_gyth(); +void AddSC_boss_rend_blackhand(); +void AddSC_boss_gizrul_the_slavener(); +void AddSC_boss_urok_doomhowl(); +void AddSC_boss_lord_valthalak(); +void AddSC_instance_blackrock_spire(); +void AddSC_boss_razorgore(); //Blackwing lair +void AddSC_boss_vaelastrasz(); +void AddSC_boss_broodlord(); +void AddSC_boss_firemaw(); +void AddSC_boss_ebonroc(); +void AddSC_boss_flamegor(); +void AddSC_boss_chromaggus(); +void AddSC_boss_nefarian(); +void AddSC_instance_blackwing_lair(); +void AddSC_deadmines(); //Deadmines +void AddSC_instance_deadmines(); +void AddSC_boss_mr_smite(); +void AddSC_gnomeregan(); //Gnomeregan +void AddSC_instance_gnomeregan(); +void AddSC_boss_attumen(); //Karazhan +void AddSC_boss_curator(); +void AddSC_boss_maiden_of_virtue(); +void AddSC_boss_shade_of_aran(); +void AddSC_boss_malchezaar(); +void AddSC_boss_terestian_illhoof(); +void AddSC_boss_moroes(); +void AddSC_bosses_opera(); +void AddSC_boss_netherspite(); +void AddSC_instance_karazhan(); +void AddSC_karazhan(); +void AddSC_boss_nightbane(); +void AddSC_boss_felblood_kaelthas(); // Magister's Terrace +void AddSC_boss_selin_fireheart(); +void AddSC_boss_vexallus(); +void AddSC_boss_priestess_delrissa(); +void AddSC_instance_magisters_terrace(); +void AddSC_magisters_terrace(); +void AddSC_boss_lucifron(); //Molten core +void AddSC_boss_magmadar(); +void AddSC_boss_gehennas(); +void AddSC_boss_garr(); +void AddSC_boss_baron_geddon(); +void AddSC_boss_shazzrah(); +void AddSC_boss_golemagg(); +void AddSC_boss_sulfuron(); +void AddSC_boss_majordomo(); +void AddSC_boss_ragnaros(); +void AddSC_instance_molten_core(); +void AddSC_instance_ragefire_chasm(); //Ragefire Chasm +void AddSC_the_scarlet_enclave(); //Scarlet Enclave +void AddSC_the_scarlet_enclave_c1(); +void AddSC_the_scarlet_enclave_c2(); +void AddSC_the_scarlet_enclave_c5(); +void AddSC_boss_arcanist_doan(); //Scarlet Monastery +void AddSC_boss_azshir_the_sleepless(); +void AddSC_boss_bloodmage_thalnos(); +void AddSC_boss_headless_horseman(); +void AddSC_boss_herod(); +void AddSC_boss_high_inquisitor_fairbanks(); +void AddSC_boss_houndmaster_loksey(); +void AddSC_boss_interrogator_vishas(); +void AddSC_boss_scorn(); +void AddSC_instance_scarlet_monastery(); +void AddSC_boss_mograine_and_whitemane(); +void AddSC_boss_darkmaster_gandling(); //Scholomance +void AddSC_boss_death_knight_darkreaver(); +void AddSC_boss_theolenkrastinov(); +void AddSC_boss_illuciabarov(); +void AddSC_boss_instructormalicia(); +void AddSC_boss_jandicebarov(); +void AddSC_boss_kormok(); +void AddSC_boss_lordalexeibarov(); +void AddSC_boss_lorekeeperpolkelt(); +void AddSC_boss_rasfrost(); +void AddSC_boss_theravenian(); +void AddSC_boss_vectus(); +void AddSC_boss_kirtonos_the_herald(); +void AddSC_instance_scholomance(); +void AddSC_shadowfang_keep(); //Shadowfang keep +void AddSC_instance_shadowfang_keep(); +void AddSC_boss_magistrate_barthilas(); //Stratholme +void AddSC_boss_maleki_the_pallid(); +void AddSC_boss_nerubenkan(); +void AddSC_boss_cannon_master_willey(); +void AddSC_boss_baroness_anastari(); +void AddSC_boss_ramstein_the_gorger(); +void AddSC_boss_timmy_the_cruel(); +void AddSC_boss_postmaster_malown(); +void AddSC_boss_baron_rivendare(); +void AddSC_boss_dathrohan_balnazzar(); +void AddSC_boss_order_of_silver_hand(); +void AddSC_instance_stratholme(); +void AddSC_stratholme(); +void AddSC_sunken_temple(); // Sunken Temple +void AddSC_instance_sunken_temple(); +void AddSC_instance_sunwell_plateau(); //Sunwell Plateau +void AddSC_boss_kalecgos(); +void AddSC_boss_brutallus(); +void AddSC_boss_felmyst(); +void AddSC_boss_eredar_twins(); +void AddSC_boss_muru(); +void AddSC_boss_kiljaeden(); +void AddSC_sunwell_plateau(); +void AddSC_boss_archaedas(); //Uldaman +void AddSC_boss_ironaya(); +void AddSC_uldaman(); +void AddSC_instance_uldaman(); +void AddSC_instance_the_stockade(); //The Stockade +void AddSC_boss_akilzon(); //Zul'Aman +void AddSC_boss_halazzi(); +void AddSC_boss_hex_lord_malacrass(); +void AddSC_boss_janalai(); +void AddSC_boss_nalorakk(); +void AddSC_boss_zuljin(); +void AddSC_instance_zulaman(); +void AddSC_zulaman(); +void AddSC_boss_jeklik(); //Zul'Gurub +void AddSC_boss_venoxis(); +void AddSC_boss_marli(); +void AddSC_boss_mandokir(); +void AddSC_boss_gahzranka(); +void AddSC_boss_thekal(); +void AddSC_boss_arlokk(); +void AddSC_boss_jindo(); +void AddSC_boss_hakkar(); +void AddSC_boss_grilek(); +void AddSC_boss_hazzarah(); +void AddSC_boss_renataki(); +void AddSC_boss_wushoolay(); +void AddSC_instance_zulgurub(); +//void AddSC_alterac_mountains(); +void AddSC_arathi_highlands(); +void AddSC_blasted_lands(); +void AddSC_burning_steppes(); +void AddSC_duskwood(); +void AddSC_eastern_plaguelands(); +void AddSC_ghostlands(); +void AddSC_hinterlands(); +void AddSC_isle_of_queldanas(); +void AddSC_loch_modan(); +void AddSC_redridge_mountains(); +void AddSC_silverpine_forest(); +void AddSC_stormwind_city(); +void AddSC_stranglethorn_vale(); +void AddSC_swamp_of_sorrows(); +void AddSC_tirisfal_glades(); +void AddSC_undercity(); +void AddSC_western_plaguelands(); +void AddSC_wetlands(); + +// The name of this function should match: +// void Add${NameOfDirectory}Scripts() +void AddEasternKingdomsScripts() +{ + AddSC_alterac_valley(); //Alterac Valley + AddSC_boss_balinda(); + AddSC_boss_drekthar(); + AddSC_boss_galvangar(); + AddSC_boss_vanndar(); + AddSC_blackrock_depths(); //Blackrock Depths + AddSC_boss_ambassador_flamelash(); + AddSC_boss_draganthaurissan(); + AddSC_boss_general_angerforge(); + AddSC_boss_high_interrogator_gerstahn(); + AddSC_boss_magmus(); + AddSC_boss_moira_bronzebeard(); + AddSC_boss_tomb_of_seven(); + AddSC_instance_blackrock_depths(); + AddSC_boss_drakkisath(); //Blackrock Spire + AddSC_boss_halycon(); + AddSC_boss_highlordomokk(); + AddSC_boss_mothersmolderweb(); + AddSC_boss_overlordwyrmthalak(); + AddSC_boss_shadowvosh(); + AddSC_boss_thebeast(); + AddSC_boss_warmastervoone(); + AddSC_boss_quatermasterzigris(); + AddSC_boss_pyroguard_emberseer(); + AddSC_boss_gyth(); + AddSC_boss_rend_blackhand(); + AddSC_boss_gizrul_the_slavener(); + AddSC_boss_urok_doomhowl(); + AddSC_boss_lord_valthalak(); + AddSC_instance_blackrock_spire(); + AddSC_boss_razorgore(); //Blackwing lair + AddSC_boss_vaelastrasz(); + AddSC_boss_broodlord(); + AddSC_boss_firemaw(); + AddSC_boss_ebonroc(); + AddSC_boss_flamegor(); + AddSC_boss_chromaggus(); + AddSC_boss_nefarian(); + AddSC_instance_blackwing_lair(); + AddSC_deadmines(); //Deadmines + AddSC_boss_mr_smite(); + AddSC_instance_deadmines(); + AddSC_gnomeregan(); //Gnomeregan + AddSC_instance_gnomeregan(); + AddSC_boss_attumen(); //Karazhan + AddSC_boss_curator(); + AddSC_boss_maiden_of_virtue(); + AddSC_boss_shade_of_aran(); + AddSC_boss_malchezaar(); + AddSC_boss_terestian_illhoof(); + AddSC_boss_moroes(); + AddSC_bosses_opera(); + AddSC_boss_netherspite(); + AddSC_instance_karazhan(); + AddSC_karazhan(); + AddSC_boss_nightbane(); + AddSC_boss_felblood_kaelthas(); // Magister's Terrace + AddSC_boss_selin_fireheart(); + AddSC_boss_vexallus(); + AddSC_boss_priestess_delrissa(); + AddSC_instance_magisters_terrace(); + AddSC_magisters_terrace(); + AddSC_boss_lucifron(); //Molten core + AddSC_boss_magmadar(); + AddSC_boss_gehennas(); + AddSC_boss_garr(); + AddSC_boss_baron_geddon(); + AddSC_boss_shazzrah(); + AddSC_boss_golemagg(); + AddSC_boss_sulfuron(); + AddSC_boss_majordomo(); + AddSC_boss_ragnaros(); + AddSC_instance_molten_core(); + AddSC_instance_ragefire_chasm(); //Ragefire Chasm + AddSC_the_scarlet_enclave(); //Scarlet Enclave + AddSC_the_scarlet_enclave_c1(); + AddSC_the_scarlet_enclave_c2(); + AddSC_the_scarlet_enclave_c5(); + AddSC_boss_arcanist_doan(); //Scarlet Monastery + AddSC_boss_azshir_the_sleepless(); + AddSC_boss_bloodmage_thalnos(); + AddSC_boss_headless_horseman(); + AddSC_boss_herod(); + AddSC_boss_high_inquisitor_fairbanks(); + AddSC_boss_houndmaster_loksey(); + AddSC_boss_interrogator_vishas(); + AddSC_boss_scorn(); + AddSC_instance_scarlet_monastery(); + AddSC_boss_mograine_and_whitemane(); + AddSC_boss_darkmaster_gandling(); //Scholomance + AddSC_boss_death_knight_darkreaver(); + AddSC_boss_theolenkrastinov(); + AddSC_boss_illuciabarov(); + AddSC_boss_instructormalicia(); + AddSC_boss_jandicebarov(); + AddSC_boss_kormok(); + AddSC_boss_lordalexeibarov(); + AddSC_boss_lorekeeperpolkelt(); + AddSC_boss_rasfrost(); + AddSC_boss_theravenian(); + AddSC_boss_vectus(); + AddSC_boss_kirtonos_the_herald(); + AddSC_instance_scholomance(); + AddSC_shadowfang_keep(); //Shadowfang keep + AddSC_instance_shadowfang_keep(); + AddSC_boss_magistrate_barthilas(); //Stratholme + AddSC_boss_maleki_the_pallid(); + AddSC_boss_nerubenkan(); + AddSC_boss_cannon_master_willey(); + AddSC_boss_baroness_anastari(); + AddSC_boss_ramstein_the_gorger(); + AddSC_boss_timmy_the_cruel(); + AddSC_boss_postmaster_malown(); + AddSC_boss_baron_rivendare(); + AddSC_boss_dathrohan_balnazzar(); + AddSC_boss_order_of_silver_hand(); + AddSC_instance_stratholme(); + AddSC_stratholme(); + AddSC_sunken_temple(); // Sunken Temple + AddSC_instance_sunken_temple(); + AddSC_instance_sunwell_plateau(); //Sunwell Plateau + AddSC_boss_kalecgos(); + AddSC_boss_brutallus(); + AddSC_boss_felmyst(); + AddSC_boss_eredar_twins(); + AddSC_boss_muru(); + AddSC_boss_kiljaeden(); + AddSC_sunwell_plateau(); + AddSC_instance_the_stockade(); //The Stockade + AddSC_boss_archaedas(); //Uldaman + AddSC_boss_ironaya(); + AddSC_uldaman(); + AddSC_instance_uldaman(); + AddSC_boss_akilzon(); //Zul'Aman + AddSC_boss_halazzi(); + AddSC_boss_hex_lord_malacrass(); + AddSC_boss_janalai(); + AddSC_boss_nalorakk(); + AddSC_boss_zuljin(); + AddSC_instance_zulaman(); + AddSC_zulaman(); + AddSC_boss_jeklik(); //Zul'Gurub + AddSC_boss_venoxis(); + AddSC_boss_marli(); + AddSC_boss_mandokir(); + AddSC_boss_gahzranka(); + AddSC_boss_thekal(); + AddSC_boss_arlokk(); + AddSC_boss_jindo(); + AddSC_boss_hakkar(); + AddSC_boss_grilek(); + AddSC_boss_hazzarah(); + AddSC_boss_renataki(); + AddSC_boss_wushoolay(); + AddSC_instance_zulgurub(); + //AddSC_alterac_mountains(); + AddSC_arathi_highlands(); + AddSC_blasted_lands(); + AddSC_burning_steppes(); + AddSC_duskwood(); + AddSC_eastern_plaguelands(); + AddSC_ghostlands(); + AddSC_hinterlands(); + AddSC_isle_of_queldanas(); + AddSC_loch_modan(); + AddSC_redridge_mountains(); + AddSC_silverpine_forest(); + AddSC_stormwind_city(); + AddSC_stranglethorn_vale(); + AddSC_swamp_of_sorrows(); + AddSC_tirisfal_glades(); + AddSC_undercity(); + AddSC_western_plaguelands(); + AddSC_wetlands(); +} diff --git a/src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp b/src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp index df61a010f84..6caf253570a 100644 --- a/src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp +++ b/src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp @@ -19,7 +19,7 @@ /* ScriptData SDName: Burning_Steppes SD%Complete: 100 -SDComment: Quest support: 4224, 4866 +SDComment: Quest support: 4866 SDCategory: Burning Steppes EndScriptData */ @@ -36,25 +36,11 @@ EndContentData */ ## npc_ragged_john ######*/ -#define GOSSIP_HELLO "Official buisness, John. I need some information about Marsha Windsor. Tell me about the last time you saw him." -#define GOSSIP_SELECT1 "So what did you do?" -#define GOSSIP_SELECT2 "Start making sense, dwarf. I don't want to have anything to do with your cracker, your pappy, or any sort of 'discreditin'." -#define GOSSIP_SELECT3 "Ironfoe?" -#define GOSSIP_SELECT4 "Interesting... continue John." -#define GOSSIP_SELECT5 "So that's how Windsor died..." -#define GOSSIP_SELECT6 "So how did he die?" -#define GOSSIP_SELECT7 "Ok so where the hell is he? Wait a minute! Are you drunk?" -#define GOSSIP_SELECT8 "WHY is he in Blackrock Depths?" -#define GOSSIP_SELECT9 "300? So the Dark Irons killed him and dragged him into the Depths?" -#define GOSSIP_SELECT10 "Ahh... Ironfoe" -#define GOSSIP_SELECT11 "Thanks, Ragged John. Your story was very uplifting and informative" - enum RaggedJohn { - QUEST_THE_TRUE_MASTERS = 4224, - QUEST_MOTHERS_MILK = 4866, - SPELL_MOTHERS_MILK = 16468, - SPELL_WICKED_MILKING = 16472 + QUEST_MOTHERS_MILK = 4866, + SPELL_MOTHERS_MILK = 16468, + SPELL_WICKED_MILKING = 16472 }; class npc_ragged_john : public CreatureScript @@ -86,72 +72,13 @@ public: void EnterCombat(Unit* /*who*/) override { } }; - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - player->PlayerTalkClass->ClearMenus(); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - player->SEND_GOSSIP_MENU(2714, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+1: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - player->SEND_GOSSIP_MENU(2715, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+2: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - player->SEND_GOSSIP_MENU(2716, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+3: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); - player->SEND_GOSSIP_MENU(2717, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+4: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); - player->SEND_GOSSIP_MENU(2718, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+5: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); - player->SEND_GOSSIP_MENU(2719, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+6: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT7, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 7); - player->SEND_GOSSIP_MENU(2720, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+7: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT8, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 8); - player->SEND_GOSSIP_MENU(2721, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+8: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT9, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9); - player->SEND_GOSSIP_MENU(2722, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+9: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT10, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 10); - player->SEND_GOSSIP_MENU(2723, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+10: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT11, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11); - player->SEND_GOSSIP_MENU(2725, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+11: - player->CLOSE_GOSSIP_MENU(); - player->AreaExploredOrEventHappens(QUEST_THE_TRUE_MASTERS); - break; - } - return true; - } - bool OnGossipHello(Player* player, Creature* creature) override { if (creature->IsQuestGiver()) + { player->PrepareQuestMenu(creature->GetGUID()); - - if (player->GetQuestStatus(QUEST_THE_TRUE_MASTERS) == QUEST_STATUS_INCOMPLETE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HELLO, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - - player->SEND_GOSSIP_MENU(2713, creature->GetGUID()); + player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); + } return true; } diff --git a/src/server/scripts/EasternKingdoms/zone_eastern_plaguelands.cpp b/src/server/scripts/EasternKingdoms/zone_eastern_plaguelands.cpp index ce0ebf4d129..4cc72715868 100644 --- a/src/server/scripts/EasternKingdoms/zone_eastern_plaguelands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_eastern_plaguelands.cpp @@ -19,7 +19,7 @@ /* ScriptData SDName: Eastern_Plaguelands SD%Complete: 100 -SDComment: Quest support: 5211, 5742. Special vendor Augustus the Touched +SDComment: Quest support: 5211. Special vendor Augustus the Touched SDCategory: Eastern Plaguelands EndScriptData */ @@ -27,7 +27,6 @@ EndScriptData */ npc_ghoul_flayer npc_augustus_the_touched npc_darrowshire_spirit -npc_tirion_fordring EndContentData */ #include "ScriptMgr.h" @@ -133,63 +132,9 @@ public: }; }; -/*###### -## npc_tirion_fordring -######*/ - -#define GOSSIP_HELLO "I am ready to hear your tale, Tirion." -#define GOSSIP_SELECT1 "Thank you, Tirion. What of your identity?" -#define GOSSIP_SELECT2 "That is terrible." -#define GOSSIP_SELECT3 "I will, Tirion." - -class npc_tirion_fordring : public CreatureScript -{ -public: - npc_tirion_fordring() : CreatureScript("npc_tirion_fordring") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - player->PlayerTalkClass->ClearMenus(); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF+1: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - player->SEND_GOSSIP_MENU(4493, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+2: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - player->SEND_GOSSIP_MENU(4494, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+3: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); - player->SEND_GOSSIP_MENU(4495, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+4: - player->CLOSE_GOSSIP_MENU(); - player->AreaExploredOrEventHappens(5742); - break; - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (player->GetQuestStatus(5742) == QUEST_STATUS_INCOMPLETE && player->getStandState() == UNIT_STAND_STATE_SIT) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HELLO, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - - player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); - - return true; - } -}; - void AddSC_eastern_plaguelands() { new npc_ghoul_flayer(); new npc_augustus_the_touched(); new npc_darrowshire_spirit(); - new npc_tirion_fordring(); } diff --git a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp index 2d6d4da5aef..4a585bcb267 100644 --- a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp +++ b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp @@ -19,14 +19,12 @@ /* ScriptData SDName: Stormwind_City SD%Complete: 100 -SDComment: Quest support: 1640, 1447, 4185, 11223, 434. +SDComment: Quest support: 1640, 1447, 434. SDCategory: Stormwind City EndScriptData */ /* ContentData -npc_archmage_malin npc_bartleby -npc_lady_katrana_prestor npc_tyrion npc_tyrion_spybot npc_marzon_silent_blade @@ -40,50 +38,13 @@ EndContentData */ #include "Player.h" /*###### -## npc_archmage_malin -######*/ - -#define GOSSIP_ITEM_MALIN "Can you send me to Theramore? I have an urgent message for Lady Jaina from Highlord Bolvar." - -class npc_archmage_malin : public CreatureScript -{ -public: - npc_archmage_malin() : CreatureScript("npc_archmage_malin") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - player->PlayerTalkClass->ClearMenus(); - if (action == GOSSIP_ACTION_INFO_DEF) - { - player->CLOSE_GOSSIP_MENU(); - creature->CastSpell(player, 42711, true); - } - - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (player->GetQuestStatus(11223) == QUEST_STATUS_COMPLETE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_MALIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - - player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); - - return true; - } -}; - -/*###### ## npc_bartleby ######*/ enum Bartleby { - FACTION_ENEMY = 168, - QUEST_BEAT = 1640 + FACTION_ENEMY = 168, + QUEST_BEAT = 1640 }; class npc_bartleby : public CreatureScript @@ -148,71 +109,18 @@ public: }; /*###### -## npc_lady_katrana_prestor -######*/ - -#define GOSSIP_ITEM_KAT_1 "Pardon the intrusion, Lady Prestor, but Highlord Bolvar suggested that I seek your advice." -#define GOSSIP_ITEM_KAT_2 "My apologies, Lady Prestor." -#define GOSSIP_ITEM_KAT_3 "Begging your pardon, Lady Prestor. That was not my intent." -#define GOSSIP_ITEM_KAT_4 "Thank you for your time, Lady Prestor." - -class npc_lady_katrana_prestor : public CreatureScript -{ -public: - npc_lady_katrana_prestor() : CreatureScript("npc_lady_katrana_prestor") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - player->PlayerTalkClass->ClearMenus(); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAT_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - player->SEND_GOSSIP_MENU(2694, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+1: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAT_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - player->SEND_GOSSIP_MENU(2695, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+2: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAT_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - player->SEND_GOSSIP_MENU(2696, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+3: - player->CLOSE_GOSSIP_MENU(); - player->AreaExploredOrEventHappens(4185); - break; - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (player->GetQuestStatus(4185) == QUEST_STATUS_INCOMPLETE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAT_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - - player->SEND_GOSSIP_MENU(2693, creature->GetGUID()); - - return true; - } -}; - -/*###### ## npc_lord_gregor_lescovar ######*/ enum LordGregorLescovar { - SAY_GUARD_2 = 0, - SAY_LESCOVAR_2 = 0, - SAY_LESCOVAR_3 = 1, - SAY_LESCOVAR_4 = 2, - SAY_MARZON_1 = 0, - SAY_MARZON_2 = 1, - SAY_TYRION_2 = 1, + SAY_GUARD_2 = 0, + SAY_LESCOVAR_2 = 0, + SAY_LESCOVAR_3 = 1, + SAY_LESCOVAR_4 = 2, + SAY_MARZON_1 = 0, + SAY_MARZON_2 = 1, + SAY_TYRION_2 = 1, NPC_STORMWIND_ROYAL = 1756, NPC_MARZON_BLADE = 1755, @@ -650,9 +558,7 @@ public: void AddSC_stormwind_city() { - new npc_archmage_malin(); new npc_bartleby(); - new npc_lady_katrana_prestor(); new npc_tyrion(); new npc_tyrion_spybot(); new npc_lord_gregor_lescovar(); diff --git a/src/server/scripts/EasternKingdoms/zone_undercity.cpp b/src/server/scripts/EasternKingdoms/zone_undercity.cpp index c0b4e06cfff..99556587e65 100644 --- a/src/server/scripts/EasternKingdoms/zone_undercity.cpp +++ b/src/server/scripts/EasternKingdoms/zone_undercity.cpp @@ -157,7 +157,7 @@ public: { if (Creature* target = ObjectAccessor::GetCreature(*summoned, targetGUID)) { - target->GetMotionMaster()->MoveJump(target->GetPositionX(), target->GetPositionY(), me->GetPositionZ() + 15.0f, 0); + target->GetMotionMaster()->MoveJump(target->GetPositionX(), target->GetPositionY(), me->GetPositionZ() + 15.0f, me->GetOrientation(), 0); target->SetPosition(target->GetPositionX(), target->GetPositionY(), me->GetPositionZ()+15.0f, 0.0f); summoned->CastSpell(target, SPELL_RIBBON_OF_SOULS, false); } diff --git a/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp index b1a00f35bb5..a01b93a140b 100644 --- a/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_western_plaguelands.cpp @@ -25,7 +25,6 @@ EndScriptData */ /* ContentData npcs_dithers_and_arbington -npc_myranda_the_hag npc_the_scourge_cauldron npc_andorhal_tower EndContentData */ @@ -33,7 +32,6 @@ EndContentData */ #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "ScriptedGossip.h" -#include "ScriptedEscortAI.h" #include "Player.h" #include "WorldSession.h" @@ -120,54 +118,6 @@ public: }; /*###### -## npc_myranda_the_hag -######*/ - -enum Myranda -{ - ILLUSION_GOSSIP = 4773, - QUEST_SUBTERFUGE = 5862, - QUEST_IN_DREAMS = 5944, - SPELL_SCARLET_ILLUSION = 17961 -}; - -class npc_myranda_the_hag : public CreatureScript -{ -public: - npc_myranda_the_hag() : CreatureScript("npc_myranda_the_hag") { } - - bool OnGossipSelect(Player* player, Creature* /*creature*/, uint32 /*sender*/, uint32 action) override - { - player->PlayerTalkClass->ClearMenus(); - if (action == GOSSIP_ACTION_INFO_DEF + 1) - { - player->CLOSE_GOSSIP_MENU(); - player->CastSpell(player, SPELL_SCARLET_ILLUSION, false); - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (player->GetQuestStatus(QUEST_SUBTERFUGE) == QUEST_STATUS_COMPLETE && - player->GetQuestStatus(QUEST_IN_DREAMS) != QUEST_STATUS_COMPLETE && - !player->HasAura(SPELL_SCARLET_ILLUSION)) - { - player->ADD_GOSSIP_ITEM_DB(Player::GetDefaultGossipMenuForSource(creature), 0, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - player->SEND_GOSSIP_MENU(ILLUSION_GOSSIP, creature->GetGUID()); - return true; - } - else - player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); - - return true; - } -}; - -/*###### ## npc_the_scourge_cauldron ######*/ @@ -195,7 +145,7 @@ public: me->DealDamage(me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); //override any database `spawntimesecs` to prevent duplicated summons uint32 rTime = me->GetRespawnDelay(); - if (rTime<600) + if (rTime < 600) me->SetRespawnDelay(600); } @@ -274,7 +224,6 @@ public: } void MoveInLineOfSight(Unit* who) override - { if (!who || who->GetTypeId() != TYPEID_PLAYER) return; @@ -286,14 +235,9 @@ public: }; }; -/*###### -## -######*/ - void AddSC_western_plaguelands() { new npcs_dithers_and_arbington(); - new npc_myranda_the_hag(); new npc_the_scourge_cauldron(); new npc_andorhal_tower(); } diff --git a/src/server/scripts/Events/CMakeLists.txt b/src/server/scripts/Events/CMakeLists.txt deleted file mode 100644 index 1c9e5cfe8e1..00000000000 --- a/src/server/scripts/Events/CMakeLists.txt +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> -# -# This file is free software; as a special exception the author gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -file(GLOB_RECURSE sources_Events Events/*.cpp Events/*.h) - -set(scripts_STAT_SRCS - ${scripts_STAT_SRCS} - ${sources_Events} -) - -message(" -> Prepared: Events") diff --git a/src/server/scripts/Events/events_script_loader.cpp b/src/server/scripts/Events/events_script_loader.cpp new file mode 100644 index 00000000000..625c08f5389 --- /dev/null +++ b/src/server/scripts/Events/events_script_loader.cpp @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +// This is where scripts' loading functions should be declared: +void AddSC_event_childrens_week(); + +// The name of this function should match: +// void Add${NameOfDirectory}Scripts() +void AddEventsScripts() +{ + AddSC_event_childrens_week(); +} diff --git a/src/server/scripts/Kalimdor/CMakeLists.txt b/src/server/scripts/Kalimdor/CMakeLists.txt deleted file mode 100644 index 2d1b4b49649..00000000000 --- a/src/server/scripts/Kalimdor/CMakeLists.txt +++ /dev/null @@ -1,121 +0,0 @@ -# Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> -# -# This file is free software; as a special exception the author gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -set(scripts_STAT_SRCS - ${scripts_STAT_SRCS} - Kalimdor/zone_stonetalon_mountains.cpp - Kalimdor/zone_silithus.cpp - Kalimdor/zone_moonglade.cpp - Kalimdor/RazorfenDowns/razorfen_downs.cpp - Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp - Kalimdor/RazorfenDowns/boss_tuten_kash.cpp - Kalimdor/RazorfenDowns/boss_mordresh_fire_eye.cpp - Kalimdor/RazorfenDowns/boss_glutton.cpp - Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp - Kalimdor/RazorfenDowns/razorfen_downs.h - Kalimdor/ZulFarrak/zulfarrak.cpp - Kalimdor/ZulFarrak/instance_zulfarrak.cpp - Kalimdor/ZulFarrak/boss_zum_rah.cpp - Kalimdor/ZulFarrak/zulfarrak.h - Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp - Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.h - Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp - Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp - Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/instance_old_hillsbrad.cpp - Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp - Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp - Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h - Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.h - Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp - Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp - Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp - Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp - Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp - Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp - Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.h - Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp - Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp - Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite_corruptor.cpp - Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp - Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp - Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp - Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp - Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp - Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp - Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h - Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.h - Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp - Kalimdor/CavernsOfTime/TheBlackMorass/boss_chrono_lord_deja.cpp - Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp - Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp - Kalimdor/CavernsOfTime/TheBlackMorass/boss_temporus.cpp - Kalimdor/BlackfathomDeeps/boss_kelris.cpp - Kalimdor/BlackfathomDeeps/instance_blackfathom_deeps.cpp - Kalimdor/BlackfathomDeeps/boss_gelihast.cpp - Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp - Kalimdor/BlackfathomDeeps/boss_aku_mai.cpp - Kalimdor/BlackfathomDeeps/blackfathom_deeps.h - Kalimdor/zone_azuremyst_isle.cpp - Kalimdor/zone_orgrimmar.cpp - Kalimdor/zone_desolace.cpp - Kalimdor/zone_feralas.cpp - Kalimdor/Maraudon/boss_princess_theradras.cpp - Kalimdor/Maraudon/boss_landslide.cpp - Kalimdor/Maraudon/boss_celebras_the_cursed.cpp - Kalimdor/Maraudon/boss_noxxion.cpp - Kalimdor/Maraudon/instance_maraudon.cpp - Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp - Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp - Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp - Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp - Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp - Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp - Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp - Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp - Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.h - Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp - Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp - Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp - Kalimdor/zone_darkshore.cpp - Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp - Kalimdor/RuinsOfAhnQiraj/instance_ruins_of_ahnqiraj.cpp - Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp - Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp - Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp - Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp - Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h - Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp - Kalimdor/zone_bloodmyst_isle.cpp - Kalimdor/zone_thunder_bluff.cpp - Kalimdor/zone_azshara.cpp - Kalimdor/RazorfenKraul/razorfen_kraul.h - Kalimdor/RazorfenKraul/instance_razorfen_kraul.cpp - Kalimdor/RazorfenKraul/razorfen_kraul.cpp - Kalimdor/zone_the_barrens.cpp - Kalimdor/zone_ungoro_crater.cpp - Kalimdor/WailingCaverns/wailing_caverns.h - Kalimdor/WailingCaverns/instance_wailing_caverns.cpp - Kalimdor/WailingCaverns/wailing_caverns.cpp - Kalimdor/zone_durotar.cpp - Kalimdor/zone_felwood.cpp - Kalimdor/boss_azuregos.cpp - Kalimdor/zone_tanaris.cpp - Kalimdor/zone_dustwallow_marsh.cpp - Kalimdor/zone_winterspring.cpp - Kalimdor/zone_thousand_needles.cpp - Kalimdor/zone_ashenvale.cpp - Kalimdor/OnyxiasLair/boss_onyxia.cpp - Kalimdor/OnyxiasLair/onyxias_lair.h - Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp - Kalimdor/RagefireChasm/instance_ragefire_chasm.cpp - Kalimdor/DireMaul/instance_dire_maul.cpp -) - -message(" -> Prepared: Kalimdor") diff --git a/src/server/scripts/Kalimdor/kalimdor_script_loader.cpp b/src/server/scripts/Kalimdor/kalimdor_script_loader.cpp new file mode 100644 index 00000000000..f1969a063d6 --- /dev/null +++ b/src/server/scripts/Kalimdor/kalimdor_script_loader.cpp @@ -0,0 +1,206 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +// This is where scripts' loading functions should be declared: +void AddSC_blackfathom_deeps(); //Blackfathom Depths +void AddSC_boss_gelihast(); +void AddSC_boss_kelris(); +void AddSC_boss_aku_mai(); +void AddSC_instance_blackfathom_deeps(); +void AddSC_hyjal(); //CoT Battle for Mt. Hyjal +void AddSC_boss_archimonde(); +void AddSC_instance_mount_hyjal(); +void AddSC_hyjal_trash(); +void AddSC_boss_rage_winterchill(); +void AddSC_boss_anetheron(); +void AddSC_boss_kazrogal(); +void AddSC_boss_azgalor(); +void AddSC_boss_captain_skarloc(); //CoT Old Hillsbrad +void AddSC_boss_epoch_hunter(); +void AddSC_boss_lieutenant_drake(); +void AddSC_instance_old_hillsbrad(); +void AddSC_old_hillsbrad(); +void AddSC_boss_aeonus(); //CoT The Black Morass +void AddSC_boss_chrono_lord_deja(); +void AddSC_boss_temporus(); +void AddSC_the_black_morass(); +void AddSC_instance_the_black_morass(); +void AddSC_boss_epoch(); //CoT Culling Of Stratholme +void AddSC_boss_infinite_corruptor(); +void AddSC_boss_salramm(); +void AddSC_boss_mal_ganis(); +void AddSC_boss_meathook(); +void AddSC_culling_of_stratholme(); +void AddSC_instance_culling_of_stratholme(); +void AddSC_instance_dire_maul(); //Dire Maul +void AddSC_boss_celebras_the_cursed(); //Maraudon +void AddSC_boss_landslide(); +void AddSC_boss_noxxion(); +void AddSC_boss_ptheradras(); +void AddSC_instance_maraudon(); +void AddSC_boss_onyxia(); //Onyxia's Lair +void AddSC_instance_onyxias_lair(); +void AddSC_boss_tuten_kash(); //Razorfen Downs +void AddSC_boss_mordresh_fire_eye(); +void AddSC_boss_glutton(); +void AddSC_boss_amnennar_the_coldbringer(); +void AddSC_razorfen_downs(); +void AddSC_instance_razorfen_downs(); +void AddSC_razorfen_kraul(); //Razorfen Kraul +void AddSC_instance_razorfen_kraul(); +void AddSC_boss_kurinnaxx(); //Ruins of ahn'qiraj +void AddSC_boss_rajaxx(); +void AddSC_boss_moam(); +void AddSC_boss_buru(); +void AddSC_boss_ayamiss(); +void AddSC_boss_ossirian(); +void AddSC_instance_ruins_of_ahnqiraj(); +void AddSC_boss_cthun(); //Temple of ahn'qiraj +void AddSC_boss_viscidus(); +void AddSC_boss_fankriss(); +void AddSC_boss_huhuran(); +void AddSC_bug_trio(); +void AddSC_boss_sartura(); +void AddSC_boss_skeram(); +void AddSC_boss_twinemperors(); +void AddSC_boss_ouro(); +void AddSC_npc_anubisath_sentinel(); +void AddSC_instance_temple_of_ahnqiraj(); +void AddSC_wailing_caverns(); //Wailing caverns +void AddSC_instance_wailing_caverns(); +void AddSC_boss_zum_rah(); //Zul'Farrak +void AddSC_zulfarrak(); +void AddSC_instance_zulfarrak(); + +void AddSC_ashenvale(); +void AddSC_azshara(); +void AddSC_azuremyst_isle(); +void AddSC_bloodmyst_isle(); +void AddSC_boss_azuregos(); +void AddSC_darkshore(); +void AddSC_desolace(); +void AddSC_durotar(); +void AddSC_dustwallow_marsh(); +void AddSC_felwood(); +void AddSC_feralas(); +void AddSC_moonglade(); +void AddSC_orgrimmar(); +void AddSC_silithus(); +void AddSC_stonetalon_mountains(); +void AddSC_tanaris(); +void AddSC_the_barrens(); +void AddSC_thousand_needles(); +void AddSC_thunder_bluff(); +void AddSC_ungoro_crater(); +void AddSC_winterspring(); + +// The name of this function should match: +// void Add${NameOfDirectory}Scripts() +void AddKalimdorScripts() +{ + AddSC_blackfathom_deeps(); //Blackfathom Depths + AddSC_boss_gelihast(); + AddSC_boss_kelris(); + AddSC_boss_aku_mai(); + AddSC_instance_blackfathom_deeps(); + AddSC_hyjal(); //CoT Battle for Mt. Hyjal + AddSC_boss_archimonde(); + AddSC_instance_mount_hyjal(); + AddSC_hyjal_trash(); + AddSC_boss_rage_winterchill(); + AddSC_boss_anetheron(); + AddSC_boss_kazrogal(); + AddSC_boss_azgalor(); + AddSC_boss_captain_skarloc(); //CoT Old Hillsbrad + AddSC_boss_epoch_hunter(); + AddSC_boss_lieutenant_drake(); + AddSC_instance_old_hillsbrad(); + AddSC_old_hillsbrad(); + AddSC_boss_aeonus(); //CoT The Black Morass + AddSC_boss_chrono_lord_deja(); + AddSC_boss_temporus(); + AddSC_the_black_morass(); + AddSC_instance_the_black_morass(); + AddSC_boss_epoch(); //CoT Culling Of Stratholme + AddSC_boss_infinite_corruptor(); + AddSC_boss_salramm(); + AddSC_boss_mal_ganis(); + AddSC_boss_meathook(); + AddSC_culling_of_stratholme(); + AddSC_instance_culling_of_stratholme(); + AddSC_instance_dire_maul(); //Dire Maul + AddSC_boss_celebras_the_cursed(); //Maraudon + AddSC_boss_landslide(); + AddSC_boss_noxxion(); + AddSC_boss_ptheradras(); + AddSC_instance_maraudon(); + AddSC_boss_onyxia(); //Onyxia's Lair + AddSC_instance_onyxias_lair(); + AddSC_boss_tuten_kash(); //Razorfen Downs + AddSC_boss_mordresh_fire_eye(); + AddSC_boss_glutton(); + AddSC_boss_amnennar_the_coldbringer(); + AddSC_razorfen_downs(); + AddSC_instance_razorfen_downs(); + AddSC_razorfen_kraul(); //Razorfen Kraul + AddSC_instance_razorfen_kraul(); + AddSC_boss_kurinnaxx(); //Ruins of ahn'qiraj + AddSC_boss_rajaxx(); + AddSC_boss_moam(); + AddSC_boss_buru(); + AddSC_boss_ayamiss(); + AddSC_boss_ossirian(); + AddSC_instance_ruins_of_ahnqiraj(); + AddSC_boss_cthun(); //Temple of ahn'qiraj + AddSC_boss_viscidus(); + AddSC_boss_fankriss(); + AddSC_boss_huhuran(); + AddSC_bug_trio(); + AddSC_boss_sartura(); + AddSC_boss_skeram(); + AddSC_boss_twinemperors(); + AddSC_boss_ouro(); + AddSC_npc_anubisath_sentinel(); + AddSC_instance_temple_of_ahnqiraj(); + AddSC_wailing_caverns(); //Wailing caverns + AddSC_instance_wailing_caverns(); + AddSC_boss_zum_rah(); //Zul'Farrak + AddSC_zulfarrak(); + AddSC_instance_zulfarrak(); + + AddSC_ashenvale(); + AddSC_azshara(); + AddSC_azuremyst_isle(); + AddSC_bloodmyst_isle(); + AddSC_boss_azuregos(); + AddSC_darkshore(); + AddSC_desolace(); + AddSC_durotar(); + AddSC_dustwallow_marsh(); + AddSC_felwood(); + AddSC_feralas(); + AddSC_moonglade(); + AddSC_orgrimmar(); + AddSC_silithus(); + AddSC_stonetalon_mountains(); + AddSC_tanaris(); + AddSC_the_barrens(); + AddSC_thousand_needles(); + AddSC_thunder_bluff(); + AddSC_ungoro_crater(); + AddSC_winterspring(); +} diff --git a/src/server/scripts/Northrend/CMakeLists.txt b/src/server/scripts/Northrend/CMakeLists.txt deleted file mode 100644 index 1dc453ad416..00000000000 --- a/src/server/scripts/Northrend/CMakeLists.txt +++ /dev/null @@ -1,199 +0,0 @@ -# Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> -# -# This file is free software; as a special exception the author gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -set(scripts_STAT_SRCS - ${scripts_STAT_SRCS} - Northrend/zone_wintergrasp.cpp - Northrend/isle_of_conquest.cpp - Northrend/zone_storm_peaks.cpp - Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp - Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp - Northrend/Ulduar/HallsOfLightning/halls_of_lightning.h - Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp - Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp - Northrend/Ulduar/HallsOfLightning/boss_loken.cpp - Northrend/Ulduar/Ulduar/boss_general_vezax.cpp - Northrend/Ulduar/Ulduar/boss_thorim.cpp - Northrend/Ulduar/Ulduar/boss_ignis.cpp - Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp - Northrend/Ulduar/Ulduar/instance_ulduar.cpp - Northrend/Ulduar/Ulduar/boss_auriaya.cpp - Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp - Northrend/Ulduar/Ulduar/boss_hodir.cpp - Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp - Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp - Northrend/Ulduar/Ulduar/boss_xt002.cpp - Northrend/Ulduar/Ulduar/boss_mimiron.cpp - Northrend/Ulduar/Ulduar/ulduar.h - Northrend/Ulduar/Ulduar/boss_freya.cpp - Northrend/Ulduar/Ulduar/boss_razorscale.cpp - Northrend/Ulduar/Ulduar/boss_kologarn.cpp - Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp - Northrend/Ulduar/HallsOfStone/halls_of_stone.h - Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp - Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp - Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp - Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp - Northrend/ChamberOfAspects/ObsidianSanctum/instance_obsidian_sanctum.cpp - Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.h - Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp - Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.cpp - Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp - Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h - Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.cpp - Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp - Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp - Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp - Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp - Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h - Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp - Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp - Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp - Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp - Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp - Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp - Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp - Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp - Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h - Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp - Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp - Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp - Northrend/FrozenHalls/ForgeOfSouls/instance_forge_of_souls.cpp - Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp - Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.h - Northrend/Nexus/EyeOfEternity/boss_malygos.cpp - Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp - Northrend/Nexus/EyeOfEternity/eye_of_eternity.h - Northrend/Nexus/Oculus/boss_eregos.cpp - Northrend/Nexus/Oculus/boss_drakos.cpp - Northrend/Nexus/Oculus/oculus.h - Northrend/Nexus/Oculus/boss_varos.cpp - Northrend/Nexus/Oculus/boss_urom.cpp - Northrend/Nexus/Oculus/oculus.cpp - Northrend/Nexus/Oculus/instance_oculus.cpp - Northrend/Nexus/Nexus/boss_nexus_commanders.cpp - Northrend/Nexus/Nexus/boss_ormorok.cpp - Northrend/Nexus/Nexus/boss_magus_telestra.cpp - Northrend/Nexus/Nexus/instance_nexus.cpp - Northrend/Nexus/Nexus/boss_keristrasza.cpp - Northrend/Nexus/Nexus/boss_anomalus.cpp - Northrend/Nexus/Nexus/nexus.h - Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp - Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp - Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp - Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h - Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp - Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp - Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp - Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp - Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.h - Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp - Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp - Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp - Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp - Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp - Northrend/Naxxramas/boss_loatheb.cpp - Northrend/Naxxramas/boss_anubrekhan.cpp - Northrend/Naxxramas/boss_maexxna.cpp - Northrend/Naxxramas/boss_patchwerk.cpp - Northrend/Naxxramas/boss_gothik.cpp - Northrend/Naxxramas/boss_faerlina.cpp - Northrend/Naxxramas/boss_gluth.cpp - Northrend/Naxxramas/boss_four_horsemen.cpp - Northrend/Naxxramas/naxxramas.h - Northrend/Naxxramas/boss_kelthuzad.cpp - Northrend/Naxxramas/boss_heigan.cpp - Northrend/Naxxramas/boss_thaddius.cpp - Northrend/Naxxramas/boss_razuvious.cpp - Northrend/Naxxramas/boss_sapphiron.cpp - Northrend/Naxxramas/instance_naxxramas.cpp - Northrend/Naxxramas/boss_grobbulus.cpp - Northrend/Naxxramas/boss_noth.cpp - Northrend/zone_crystalsong_forest.cpp - Northrend/VaultOfArchavon/boss_archavon.cpp - Northrend/VaultOfArchavon/boss_koralon.cpp - Northrend/VaultOfArchavon/vault_of_archavon.h - Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp - Northrend/VaultOfArchavon/boss_emalon.cpp - Northrend/VaultOfArchavon/boss_toravon.cpp - Northrend/zone_sholazar_basin.cpp - Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.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 - Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h - Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp - Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp - Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp - Northrend/zone_dragonblight.cpp - Northrend/zone_grizzly_hills.cpp - Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h - Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp - Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp - Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp - Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp - Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp - Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp - Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp - Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp - Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp - Northrend/AzjolNerub/Ahnkahet/boss_amanitar.cpp - Northrend/AzjolNerub/Ahnkahet/ahnkahet.h - Northrend/VioletHold/boss_zuramat.cpp - Northrend/VioletHold/instance_violet_hold.cpp - Northrend/VioletHold/boss_lavanthor.cpp - Northrend/VioletHold/boss_cyanigosa.cpp - Northrend/VioletHold/violet_hold.h - Northrend/VioletHold/boss_ichoron.cpp - Northrend/VioletHold/boss_moragg.cpp - Northrend/VioletHold/boss_xevozz.cpp - Northrend/VioletHold/boss_erekem.cpp - Northrend/VioletHold/violet_hold.cpp - Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp - Northrend/IcecrownCitadel/icecrown_citadel.cpp - Northrend/IcecrownCitadel/icecrown_citadel.h - Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp - Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp - Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp - Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp - Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp - Northrend/IcecrownCitadel/boss_festergut.cpp - Northrend/IcecrownCitadel/boss_rotface.cpp - Northrend/IcecrownCitadel/boss_professor_putricide.cpp - Northrend/IcecrownCitadel/boss_blood_prince_council.cpp - Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp - Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp - Northrend/IcecrownCitadel/boss_sindragosa.cpp - Northrend/IcecrownCitadel/boss_the_lich_king.cpp - Northrend/zone_zuldrak.cpp - Northrend/zone_icecrown.cpp - Northrend/Gundrak/boss_slad_ran.cpp - Northrend/Gundrak/instance_gundrak.cpp - Northrend/Gundrak/boss_drakkari_colossus.cpp - Northrend/Gundrak/gundrak.h - Northrend/Gundrak/boss_gal_darah.cpp - Northrend/Gundrak/boss_moorabi.cpp - Northrend/Gundrak/boss_eck.cpp - Northrend/zone_borean_tundra.cpp - Northrend/zone_howling_fjord.cpp - Northrend/zone_dalaran.cpp - Northrend/DraktharonKeep/boss_trollgore.cpp - Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp - Northrend/DraktharonKeep/boss_novos.cpp - Northrend/DraktharonKeep/drak_tharon_keep.h - Northrend/DraktharonKeep/boss_tharon_ja.cpp - Northrend/DraktharonKeep/boss_king_dred.cpp -) - -message(" -> Prepared: Northrend") diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp index fb5642c6f3b..84d7d92acfe 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp @@ -135,9 +135,9 @@ class boss_general_zarithrian : public CreatureScript Talk(SAY_KILL); } - bool CanAIAttack(Unit const* /*target*/) const override + bool CanAIAttack(Unit const* target) const override { - return (instance->GetBossState(DATA_SAVIANA_RAGEFIRE) == DONE && instance->GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE); + return (instance->GetBossState(DATA_SAVIANA_RAGEFIRE) == DONE && instance->GetBossState(DATA_BALTHARUS_THE_WARBORN) == DONE && BossAI::CanAIAttack(target)); } void UpdateAI(uint32 diff) override diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp index 1e860fb6ec5..6c1b516c7de 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp @@ -461,13 +461,13 @@ class boss_toc_champion_controller : public CreatureScript if (playerTeam == ALLIANCE) { temp->SetHomePosition(vChampionJumpTarget[pos].GetPositionX(), vChampionJumpTarget[pos].GetPositionY(), vChampionJumpTarget[pos].GetPositionZ(), 0); - temp->GetMotionMaster()->MoveJump(vChampionJumpTarget[pos].GetPositionX(), vChampionJumpTarget[pos].GetPositionY(), vChampionJumpTarget[pos].GetPositionZ(), 20.0f, 20.0f); + temp->GetMotionMaster()->MoveJump(vChampionJumpTarget[pos], 20.0f, 20.0f); temp->SetOrientation(0); } else { temp->SetHomePosition((ToCCommonLoc[1].GetPositionX()*2)-vChampionJumpTarget[pos].GetPositionX(), vChampionJumpTarget[pos].GetPositionY(), vChampionJumpTarget[pos].GetPositionZ(), 3); - temp->GetMotionMaster()->MoveJump((ToCCommonLoc[1].GetPositionX()*2)-vChampionJumpTarget[pos].GetPositionX(), vChampionJumpTarget[pos].GetPositionY(), vChampionJumpTarget[pos].GetPositionZ(), 20.0f, 20.0f); + temp->GetMotionMaster()->MoveJump((ToCCommonLoc[1].GetPositionX() * 2) - vChampionJumpTarget[pos].GetPositionX(), vChampionJumpTarget[pos].GetPositionY(), vChampionJumpTarget[pos].GetPositionZ(), vChampionJumpTarget[pos].GetOrientation(), 20.0f, 20.0f); temp->SetOrientation(3); } } 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 83daa6e35a2..e3720503d0a 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp @@ -390,7 +390,7 @@ class npc_snobold_vassal : public CreatureScript else if (Unit* target2 = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true)) { _targetGUID = target2->GetGUID(); - me->GetMotionMaster()->MoveJump(target2->GetPositionX(), target2->GetPositionY(), target2->GetPositionZ(), 15.0f, 15.0f); + me->GetMotionMaster()->MoveJump(*target2, 15.0f, 15.0f); } } } @@ -981,7 +981,7 @@ class boss_icehowl : public CreatureScript events.ScheduleEvent(EVENT_WHIRL, urand(15*IN_MILLISECONDS, 30*IN_MILLISECONDS)); return; case EVENT_MASSIVE_CRASH: - me->GetMotionMaster()->MoveJump(ToCCommonLoc[1].GetPositionX(), ToCCommonLoc[1].GetPositionY(), ToCCommonLoc[1].GetPositionZ(), 20.0f, 20.0f, 0); // 1: Middle of the room + me->GetMotionMaster()->MoveJump(ToCCommonLoc[1], 20.0f, 20.0f, 0); // 1: Middle of the room SetCombatMovement(false); me->AttackStop(); _stage = 7; //Invalid (Do nothing more than move) @@ -1034,7 +1034,7 @@ class boss_icehowl : public CreatureScript _trampleTargetY = target->GetPositionY(); _trampleTargetZ = target->GetPositionZ(); // 2: Hop Backwards - me->GetMotionMaster()->MoveJump(2*me->GetPositionX() - _trampleTargetX, 2*me->GetPositionY() - _trampleTargetY, me->GetPositionZ(), 30.0f, 20.0f, 0); + me->GetMotionMaster()->MoveJump(2*me->GetPositionX() - _trampleTargetX, 2*me->GetPositionY() - _trampleTargetY, me->GetPositionZ(), me->GetOrientation(), 30.0f, 20.0f, 0); _stage = 7; //Invalid (Do nothing more than move) } else diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp index 96bd0aaa35e..5410f403ab9 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp @@ -22,6 +22,7 @@ #include "pit_of_saron.h" #include "Vehicle.h" #include "Player.h" +#include "PlayerAI.h" enum Yells { @@ -438,9 +439,10 @@ class spell_tyrannus_overlord_brand : public SpellScriptLoader if (GetTarget()->GetTypeId() != TYPEID_PLAYER) return; - oldAI = GetTarget()->GetAI(); - oldAIState = GetTarget()->IsAIEnabled; - GetTarget()->SetAI(new player_overlord_brandAI(GetTarget()->ToPlayer(), GetCasterGUID())); + Player* pTarget = GetTarget()->ToPlayer(); + oldAI = pTarget->AI(); + oldAIState = pTarget->IsAIEnabled; + GetTarget()->SetAI(new player_overlord_brandAI(pTarget, GetCasterGUID())); GetTarget()->IsAIEnabled = true; } @@ -450,7 +452,7 @@ class spell_tyrannus_overlord_brand : public SpellScriptLoader return; GetTarget()->IsAIEnabled = oldAIState; - UnitAI* thisAI = GetTarget()->GetAI(); + PlayerAI* thisAI = GetTarget()->ToPlayer()->AI(); GetTarget()->SetAI(oldAI); delete thisAI; } @@ -461,7 +463,7 @@ class spell_tyrannus_overlord_brand : public SpellScriptLoader AfterEffectRemove += AuraEffectRemoveFn(spell_tyrannus_overlord_brand_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); } - UnitAI* oldAI; + PlayerAI* oldAI; bool oldAIState; }; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp index 7e9083115b8..3ea0de31764 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp @@ -598,7 +598,7 @@ class boss_deathbringer_saurfang : public CreatureScript if (target->GetTransport()) return false; - return true; + return BossAI::CanAIAttack(target); } static uint32 const FightWonValue; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp index 755bbd759e7..9fa624aaad3 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp @@ -285,6 +285,7 @@ enum Phases #define PHASE_TWO_THREE (events.IsInPhase(PHASE_TWO) ? PHASE_TWO : PHASE_THREE) Position const CenterPosition = {503.6282f, -2124.655f, 840.8569f, 0.0f}; +Position const TirionSpawn = {505.2118f, -2124.353f, 840.9403f, 3.141593f}; Position const TirionIntro = {489.2970f, -2124.840f, 840.8569f, 0.0f}; Position const TirionCharge = {482.9019f, -2124.479f, 840.8570f, 0.0f}; Position const LichKingIntro[3] = @@ -514,13 +515,33 @@ class boss_the_lich_king : public CreatureScript _vileSpiritExplosions = 0; } - void Reset() override + void InitializeAI() override + { + SetupEncounter(); + } + + void JustRespawned() override + { + SetupEncounter(); + } + + void SetupEncounter() { _Reset(); me->SetReactState(REACT_PASSIVE); events.SetPhase(PHASE_INTRO); Initialize(); SetEquipmentSlots(true); + + // Reset The Frozen Throne gameobjects + FrozenThroneResetWorker reset; + Trinity::GameObjectWorker<FrozenThroneResetWorker> worker(me, reset); + me->VisitNearbyGridObject(333.0f, worker); + + // Reset any light override + me->GetMap()->SetZoneOverrideLight(AREA_THE_FROZEN_THRONE, 0, 5000); + + me->SummonCreature(NPC_HIGHLORD_TIRION_FORDRING_LK, TirionSpawn, TEMPSUMMON_MANUAL_DESPAWN); } void JustDied(Unit* /*killer*/) override @@ -556,40 +577,21 @@ class boss_the_lich_king : public CreatureScript events.ScheduleEvent(EVENT_SHADOW_TRAP, 15500, 0, PHASE_ONE); } - void JustReachedHome() override - { - _JustReachedHome(); - instance->SetBossState(DATA_THE_LICH_KING, NOT_STARTED); - - // Reset The Frozen Throne gameobjects - FrozenThroneResetWorker reset; - Trinity::GameObjectWorker<FrozenThroneResetWorker> worker(me, reset); - me->VisitNearbyGridObject(333.0f, worker); - - // Restore Tirion's gossip only after The Lich King fully resets to prevent - // restarting the encounter while LK still runs back to spawn point - if (Creature* tirion = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_HIGHLORD_TIRION_FORDRING))) - tirion->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - - // Reset any light override - me->GetMap()->SetZoneOverrideLight(AREA_THE_FROZEN_THRONE, 0, 5000); - } - bool CanAIAttack(Unit const* target) const override { // The Lich King must not select targets in frostmourne room if he killed everyone outside - return !target->HasAura(SPELL_IN_FROSTMOURNE_ROOM); + return !target->HasAura(SPELL_IN_FROSTMOURNE_ROOM) && BossAI::CanAIAttack(target); } - void EnterEvadeMode(EvadeReason why) override + void EnterEvadeMode(EvadeReason /*why*/) override { - instance->SetBossState(DATA_THE_LICH_KING, FAIL); - BossAI::EnterEvadeMode(why); if (Creature* tirion = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_HIGHLORD_TIRION_FORDRING))) - tirion->AI()->EnterEvadeMode(); + tirion->DespawnOrUnsummon(); DoCastAOE(SPELL_KILL_FROSTMOURNE_PLAYERS); EntryCheckPredicate pred(NPC_STRANGULATE_VEHICLE); summons.DoAction(ACTION_TELEPORT_BACK, pred); + summons.DespawnAll(); + _DespawnAtEvade(); } void KilledUnit(Unit* victim) override @@ -770,6 +772,8 @@ class boss_the_lich_king : public CreatureScript case NPC_STRANGULATE_VEHICLE: summons.Summon(summon); return; + case NPC_HIGHLORD_TIRION_FORDRING_LK: + return; default: break; } @@ -1153,6 +1157,7 @@ class npc_tirion_fordring_tft : public CreatureScript _events.Reset(); if (_instance->GetBossState(DATA_THE_LICH_KING) == DONE) me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + me->LoadEquipment(1); } void MovementInform(uint32 type, uint32 id) override diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp index 81f1e071da0..be12894ebea 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp @@ -375,8 +375,12 @@ class boss_gothik : public CreatureScript _gateIsOpen = true; for (ObjectGuid summonGuid : summons) + { if (Creature* summon = ObjectAccessor::GetCreature(*me, summonGuid)) summon->AI()->DoAction(ACTION_GATE_OPENED); + if (summons.empty()) // ACTION_GATE_OPENED may cause an evade, despawning summons and invalidating our iterator + break; + } } void DamageTaken(Unit* /*who*/, uint32& damage) override diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp index 01c4704592f..98827fb3e00 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp @@ -334,7 +334,8 @@ class boss_flame_leviathan : public CreatureScript void SpellHit(Unit* /*caster*/, SpellInfo const* spell) override { if (spell->Id == SPELL_START_THE_ENGINE) - ASSERT_NOTNULL(me->GetVehicleKit())->InstallAllAccessories(false); + if (Vehicle* vehicleKit = me->GetVehicleKit()) + vehicleKit->InstallAllAccessories(false); if (spell->Id == SPELL_ELECTROSHOCK) me->InterruptSpell(CURRENT_CHANNELED_SPELL); @@ -1768,9 +1769,7 @@ class spell_vehicle_throw_passenger : public SpellScriptLoader else { passenger->ExitVehicle(); - float x, y, z; - targets.GetDstPos()->GetPosition(x, y, z); - passenger->GetMotionMaster()->MoveJump(x, y, z, targets.GetSpeedXY(), targets.GetSpeedZ()); + passenger->GetMotionMaster()->MoveJump(*targets.GetDstPos(), targets.GetSpeedXY(), targets.GetSpeedZ()); } } } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp index f435c669935..e694433c614 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp @@ -444,7 +444,7 @@ class boss_mimiron : public CreatureScript DoCastAOE(SPELL_DESPAWN_ASSAULT_BOTS); me->ExitVehicle(); // ExitVehicle() offset position is not implemented, so we make up for that with MoveJump()... - me->GetMotionMaster()->MoveJump(me->GetPositionX() + (10.f * std::cos(me->GetOrientation())), me->GetPositionY() + (10.f * std::sin(me->GetOrientation())), me->GetPositionZ(), 10.f, 5.f); + me->GetMotionMaster()->MoveJump(me->GetPositionX() + (10.f * std::cos(me->GetOrientation())), me->GetPositionY() + (10.f * std::sin(me->GetOrientation())), me->GetPositionZ(), me->GetOrientation(), 10.f, 5.f); events.ScheduleEvent(EVENT_OUTTRO_1, 7000); } diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp index 77b376bf7d5..d7b65093898 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp @@ -238,7 +238,7 @@ public: me->SetInCombatWithZone(); instance->SetBossState(DATA_SKADI_THE_RUTHLESS, IN_PROGRESS); instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); - me->GetMotionMaster()->MoveJump(Location[0].GetPositionX(), Location[0].GetPositionY(), Location[0].GetPositionZ(), 5.0f, 10.0f); + me->GetMotionMaster()->MoveJump(Location[0], 5.0f, 10.0f); me->SetWalk(false); m_uiMountTimer = 1000; Summons.DespawnEntry(NPC_GRAUF); @@ -289,7 +289,7 @@ public: pGrauf->GetMotionMaster()->MoveFall(); pGrauf->HandleEmoteCommand(EMOTE_ONESHOT_FLYDEATH); } - me->GetMotionMaster()->MoveJump(Location[4].GetPositionX(), Location[4].GetPositionY(), Location[4].GetPositionZ(), 5.0f, 10.0f); + me->GetMotionMaster()->MoveJump(Location[4], 5.0f, 10.0f); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE); Talk(SAY_DRAKE_DEATH); m_uiCrushTimer = 8000; diff --git a/src/server/scripts/Northrend/isle_of_conquest.cpp b/src/server/scripts/Northrend/isle_of_conquest.cpp index 14d862eca39..68121e940c9 100644 --- a/src/server/scripts/Northrend/isle_of_conquest.cpp +++ b/src/server/scripts/Northrend/isle_of_conquest.cpp @@ -206,7 +206,7 @@ class spell_ioc_parachute_ic : public SpellScriptLoader class StartLaunchEvent : public BasicEvent { public: - StartLaunchEvent(float x, float y, float z, ObjectGuid::LowType lowGuid) : _x(x), _y(y), _z(z), _lowGuid(lowGuid) + StartLaunchEvent(Position const& pos, ObjectGuid::LowType lowGuid) : _pos(pos), _lowGuid(lowGuid) { } @@ -218,15 +218,15 @@ class StartLaunchEvent : public BasicEvent player->AddAura(SPELL_LAUNCH_NO_FALLING_DAMAGE, player); // prevents falling damage float speedZ = 10.0f; - float dist = player->GetExactDist2d(_x, _y); + float dist = player->GetExactDist2d(&_pos); player->ExitVehicle(); - player->GetMotionMaster()->MoveJump(_x, _y, _z, dist, speedZ); + player->GetMotionMaster()->MoveJump(_pos, dist, speedZ, EVENT_JUMP, true); return true; } private: - float _x, _y, _z; + Position _pos; ObjectGuid::LowType _lowGuid; }; @@ -244,11 +244,7 @@ class spell_ioc_launch : public SpellScriptLoader if (!GetCaster()->ToCreature() || !GetExplTargetDest()) return; - float x, y, z; - x = GetExplTargetDest()->GetPositionX(); - y = GetExplTargetDest()->GetPositionY(); - z = GetExplTargetDest()->GetPositionZ(); - GetCaster()->ToCreature()->m_Events.AddEvent(new StartLaunchEvent(x, y, z, GetHitPlayer()->GetGUID().GetCounter()), GetCaster()->ToCreature()->m_Events.CalculateTime(2500)); + GetCaster()->ToCreature()->m_Events.AddEvent(new StartLaunchEvent(*GetExplTargetDest(), GetHitPlayer()->GetGUID().GetCounter()), GetCaster()->ToCreature()->m_Events.CalculateTime(2500)); } void Register() override diff --git a/src/server/scripts/Northrend/northrend_script_loader.cpp b/src/server/scripts/Northrend/northrend_script_loader.cpp new file mode 100644 index 00000000000..7d104b85f6d --- /dev/null +++ b/src/server/scripts/Northrend/northrend_script_loader.cpp @@ -0,0 +1,374 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +// This is where scripts' loading functions should be declared: +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(); + +// Azjol-Nerub - Azjol-Nerub +void AddSC_boss_krik_thir(); +void AddSC_boss_hadronox(); +void AddSC_boss_anub_arak(); +void AddSC_instance_azjol_nerub(); + +// 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_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(); +void AddSC_instance_trial_of_the_champion(); +void AddSC_trial_of_the_champion(); +void AddSC_boss_anubarak_trial(); //Trial of the Crusader +void AddSC_boss_faction_champions(); +void AddSC_boss_jaraxxus(); +void AddSC_boss_northrend_beasts(); +void AddSC_boss_twin_valkyr(); +void AddSC_trial_of_the_crusader(); +void AddSC_instance_trial_of_the_crusader(); +void AddSC_boss_anubrekhan(); //Naxxramas +void AddSC_boss_maexxna(); +void AddSC_boss_patchwerk(); +void AddSC_boss_grobbulus(); +void AddSC_boss_razuvious(); +void AddSC_boss_kelthuzad(); +void AddSC_boss_loatheb(); +void AddSC_boss_noth(); +void AddSC_boss_gluth(); +void AddSC_boss_sapphiron(); +void AddSC_boss_four_horsemen(); +void AddSC_boss_faerlina(); +void AddSC_boss_heigan(); +void AddSC_boss_gothik(); +void AddSC_boss_thaddius(); +void AddSC_instance_naxxramas(); +void AddSC_boss_nexus_commanders(); // The Nexus Nexus +void AddSC_boss_magus_telestra(); +void AddSC_boss_anomalus(); +void AddSC_boss_ormorok(); +void AddSC_boss_keristrasza(); +void AddSC_instance_nexus(); +void AddSC_boss_drakos(); //The Nexus The Oculus +void AddSC_boss_urom(); +void AddSC_boss_varos(); +void AddSC_boss_eregos(); +void AddSC_instance_oculus(); +void AddSC_oculus(); +void AddSC_boss_malygos(); // The Nexus: Eye of Eternity +void AddSC_instance_eye_of_eternity(); +void AddSC_boss_sartharion(); //Obsidian Sanctum +void AddSC_obsidian_sanctum(); +void AddSC_instance_obsidian_sanctum(); +void AddSC_boss_bjarngrim(); //Ulduar Halls of Lightning +void AddSC_boss_loken(); +void AddSC_boss_ionar(); +void AddSC_boss_volkhan(); +void AddSC_instance_halls_of_lightning(); +void AddSC_boss_maiden_of_grief(); //Ulduar Halls of Stone +void AddSC_boss_krystallus(); +void AddSC_boss_sjonnir(); +void AddSC_instance_halls_of_stone(); +void AddSC_halls_of_stone(); +void AddSC_boss_auriaya(); //Ulduar Ulduar +void AddSC_boss_flame_leviathan(); +void AddSC_boss_ignis(); +void AddSC_boss_razorscale(); +void AddSC_boss_xt002(); +void AddSC_boss_kologarn(); +void AddSC_boss_assembly_of_iron(); +void AddSC_boss_general_vezax(); +void AddSC_boss_mimiron(); +void AddSC_boss_hodir(); +void AddSC_boss_freya(); +void AddSC_boss_yogg_saron(); +void AddSC_boss_algalon_the_observer(); +void AddSC_instance_ulduar(); + +// 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_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(); + +// Vault of Archavon +void AddSC_boss_archavon(); +void AddSC_boss_emalon(); +void AddSC_boss_koralon(); +void AddSC_boss_toravon(); +void AddSC_instance_vault_of_archavon(); + +void AddSC_boss_cyanigosa(); //Violet Hold +void AddSC_boss_erekem(); +void AddSC_boss_ichoron(); +void AddSC_boss_lavanthor(); +void AddSC_boss_moragg(); +void AddSC_boss_xevozz(); +void AddSC_boss_zuramat(); +void AddSC_instance_violet_hold(); +void AddSC_violet_hold(); +void AddSC_instance_forge_of_souls(); //Forge of Souls +void AddSC_forge_of_souls(); +void AddSC_boss_bronjahm(); +void AddSC_boss_devourer_of_souls(); +void AddSC_instance_pit_of_saron(); //Pit of Saron +void AddSC_pit_of_saron(); +void AddSC_boss_garfrost(); +void AddSC_boss_ick(); +void AddSC_boss_tyrannus(); +void AddSC_instance_halls_of_reflection(); // Halls of Reflection +void AddSC_halls_of_reflection(); +void AddSC_boss_falric(); +void AddSC_boss_marwyn(); +void AddSC_boss_lord_marrowgar(); // Icecrown Citadel +void AddSC_boss_lady_deathwhisper(); +void AddSC_boss_icecrown_gunship_battle(); +void AddSC_boss_deathbringer_saurfang(); +void AddSC_boss_festergut(); +void AddSC_boss_rotface(); +void AddSC_boss_professor_putricide(); +void AddSC_boss_blood_prince_council(); +void AddSC_boss_blood_queen_lana_thel(); +void AddSC_boss_valithria_dreamwalker(); +void AddSC_boss_sindragosa(); +void AddSC_boss_the_lich_king(); +void AddSC_icecrown_citadel_teleport(); +void AddSC_instance_icecrown_citadel(); +void AddSC_icecrown_citadel(); +void AddSC_instance_ruby_sanctum(); // Ruby Sanctum +void AddSC_ruby_sanctum(); +void AddSC_boss_baltharus_the_warborn(); +void AddSC_boss_saviana_ragefire(); +void AddSC_boss_general_zarithrian(); +void AddSC_boss_halion(); + +void AddSC_dalaran(); +void AddSC_borean_tundra(); +void AddSC_dragonblight(); +void AddSC_grizzly_hills(); +void AddSC_howling_fjord(); +void AddSC_icecrown(); +void AddSC_sholazar_basin(); +void AddSC_storm_peaks(); +void AddSC_wintergrasp(); +void AddSC_zuldrak(); +void AddSC_crystalsong_forest(); +void AddSC_isle_of_conquest(); + +// The name of this function should match: +// void Add${NameOfDirectory}Scripts() +void AddNorthrendScripts() +{ + AddSC_boss_slad_ran(); //Gundrak + AddSC_boss_moorabi(); + AddSC_boss_drakkari_colossus(); + AddSC_boss_gal_darah(); + AddSC_boss_eck(); + AddSC_instance_gundrak(); + + // 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(); + AddSC_instance_trial_of_the_champion(); + AddSC_trial_of_the_champion(); + AddSC_boss_anubarak_trial(); //Trial of the Crusader + AddSC_boss_faction_champions(); + AddSC_boss_jaraxxus(); + AddSC_trial_of_the_crusader(); + AddSC_boss_twin_valkyr(); + AddSC_boss_northrend_beasts(); + AddSC_instance_trial_of_the_crusader(); + AddSC_boss_anubrekhan(); //Naxxramas + AddSC_boss_maexxna(); + AddSC_boss_patchwerk(); + AddSC_boss_grobbulus(); + AddSC_boss_razuvious(); + AddSC_boss_kelthuzad(); + AddSC_boss_loatheb(); + AddSC_boss_noth(); + AddSC_boss_gluth(); + AddSC_boss_sapphiron(); + AddSC_boss_four_horsemen(); + AddSC_boss_faerlina(); + AddSC_boss_heigan(); + AddSC_boss_gothik(); + AddSC_boss_thaddius(); + AddSC_instance_naxxramas(); + AddSC_boss_nexus_commanders(); // The Nexus Nexus + AddSC_boss_magus_telestra(); + AddSC_boss_anomalus(); + AddSC_boss_ormorok(); + AddSC_boss_keristrasza(); + AddSC_instance_nexus(); + AddSC_boss_drakos(); //The Nexus The Oculus + AddSC_boss_urom(); + AddSC_boss_varos(); + AddSC_boss_eregos(); + AddSC_instance_oculus(); + AddSC_oculus(); + AddSC_boss_malygos(); // The Nexus: Eye of Eternity + AddSC_instance_eye_of_eternity(); + AddSC_boss_sartharion(); //Obsidian Sanctum + AddSC_obsidian_sanctum(); + AddSC_instance_obsidian_sanctum(); + AddSC_boss_bjarngrim(); //Ulduar Halls of Lightning + AddSC_boss_loken(); + AddSC_boss_ionar(); + AddSC_boss_volkhan(); + AddSC_instance_halls_of_lightning(); + AddSC_boss_maiden_of_grief(); //Ulduar Halls of Stone + AddSC_boss_krystallus(); + AddSC_boss_sjonnir(); + AddSC_instance_halls_of_stone(); + AddSC_halls_of_stone(); + AddSC_boss_auriaya(); //Ulduar Ulduar + AddSC_boss_flame_leviathan(); + AddSC_boss_ignis(); + AddSC_boss_razorscale(); + AddSC_boss_xt002(); + AddSC_boss_general_vezax(); + AddSC_boss_assembly_of_iron(); + AddSC_boss_kologarn(); + AddSC_boss_mimiron(); + AddSC_boss_hodir(); + AddSC_boss_freya(); + AddSC_boss_yogg_saron(); + AddSC_boss_algalon_the_observer(); + AddSC_instance_ulduar(); + + // Utgarde Keep - Utgarde Keep + AddSC_boss_keleseth(); + AddSC_boss_skarvald_dalronn(); + AddSC_boss_ingvar_the_plunderer(); + AddSC_instance_utgarde_keep(); + AddSC_utgarde_keep(); + + // Utgarde Keep - Utgarde Pinnacle + AddSC_boss_svala(); + AddSC_boss_palehoof(); + AddSC_boss_skadi(); + AddSC_boss_ymiron(); + AddSC_instance_utgarde_pinnacle(); + + // Vault of Archavon + AddSC_boss_archavon(); + AddSC_boss_emalon(); + AddSC_boss_koralon(); + AddSC_boss_toravon(); + AddSC_instance_vault_of_archavon(); + + AddSC_boss_cyanigosa(); //Violet Hold + AddSC_boss_erekem(); + AddSC_boss_ichoron(); + AddSC_boss_lavanthor(); + AddSC_boss_moragg(); + AddSC_boss_xevozz(); + AddSC_boss_zuramat(); + AddSC_instance_violet_hold(); + AddSC_violet_hold(); + AddSC_instance_forge_of_souls(); //Forge of Souls + AddSC_forge_of_souls(); + AddSC_boss_bronjahm(); + AddSC_boss_devourer_of_souls(); + AddSC_instance_pit_of_saron(); //Pit of Saron + AddSC_pit_of_saron(); + AddSC_boss_garfrost(); + AddSC_boss_ick(); + AddSC_boss_tyrannus(); + AddSC_instance_halls_of_reflection(); // Halls of Reflection + AddSC_halls_of_reflection(); + AddSC_boss_falric(); + AddSC_boss_marwyn(); + AddSC_boss_lord_marrowgar(); // Icecrown Citadel + AddSC_boss_lady_deathwhisper(); + AddSC_boss_icecrown_gunship_battle(); + AddSC_boss_deathbringer_saurfang(); + AddSC_boss_festergut(); + AddSC_boss_rotface(); + AddSC_boss_professor_putricide(); + AddSC_boss_blood_prince_council(); + AddSC_boss_blood_queen_lana_thel(); + AddSC_boss_valithria_dreamwalker(); + AddSC_boss_sindragosa(); + AddSC_boss_the_lich_king(); + AddSC_icecrown_citadel_teleport(); + AddSC_instance_icecrown_citadel(); + AddSC_icecrown_citadel(); + AddSC_instance_ruby_sanctum(); // Ruby Sanctum + AddSC_ruby_sanctum(); + AddSC_boss_baltharus_the_warborn(); + AddSC_boss_saviana_ragefire(); + AddSC_boss_general_zarithrian(); + AddSC_boss_halion(); + + AddSC_dalaran(); + AddSC_borean_tundra(); + AddSC_dragonblight(); + AddSC_grizzly_hills(); + AddSC_howling_fjord(); + AddSC_icecrown(); + AddSC_sholazar_basin(); + AddSC_storm_peaks(); + AddSC_wintergrasp(); + AddSC_zuldrak(); + AddSC_crystalsong_forest(); + AddSC_isle_of_conquest(); +} diff --git a/src/server/scripts/OutdoorPvP/CMakeLists.txt b/src/server/scripts/OutdoorPvP/CMakeLists.txt deleted file mode 100644 index 91ce4ce4186..00000000000 --- a/src/server/scripts/OutdoorPvP/CMakeLists.txt +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> -# -# This file is free software; as a special exception the author gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -set(scripts_STAT_SRCS - ${scripts_STAT_SRCS} - OutdoorPvP/OutdoorPvPTF.cpp - OutdoorPvP/OutdoorPvPSI.cpp - OutdoorPvP/OutdoorPvPSI.h - OutdoorPvP/OutdoorPvPZM.cpp - OutdoorPvP/OutdoorPvPNA.cpp - OutdoorPvP/OutdoorPvPHP.cpp - OutdoorPvP/OutdoorPvPTF.h - OutdoorPvP/OutdoorPvPEP.h - OutdoorPvP/OutdoorPvPEP.cpp - OutdoorPvP/OutdoorPvPHP.h - OutdoorPvP/OutdoorPvPZM.h - OutdoorPvP/OutdoorPvPNA.h -) - -message(" -> Prepared: Outdoor PVP Zones") diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPScriptLoader.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPScriptLoader.cpp new file mode 100644 index 00000000000..ebf29910046 --- /dev/null +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPScriptLoader.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +// This is where scripts' loading functions should be declared: +void AddSC_outdoorpvp_ep(); +void AddSC_outdoorpvp_hp(); +void AddSC_outdoorpvp_na(); +void AddSC_outdoorpvp_si(); +void AddSC_outdoorpvp_tf(); +void AddSC_outdoorpvp_zm(); + +// The name of this function should match: +// void Add${NameOfDirectory}Scripts() +void AddOutdoorPvPScripts() +{ + AddSC_outdoorpvp_ep(); + AddSC_outdoorpvp_hp(); + AddSC_outdoorpvp_na(); + AddSC_outdoorpvp_si(); + AddSC_outdoorpvp_tf(); + AddSC_outdoorpvp_zm(); +} diff --git a/src/server/scripts/Outland/CMakeLists.txt b/src/server/scripts/Outland/CMakeLists.txt deleted file mode 100644 index 55b0452fb0b..00000000000 --- a/src/server/scripts/Outland/CMakeLists.txt +++ /dev/null @@ -1,128 +0,0 @@ -# Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> -# -# This file is free software; as a special exception the author gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -set(scripts_STAT_SRCS - ${scripts_STAT_SRCS} - Outland/zone_nagrand.cpp - Outland/HellfireCitadel/MagtheridonsLair/magtheridons_lair.h - Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp - Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp - Outland/HellfireCitadel/HellfireRamparts/instance_hellfire_ramparts.cpp - Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp - Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp - Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp - Outland/HellfireCitadel/HellfireRamparts/hellfire_ramparts.h - Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp - Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp - Outland/HellfireCitadel/BloodFurnace/blood_furnace.h - Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp - Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp - Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h - Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp - Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp - Outland/HellfireCitadel/ShatteredHalls/shattered_halls.cpp - Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp - Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp - Outland/CoilfangReservoir/SteamVault/boss_mekgineer_steamrigger.cpp - Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp - Outland/CoilfangReservoir/SteamVault/boss_hydromancer_thespia.cpp - Outland/CoilfangReservoir/SteamVault/boss_warlord_kalithresh.cpp - Outland/CoilfangReservoir/SteamVault/steam_vault.h - Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp - Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp - Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp - Outland/CoilfangReservoir/SerpentShrine/serpent_shrine.h - Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp - Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp - Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp - Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp - Outland/CoilfangReservoir/TheSlavePens/instance_the_slave_pens.cpp - Outland/CoilfangReservoir/TheSlavePens/the_slave_pens.h - Outland/CoilfangReservoir/TheSlavePens/boss_mennu_the_betrayer.cpp - Outland/CoilfangReservoir/TheSlavePens/boss_rokmar_the_crackler.cpp - Outland/CoilfangReservoir/TheSlavePens/boss_quagmirran.cpp - Outland/CoilfangReservoir/TheUnderbog/instance_the_underbog.cpp - Outland/CoilfangReservoir/TheUnderbog/boss_hungarfen.cpp - Outland/CoilfangReservoir/TheUnderbog/boss_the_black_stalker.cpp - Outland/zone_shattrath_city.cpp - Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp - Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp - Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp - Outland/TempestKeep/Mechanar/mechanar.h - Outland/TempestKeep/Mechanar/boss_gatewatcher_gyrokill.cpp - Outland/TempestKeep/Mechanar/instance_mechanar.cpp - Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp - Outland/TempestKeep/Eye/the_eye.h - Outland/TempestKeep/Eye/instance_the_eye.cpp - Outland/TempestKeep/Eye/boss_void_reaver.cpp - Outland/TempestKeep/Eye/boss_astromancer.cpp - Outland/TempestKeep/Eye/boss_alar.cpp - Outland/TempestKeep/Eye/boss_kaelthas.cpp - Outland/TempestKeep/Eye/the_eye.cpp - Outland/TempestKeep/botanica/the_botanica.h - Outland/TempestKeep/botanica/instance_the_botanica.cpp - Outland/TempestKeep/botanica/boss_commander_sarannis.cpp - Outland/TempestKeep/botanica/boss_thorngrin_the_tender.cpp - Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp - Outland/TempestKeep/botanica/boss_warp_splinter.cpp - Outland/TempestKeep/botanica/boss_laj.cpp - Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp - Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp - Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp - Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp - Outland/TempestKeep/arcatraz/instance_arcatraz.cpp - Outland/TempestKeep/arcatraz/arcatraz.h - Outland/TempestKeep/arcatraz/arcatraz.cpp - Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp - Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp - Outland/Auchindoun/AuchenaiCrypts/instance_auchenai_crypts.cpp - Outland/Auchindoun/AuchenaiCrypts/auchenai_crypts.h - Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp - Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp - Outland/Auchindoun/ManaTombs/instance_mana_tombs.cpp - Outland/Auchindoun/ManaTombs/mana_tombs.h - Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp - Outland/Auchindoun/SethekkHalls/boss_talon_king_ikiss.cpp - Outland/Auchindoun/SethekkHalls/boss_anzu.cpp - Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp - Outland/Auchindoun/SethekkHalls/sethekk_halls.h - Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp - Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp - Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp - Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp - Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp - Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.h - Outland/boss_doomwalker.cpp - Outland/zone_terokkar_forest.cpp - Outland/zone_hellfire_peninsula.cpp - Outland/boss_doomlord_kazzak.cpp - Outland/BlackTemple/boss_teron_gorefiend.cpp - Outland/BlackTemple/black_temple.h - Outland/BlackTemple/illidari_council.cpp - Outland/BlackTemple/boss_shade_of_akama.cpp - Outland/BlackTemple/boss_supremus.cpp - Outland/BlackTemple/black_temple.cpp - Outland/BlackTemple/boss_mother_shahraz.cpp - Outland/BlackTemple/instance_black_temple.cpp - Outland/BlackTemple/boss_reliquary_of_souls.cpp - Outland/BlackTemple/boss_warlord_najentus.cpp - Outland/BlackTemple/boss_gurtogg_bloodboil.cpp - Outland/BlackTemple/boss_illidan.cpp - Outland/zone_shadowmoon_valley.cpp - Outland/zone_blades_edge_mountains.cpp - Outland/GruulsLair/boss_high_king_maulgar.cpp - Outland/GruulsLair/boss_gruul.cpp - Outland/GruulsLair/gruuls_lair.h - Outland/GruulsLair/instance_gruuls_lair.cpp - Outland/zone_netherstorm.cpp - Outland/zone_zangarmarsh.cpp -) - -message(" -> Prepared: Outland") diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp index e5812390bd2..be27932e6b4 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp @@ -144,6 +144,7 @@ enum Spells // Thaladred the Darkener spells SPELL_PSYCHIC_BLOW = 10689, SPELL_SILENCE = 30225, + SPELL_REND = 36965, // Lord Sanguinar spells SPELL_BELLOWING_ROAR = 40636, // Grand Astromancer Capernian spells @@ -881,11 +882,13 @@ class boss_thaladred_the_darkener : public CreatureScript { Gaze_Timer = 100; Silence_Timer = 20000; + Rend_Timer = 4000; PsychicBlow_Timer = 10000; } uint32 Gaze_Timer; uint32 Silence_Timer; + uint32 Rend_Timer; uint32 PsychicBlow_Timer; void Reset() override @@ -939,6 +942,15 @@ class boss_thaladred_the_darkener : public CreatureScript else Silence_Timer -= diff; + //Rend_Timer + if (Rend_Timer <= diff) + { + DoCastVictim(SPELL_REND); + Rend_Timer = 4000; + } + else + Rend_Timer -= diff; + //PsychicBlow_Timer if (PsychicBlow_Timer <= diff) { diff --git a/src/server/scripts/Outland/outland_script_loader.cpp b/src/server/scripts/Outland/outland_script_loader.cpp new file mode 100644 index 00000000000..91ba4e5689f --- /dev/null +++ b/src/server/scripts/Outland/outland_script_loader.cpp @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +// This is where scripts' loading functions should be declared: +// Auchindoun - Auchenai Crypts +void AddSC_boss_shirrak_the_dead_watcher(); +void AddSC_boss_exarch_maladaar(); +void AddSC_instance_auchenai_crypts(); + +// Auchindoun - Mana Tombs +void AddSC_boss_pandemonius(); +void AddSC_boss_nexusprince_shaffar(); +void AddSC_instance_mana_tombs(); + +// Auchindoun - Sekketh Halls +void AddSC_boss_darkweaver_syth(); +void AddSC_boss_talon_king_ikiss(); +void AddSC_boss_anzu(); +void AddSC_instance_sethekk_halls(); + +// Auchindoun - Shadow Labyrinth +void AddSC_boss_ambassador_hellmaw(); +void AddSC_boss_blackheart_the_inciter(); +void AddSC_boss_grandmaster_vorpil(); +void AddSC_boss_murmur(); +void AddSC_instance_shadow_labyrinth(); + +// Black Temple +void AddSC_black_temple(); +void AddSC_boss_illidan(); +void AddSC_boss_shade_of_akama(); +void AddSC_boss_supremus(); +void AddSC_boss_gurtogg_bloodboil(); +void AddSC_boss_mother_shahraz(); +void AddSC_boss_reliquary_of_souls(); +void AddSC_boss_teron_gorefiend(); +void AddSC_boss_najentus(); +void AddSC_boss_illidari_council(); +void AddSC_instance_black_temple(); + +// Coilfang Reservoir - Serpent Shrine Cavern +void AddSC_boss_fathomlord_karathress(); +void AddSC_boss_hydross_the_unstable(); +void AddSC_boss_lady_vashj(); +void AddSC_boss_leotheras_the_blind(); +void AddSC_boss_morogrim_tidewalker(); +void AddSC_instance_serpentshrine_cavern(); +void AddSC_boss_the_lurker_below(); + +// Coilfang Reservoir - The Steam Vault +void AddSC_boss_hydromancer_thespia(); +void AddSC_boss_mekgineer_steamrigger(); +void AddSC_boss_warlord_kalithresh(); +void AddSC_instance_steam_vault(); + +// Coilfang Reservoir - The Slave Pens +void AddSC_instance_the_slave_pens(); +void AddSC_boss_mennu_the_betrayer(); +void AddSC_boss_rokmar_the_crackler(); +void AddSC_boss_quagmirran(); + +// Coilfang Reservoir - The Underbog +void AddSC_instance_the_underbog(); +void AddSC_boss_hungarfen(); +void AddSC_boss_the_black_stalker(); + +// Gruul's Lair +void AddSC_boss_gruul(); +void AddSC_boss_high_king_maulgar(); +void AddSC_instance_gruuls_lair(); +void AddSC_boss_broggok(); //HC Blood Furnace +void AddSC_boss_kelidan_the_breaker(); +void AddSC_boss_the_maker(); +void AddSC_instance_blood_furnace(); +void AddSC_boss_magtheridon(); //HC Magtheridon's Lair +void AddSC_instance_magtheridons_lair(); +void AddSC_boss_grand_warlock_nethekurse(); //HC Shattered Halls +void AddSC_boss_warbringer_omrogg(); +void AddSC_boss_warchief_kargath_bladefist(); +void AddSC_shattered_halls(); +void AddSC_instance_shattered_halls(); +void AddSC_boss_watchkeeper_gargolmar(); //HC Ramparts +void AddSC_boss_omor_the_unscarred(); +void AddSC_boss_vazruden_the_herald(); +void AddSC_instance_ramparts(); +void AddSC_arcatraz(); //TK Arcatraz +void AddSC_boss_zereketh_the_unbound(); +void AddSC_boss_dalliah_the_doomsayer(); +void AddSC_boss_wrath_scryer_soccothrates(); +void AddSC_boss_harbinger_skyriss(); +void AddSC_instance_arcatraz(); +void AddSC_boss_high_botanist_freywinn(); //TK Botanica +void AddSC_boss_laj(); +void AddSC_boss_warp_splinter(); +void AddSC_boss_thorngrin_the_tender(); +void AddSC_boss_commander_sarannis(); +void AddSC_instance_the_botanica(); +void AddSC_boss_alar(); //TK The Eye +void AddSC_boss_kaelthas(); +void AddSC_boss_void_reaver(); +void AddSC_boss_high_astromancer_solarian(); +void AddSC_instance_the_eye(); +void AddSC_the_eye(); +void AddSC_boss_gatewatcher_iron_hand(); //TK The Mechanar +void AddSC_boss_gatewatcher_gyrokill(); +void AddSC_boss_nethermancer_sepethrea(); +void AddSC_boss_pathaleon_the_calculator(); +void AddSC_boss_mechano_lord_capacitus(); +void AddSC_instance_mechanar(); + +void AddSC_blades_edge_mountains(); +void AddSC_boss_doomlordkazzak(); +void AddSC_boss_doomwalker(); +void AddSC_hellfire_peninsula(); +void AddSC_nagrand(); +void AddSC_netherstorm(); +void AddSC_shadowmoon_valley(); +void AddSC_shattrath_city(); +void AddSC_terokkar_forest(); +void AddSC_zangarmarsh(); + +// The name of this function should match: +// void Add${NameOfDirectory}Scripts() +void AddOutlandScripts() +{ + // Auchindoun - Auchenai Crypts + AddSC_boss_shirrak_the_dead_watcher(); + AddSC_boss_exarch_maladaar(); + AddSC_instance_auchenai_crypts(); + + // Auchindoun - Mana Tombs + AddSC_boss_pandemonius(); + AddSC_boss_nexusprince_shaffar(); + AddSC_instance_mana_tombs(); + + // Auchindoun - Sekketh Halls + AddSC_boss_darkweaver_syth(); + AddSC_boss_talon_king_ikiss(); + AddSC_boss_anzu(); + AddSC_instance_sethekk_halls(); + + // Auchindoun - Shadow Labyrinth + AddSC_boss_ambassador_hellmaw(); + AddSC_boss_blackheart_the_inciter(); + AddSC_boss_grandmaster_vorpil(); + AddSC_boss_murmur(); + AddSC_instance_shadow_labyrinth(); + + // Black Temple + AddSC_black_temple(); + AddSC_boss_illidan(); + AddSC_boss_shade_of_akama(); + AddSC_boss_supremus(); + AddSC_boss_gurtogg_bloodboil(); + AddSC_boss_mother_shahraz(); + AddSC_boss_reliquary_of_souls(); + AddSC_boss_teron_gorefiend(); + AddSC_boss_najentus(); + AddSC_boss_illidari_council(); + AddSC_instance_black_temple(); + + // Coilfang Reservoir - Serpent Shrine Cavern + AddSC_boss_fathomlord_karathress(); + AddSC_boss_hydross_the_unstable(); + AddSC_boss_lady_vashj(); + AddSC_boss_leotheras_the_blind(); + AddSC_boss_morogrim_tidewalker(); + AddSC_instance_serpentshrine_cavern(); + AddSC_boss_the_lurker_below(); + + // Coilfang Reservoir - The Steam Vault + AddSC_instance_steam_vault(); + AddSC_boss_hydromancer_thespia(); + AddSC_boss_mekgineer_steamrigger(); + AddSC_boss_warlord_kalithresh(); + + // Coilfang Reservoir - The Slave Pens + AddSC_instance_the_slave_pens(); + AddSC_boss_mennu_the_betrayer(); + AddSC_boss_rokmar_the_crackler(); + AddSC_boss_quagmirran(); + + // Coilfang Reservoir - The Underbog + AddSC_instance_the_underbog(); + AddSC_boss_hungarfen(); + AddSC_boss_the_black_stalker(); + + // Gruul's Lair + AddSC_boss_gruul(); + AddSC_boss_high_king_maulgar(); + AddSC_instance_gruuls_lair(); + AddSC_boss_broggok(); //HC Blood Furnace + AddSC_boss_kelidan_the_breaker(); + AddSC_boss_the_maker(); + AddSC_instance_blood_furnace(); + AddSC_boss_magtheridon(); //HC Magtheridon's Lair + AddSC_instance_magtheridons_lair(); + AddSC_boss_grand_warlock_nethekurse(); //HC Shattered Halls + AddSC_boss_warbringer_omrogg(); + AddSC_boss_warchief_kargath_bladefist(); + AddSC_shattered_halls(); + AddSC_instance_shattered_halls(); + AddSC_boss_watchkeeper_gargolmar(); //HC Ramparts + AddSC_boss_omor_the_unscarred(); + AddSC_boss_vazruden_the_herald(); + AddSC_instance_ramparts(); + AddSC_arcatraz(); //TK Arcatraz + AddSC_boss_zereketh_the_unbound(); + AddSC_boss_dalliah_the_doomsayer(); + AddSC_boss_wrath_scryer_soccothrates(); + AddSC_boss_harbinger_skyriss(); + AddSC_instance_arcatraz(); + AddSC_boss_high_botanist_freywinn(); //TK Botanica + AddSC_boss_laj(); + AddSC_boss_warp_splinter(); + AddSC_boss_thorngrin_the_tender(); + AddSC_boss_commander_sarannis(); + AddSC_instance_the_botanica(); + AddSC_boss_alar(); //TK The Eye + AddSC_boss_kaelthas(); + AddSC_boss_void_reaver(); + AddSC_boss_high_astromancer_solarian(); + AddSC_instance_the_eye(); + AddSC_the_eye(); + AddSC_boss_gatewatcher_iron_hand(); //TK The Mechanar + AddSC_boss_gatewatcher_gyrokill(); + AddSC_boss_nethermancer_sepethrea(); + AddSC_boss_pathaleon_the_calculator(); + AddSC_boss_mechano_lord_capacitus(); + AddSC_instance_mechanar(); + + AddSC_blades_edge_mountains(); + AddSC_boss_doomlordkazzak(); + AddSC_boss_doomwalker(); + AddSC_hellfire_peninsula(); + AddSC_nagrand(); + AddSC_netherstorm(); + AddSC_shadowmoon_valley(); + AddSC_shattrath_city(); + AddSC_terokkar_forest(); + AddSC_zangarmarsh(); +} diff --git a/src/server/scripts/Outland/zone_terokkar_forest.cpp b/src/server/scripts/Outland/zone_terokkar_forest.cpp index 06a8af947b7..4b757544d65 100644 --- a/src/server/scripts/Outland/zone_terokkar_forest.cpp +++ b/src/server/scripts/Outland/zone_terokkar_forest.cpp @@ -27,7 +27,6 @@ EndScriptData */ npc_unkor_the_ruthless npc_infested_root_walker npc_rotting_forest_rager -npc_netherweb_victim npc_floon npc_isla_starmane npc_slim @@ -47,13 +46,13 @@ EndContentData */ enum UnkorTheRuthless { - SAY_SUBMIT = 0, - - FACTION_HOSTILE = 45, - FACTION_FRIENDLY = 35, - QUEST_DONTKILLTHEFATONE = 9889, - - SPELL_PULVERIZE = 2676 + SAY_SUBMIT = 0, + REQUIRED_KILL_COUNT = 10, + FACTION_FRIENDLY = 35, + FACTION_HOSTILE = 45, + SPELL_PULVERIZE = 2676, + QUEST_DONTKILLTHEFATONE = 9889, + NPC_BOULDERFIST_INVADER = 18260 }; class npc_unkor_the_ruthless : public CreatureScript @@ -117,7 +116,7 @@ public: Player* groupie = itr->GetSource(); if (groupie && groupie->GetQuestStatus(QUEST_DONTKILLTHEFATONE) == QUEST_STATUS_INCOMPLETE && - groupie->GetReqKillOrCastCurrentCount(QUEST_DONTKILLTHEFATONE, 18260) == 10) + groupie->GetReqKillOrCastCurrentCount(QUEST_DONTKILLTHEFATONE, NPC_BOULDERFIST_INVADER) == REQUIRED_KILL_COUNT) { groupie->AreaExploredOrEventHappens(QUEST_DONTKILLTHEFATONE); if (!CanDoQuest) @@ -126,7 +125,7 @@ public: } } else if (player->GetQuestStatus(QUEST_DONTKILLTHEFATONE) == QUEST_STATUS_INCOMPLETE && - player->GetReqKillOrCastCurrentCount(QUEST_DONTKILLTHEFATONE, 18260) == 10) + player->GetReqKillOrCastCurrentCount(QUEST_DONTKILLTHEFATONE, NPC_BOULDERFIST_INVADER) == REQUIRED_KILL_COUNT) { player->AreaExploredOrEventHappens(QUEST_DONTKILLTHEFATONE); CanDoQuest = true; @@ -171,6 +170,11 @@ public: ## npc_infested_root_walker ######*/ +enum InfestedRootWalker +{ + SPELL_SUMMON_WOOD_MITES = 39130 +}; + class npc_infested_root_walker : public CreatureScript { public: @@ -194,7 +198,7 @@ public: if (me->GetHealth() <= damage) if (rand32() % 100 < 75) //Summon Wood Mites - DoCast(me, 39130, true); + DoCast(me, SPELL_SUMMON_WOOD_MITES, true); } }; }; @@ -202,6 +206,12 @@ public: /*###### ## npc_skywing ######*/ + +enum Skywing +{ + QUEST_SKYWING = 10898 +}; + class npc_skywing : public CreatureScript { public: @@ -226,7 +236,7 @@ public: switch (waypointId) { case 8: - player->AreaExploredOrEventHappens(10898); + player->AreaExploredOrEventHappens(QUEST_SKYWING); break; } } @@ -240,7 +250,7 @@ public: return; Player* player = who->ToPlayer(); - if (player && player->GetQuestStatus(10898) == QUEST_STATUS_INCOMPLETE) + if (player && player->GetQuestStatus(QUEST_SKYWING) == QUEST_STATUS_INCOMPLETE) if (me->IsWithinDistInMap(who, 10.0f)) Start(false, false, who->GetGUID()); } @@ -258,6 +268,11 @@ public: ## npc_rotting_forest_rager ######*/ +enum RottingForestRager +{ + SPELL_SUMMON_LOTS_OF_WOOD_MITES = 39134 +}; + class npc_rotting_forest_rager : public CreatureScript { public: @@ -280,67 +295,8 @@ public: if (done_by->GetTypeId() == TYPEID_PLAYER) if (me->GetHealth() <= damage) if (rand32() % 100 < 75) - //Summon Lots of Wood Mights - DoCast(me, 39134, true); - } - }; -}; - -/*###### -## npc_netherweb_victim -######*/ - -enum NetherwebVictim -{ - QUEST_TARGET = 22459 - //SPELL_FREE_WEBBED = 38950 -}; - -const uint32 netherwebVictims[6] = -{ - 18470, 16805, 21242, 18452, 22482, 21285 -}; - -class npc_netherweb_victim : public CreatureScript -{ -public: - npc_netherweb_victim() : CreatureScript("npc_netherweb_victim") { } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_netherweb_victimAI(creature); - } - - struct npc_netherweb_victimAI : public ScriptedAI - { - npc_netherweb_victimAI(Creature* creature) : ScriptedAI(creature) { } - - void Reset() override { } - void EnterCombat(Unit* /*who*/) override { } - void MoveInLineOfSight(Unit* /*who*/) override { } - - - void JustDied(Unit* killer) override - { - Player* player = killer->ToPlayer(); - if (!player) - return; - - if (player->GetQuestStatus(10873) == QUEST_STATUS_INCOMPLETE) - { - if (rand32() % 100 < 25) - { - me->SummonCreature(QUEST_TARGET, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); - player->KilledMonsterCredit(QUEST_TARGET); - } - else - me->SummonCreature(netherwebVictims[rand32() % 6], 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); - - if (rand32() % 100 < 75) - me->SummonCreature(netherwebVictims[rand32() % 6], 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); - - me->SummonCreature(netherwebVictims[rand32() % 6], 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); - } + //Summon Lots of Wood Mites + DoCast(me, SPELL_SUMMON_LOTS_OF_WOOD_MITES, true); } }; }; @@ -349,19 +305,22 @@ public: ## npc_floon ######*/ -#define GOSSIP_FLOON1 "You owe Sim'salabim money. Hand them over or die!" -#define GOSSIP_FLOON2 "Hand over the money or die...again!" - enum Floon { - SAY_FLOON_ATTACK = 0, - - SPELL_SILENCE = 6726, - SPELL_FROSTBOLT = 9672, - SPELL_FROST_NOVA = 11831, - - FACTION_HOSTILE_FL = 1738, - QUEST_CRACK_SKULLS = 10009 + SAY_FLOON_ATTACK = 0, + OPTION_ID_PAY_UP_OR_DIE = 0, + OPTION_ID_COLLECT_A_DEBT = 0, + FACTION_HOSTILE_FLOON = 1738, + MENU_ID_PAY_UP_OR_DIE = 7731, + MENU_ID_COLLECT_A_DEBT = 7732, + GOSSIP_FLOON_STRANGE_SOUNDS = 9442, + GOSSIP_HE_ALREADY_KILLED_ME = 9443, + + SPELL_SILENCE = 6726, + SPELL_FROSTBOLT = 9672, + SPELL_FROST_NOVA = 11831, + + QUEST_CRACKIN_SOME_SKULLS = 10009 }; class npc_floon : public CreatureScript @@ -374,13 +333,13 @@ public: player->PlayerTalkClass->ClearMenus(); if (action == GOSSIP_ACTION_INFO_DEF) { - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_FLOON2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - player->SEND_GOSSIP_MENU(9443, creature->GetGUID()); + player->ADD_GOSSIP_ITEM_DB(MENU_ID_PAY_UP_OR_DIE, OPTION_ID_PAY_UP_OR_DIE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + player->SEND_GOSSIP_MENU(GOSSIP_HE_ALREADY_KILLED_ME, creature->GetGUID()); } if (action == GOSSIP_ACTION_INFO_DEF+1) { player->CLOSE_GOSSIP_MENU(); - creature->setFaction(FACTION_HOSTILE_FL); + creature->setFaction(FACTION_HOSTILE_FLOON); creature->AI()->Talk(SAY_FLOON_ATTACK, player); creature->AI()->AttackStart(player); } @@ -389,10 +348,10 @@ public: bool OnGossipHello(Player* player, Creature* creature) override { - if (player->GetQuestStatus(QUEST_CRACK_SKULLS) == QUEST_STATUS_INCOMPLETE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_FLOON1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + if (player->GetQuestStatus(QUEST_CRACKIN_SOME_SKULLS) == QUEST_STATUS_INCOMPLETE) + player->ADD_GOSSIP_ITEM_DB(MENU_ID_COLLECT_A_DEBT, OPTION_ID_COLLECT_A_DEBT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - player->SEND_GOSSIP_MENU(9442, creature->GetGUID()); + player->SEND_GOSSIP_MENU(GOSSIP_FLOON_STRANGE_SOUNDS, creature->GetGUID()); return true; } @@ -463,15 +422,16 @@ public: ######*/ enum IslaStarmaneData { - SAY_PROGRESS_1 = 0, - SAY_PROGRESS_2 = 1, - SAY_PROGRESS_3 = 2, - SAY_PROGRESS_4 = 3, - - QUEST_EFTW_H = 10052, - QUEST_EFTW_A = 10051, - GO_CAGE = 182794, - SPELL_CAT = 32447, + SAY_PROGRESS_1 = 0, + SAY_PROGRESS_2 = 1, + SAY_PROGRESS_3 = 2, + SAY_PROGRESS_4 = 3, + GO_DISTANCE = 10, + FACTION_ESCORTEE = 113, + ESCAPE_FROM_FIREWING_POINT_A = 10051, + ESCAPE_FROM_FIREWING_POINT_H = 10052, + SPELL_TRAVEL_FORM_CAT = 32447, + GO_CAGE = 182794 }; class npc_isla_starmane : public CreatureScript @@ -492,7 +452,7 @@ public: switch (waypointId) { case 0: - if (GameObject* Cage = me->FindNearestGameObject(GO_CAGE, 10)) + if (GameObject* Cage = me->FindNearestGameObject(GO_CAGE, GO_DISTANCE)) Cage->SetGoState(GO_STATE_ACTIVE); break; case 2: @@ -507,16 +467,16 @@ public: case 29: Talk(SAY_PROGRESS_4, player); if (player->GetTeam() == ALLIANCE) - player->GroupEventHappens(QUEST_EFTW_A, me); + player->GroupEventHappens(ESCAPE_FROM_FIREWING_POINT_A, me); else if (player->GetTeam() == HORDE) - player->GroupEventHappens(QUEST_EFTW_H, me); + player->GroupEventHappens(ESCAPE_FROM_FIREWING_POINT_H, me); me->SetInFront(player); break; case 30: me->HandleEmoteCommand(EMOTE_ONESHOT_WAVE); break; case 31: - DoCast(me, SPELL_CAT); + DoCast(me, SPELL_TRAVEL_FORM_CAT); me->SetWalk(false); break; } @@ -532,19 +492,19 @@ public: if (Player* player = GetPlayerForEscort()) { if (player->GetTeam() == ALLIANCE) - player->FailQuest(QUEST_EFTW_A); + player->FailQuest(ESCAPE_FROM_FIREWING_POINT_A); else if (player->GetTeam() == HORDE) - player->FailQuest(QUEST_EFTW_H); + player->FailQuest(ESCAPE_FROM_FIREWING_POINT_H); } } }; bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override { - if (quest->GetQuestId() == QUEST_EFTW_H || quest->GetQuestId() == QUEST_EFTW_A) + if (quest->GetQuestId() == ESCAPE_FROM_FIREWING_POINT_H || quest->GetQuestId() == ESCAPE_FROM_FIREWING_POINT_A) { ENSURE_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID()); - creature->setFaction(113); + creature->setFaction(FACTION_ESCORTEE); } return true; } @@ -558,10 +518,20 @@ public: /*###### ## go_skull_pile ######*/ -#define GOSSIP_S_DARKSCREECHER_AKKARAI "Summon Darkscreecher Akkarai" -#define GOSSIP_S_KARROG "Summon Karrog" -#define GOSSIP_S_GEZZARAK_THE_HUNTRESS "Summon Gezzarak the Huntress" -#define GOSSIP_S_VAKKIZ_THE_WINDRAGER "Summon Vakkiz the Windrager" + +enum SkullPile +{ + OPTION_ID_GEZZARAK_THE_HUNTRESS = 0, + OPTION_ID_DARKSCREECHER_AKKARAI = 1, + OPTION_ID_KARROG = 2, + OPTION_ID_VAKKIZ_THE_WINDRAGER = 3, + GOSSIP_MENU_ID_SKULL_PILE = 8660, + ADVERSARIAL_BLOOD = 11885, + SUMMON_GEZZARAK_THE_HUNTRESS = 40632, + SUMMON_KARROG = 40640, + SUMMON_DARKSCREECHER_AKKARAI = 40642, + SUMMON_VAKKIZ_THE_WINDRAGER = 40644 +}; class go_skull_pile : public GameObjectScript { @@ -580,12 +550,12 @@ public: bool OnGossipHello(Player* player, GameObject* go) override { - if ((player->GetQuestStatus(11885) == QUEST_STATUS_INCOMPLETE) || player->GetQuestRewardStatus(11885)) + if ((player->GetQuestStatus(ADVERSARIAL_BLOOD) == QUEST_STATUS_INCOMPLETE) || player->GetQuestRewardStatus(ADVERSARIAL_BLOOD)) { - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_S_DARKSCREECHER_AKKARAI, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_S_KARROG, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_S_GEZZARAK_THE_HUNTRESS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_S_VAKKIZ_THE_WINDRAGER, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); + player->ADD_GOSSIP_ITEM_DB(GOSSIP_MENU_ID_SKULL_PILE, OPTION_ID_GEZZARAK_THE_HUNTRESS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + player->ADD_GOSSIP_ITEM_DB(GOSSIP_MENU_ID_SKULL_PILE, OPTION_ID_DARKSCREECHER_AKKARAI, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + player->ADD_GOSSIP_ITEM_DB(GOSSIP_MENU_ID_SKULL_PILE, OPTION_ID_KARROG, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + player->ADD_GOSSIP_ITEM_DB(GOSSIP_MENU_ID_SKULL_PILE, OPTION_ID_VAKKIZ_THE_WINDRAGER, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); } player->SEND_GOSSIP_MENU(go->GetGOInfo()->questgiver.gossipID, go->GetGUID()); @@ -597,16 +567,16 @@ public: switch (action) { case GOSSIP_ACTION_INFO_DEF + 1: - player->CastSpell(player, 40642, false); + player->CastSpell(player, SUMMON_GEZZARAK_THE_HUNTRESS, false); break; case GOSSIP_ACTION_INFO_DEF + 2: - player->CastSpell(player, 40640, false); + player->CastSpell(player, SUMMON_DARKSCREECHER_AKKARAI, false); break; case GOSSIP_ACTION_INFO_DEF + 3: - player->CastSpell(player, 40632, false); + player->CastSpell(player, SUMMON_KARROG, false); break; case GOSSIP_ACTION_INFO_DEF + 4: - player->CastSpell(player, 40644, false); + player->CastSpell(player, SUMMON_VAKKIZ_THE_WINDRAGER, false); break; } } @@ -618,7 +588,9 @@ public: enum Slim { - FACTION_CONSORTIUM = 933 + FACTION_CONSORTIUM = 933, + NPC_TEXT_NEITHER_SLIM_NOR_SHADY = 9895, + NPC_TEXT_I_SEE_YOU_ARE_A_FRIEND = 9896 }; class npc_slim : public CreatureScript @@ -640,10 +612,10 @@ public: if (creature->IsVendor() && player->GetReputationRank(FACTION_CONSORTIUM) >= REP_FRIENDLY) { player->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - player->SEND_GOSSIP_MENU(9896, creature->GetGUID()); + player->SEND_GOSSIP_MENU(NPC_TEXT_I_SEE_YOU_ARE_A_FRIEND, creature->GetGUID()); } else - player->SEND_GOSSIP_MENU(9895, creature->GetGUID()); + player->SEND_GOSSIP_MENU(NPC_TEXT_NEITHER_SLIM_NOR_SHADY, creature->GetGUID()); return true; } @@ -719,7 +691,6 @@ void AddSC_terokkar_forest() new npc_unkor_the_ruthless(); new npc_infested_root_walker(); new npc_rotting_forest_rager(); - new npc_netherweb_victim(); new npc_floon(); new npc_isla_starmane(); new go_skull_pile(); diff --git a/src/server/scripts/Pet/CMakeLists.txt b/src/server/scripts/Pet/CMakeLists.txt deleted file mode 100644 index 9ca268a9a3f..00000000000 --- a/src/server/scripts/Pet/CMakeLists.txt +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> -# -# This file is free software; as a special exception the author gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -set(scripts_STAT_SRCS - ${scripts_STAT_SRCS} - Pet/pet_dk.cpp - Pet/pet_generic.cpp - Pet/pet_hunter.cpp - Pet/pet_mage.cpp - Pet/pet_priest.cpp - Pet/pet_shaman.cpp -) - -message(" -> Prepared: Pet") diff --git a/src/server/scripts/Pet/pet_generic.cpp b/src/server/scripts/Pet/pet_generic.cpp index 35455bc474b..0ec6f08ae58 100644 --- a/src/server/scripts/Pet/pet_generic.cpp +++ b/src/server/scripts/Pet/pet_generic.cpp @@ -20,10 +20,181 @@ * Scriptnames of files in this file should be prefixed with "npc_pet_gen_". */ + /* ContentData + npc_pet_gen_egbert 100% Egbert run's around + npc_pet_gen_pandaren_monk 100% Pandaren Monk drinks and bows with you + npc_pet_gen_mojo 100% Mojo follows you when you kiss it + EndContentData */ + #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "PassiveAI.h" #include "Player.h" +enum EgbertMisc +{ + SPELL_EGBERT = 40669, + EVENT_RETURN = 3 +}; + +class npc_pet_gen_egbert : public CreatureScript +{ +public: + npc_pet_gen_egbert() : CreatureScript("npc_pet_gen_egbert") {} + + struct npc_pet_gen_egbertAI : public NullCreatureAI + { + npc_pet_gen_egbertAI(Creature* creature) : NullCreatureAI(creature) + { + if (Unit* owner = me->GetCharmerOrOwner()) + if (owner->GetMap()->GetEntry()->addon > 1) + me->SetCanFly(true); + } + + void Reset() override + { + _events.Reset(); + if (Unit* owner = me->GetCharmerOrOwner()) + me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, me->GetFollowAngle()); + } + + void EnterEvadeMode(EvadeReason why) override + { + if (!_EnterEvadeMode(why)) + return; + + Reset(); + } + + void UpdateAI(uint32 diff) override + { + _events.Update(diff); + + if (Unit* owner = me->GetCharmerOrOwner()) + { + if (!me->IsWithinDist(owner, 40.f)) + { + me->RemoveAura(SPELL_EGBERT); + me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, me->GetFollowAngle()); + } + } + + if (me->HasAura(SPELL_EGBERT)) + _events.ScheduleEvent(EVENT_RETURN, urandms(5, 20)); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_RETURN: + me->RemoveAura(SPELL_EGBERT); + break; + default: + break; + } + } + } + private: + EventMap _events; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_pet_gen_egbertAI(creature); + } +}; + +enum PandarenMonkMisc +{ + SPELL_PANDAREN_MONK = 69800, + EVENT_FOCUS = 1, + EVENT_EMOTE = 2, + EVENT_FOLLOW = 3, + EVENT_DRINK = 4 +}; + +class npc_pet_gen_pandaren_monk : public CreatureScript +{ +public: + npc_pet_gen_pandaren_monk() : CreatureScript("npc_pet_gen_pandaren_monk") {} + + struct npc_pet_gen_pandaren_monkAI : public NullCreatureAI + { + npc_pet_gen_pandaren_monkAI(Creature* creature) : NullCreatureAI(creature) { } + + void Reset() override + { + _events.Reset(); + _events.ScheduleEvent(EVENT_FOCUS, 1000); + } + + void EnterEvadeMode(EvadeReason why) override + { + if (!_EnterEvadeMode(why)) + return; + + Reset(); + } + + void ReceiveEmote(Player* /*player*/, uint32 emote) override + { + me->InterruptSpell(CURRENT_CHANNELED_SPELL); + me->StopMoving(); + + switch (emote) + { + case TEXT_EMOTE_BOW: + _events.ScheduleEvent(EVENT_FOCUS, 1000); + break; + case TEXT_EMOTE_DRINK: + _events.ScheduleEvent(EVENT_DRINK, 1000); + break; + } + } + + void UpdateAI(uint32 diff) override + { + _events.Update(diff); + + if (Unit* owner = me->GetCharmerOrOwner()) + if (!me->IsWithinDist(owner, 30.f)) + me->InterruptSpell(CURRENT_CHANNELED_SPELL); + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_FOCUS: + if (Unit* owner = me->GetCharmerOrOwner()) + me->SetFacingToObject(owner); + _events.ScheduleEvent(EVENT_EMOTE, 1000); + break; + case EVENT_EMOTE: + me->HandleEmoteCommand(EMOTE_ONESHOT_BOW); + _events.ScheduleEvent(EVENT_FOLLOW, 1000); + break; + case EVENT_FOLLOW: + if (Unit* owner = me->GetCharmerOrOwner()) + me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); + break; + case EVENT_DRINK: + me->CastSpell(me, SPELL_PANDAREN_MONK, false); + break; + default: + break; + } + } + } + private: + EventMap _events; + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new npc_pet_gen_pandaren_monkAI(creature); + } +}; + enum Mojo { SAY_MOJO = 0, @@ -89,5 +260,7 @@ class npc_pet_gen_mojo : public CreatureScript void AddSC_generic_pet_scripts() { + new npc_pet_gen_egbert(); + new npc_pet_gen_pandaren_monk(); new npc_pet_gen_mojo(); } diff --git a/src/server/scripts/Pet/pet_script_loader.cpp b/src/server/scripts/Pet/pet_script_loader.cpp new file mode 100644 index 00000000000..c3c0079fd46 --- /dev/null +++ b/src/server/scripts/Pet/pet_script_loader.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +// This is where scripts' loading functions should be declared: +void AddSC_deathknight_pet_scripts(); +void AddSC_generic_pet_scripts(); +void AddSC_hunter_pet_scripts(); +void AddSC_mage_pet_scripts(); +void AddSC_priest_pet_scripts(); +void AddSC_shaman_pet_scripts(); + +// The name of this function should match: +// void Add${NameOfDirectory}Scripts() +void AddPetScripts() +{ + AddSC_deathknight_pet_scripts(); + AddSC_generic_pet_scripts(); + AddSC_hunter_pet_scripts(); + AddSC_mage_pet_scripts(); + AddSC_priest_pet_scripts(); + AddSC_shaman_pet_scripts(); +} diff --git a/src/server/scripts/Spells/CMakeLists.txt b/src/server/scripts/Spells/CMakeLists.txt deleted file mode 100644 index 7434d98cf49..00000000000 --- a/src/server/scripts/Spells/CMakeLists.txt +++ /dev/null @@ -1,30 +0,0 @@ -# Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> -# -# This file is free software; as a special exception the author gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -set(scripts_STAT_SRCS - ${scripts_STAT_SRCS} - Spells/spell_shaman.cpp - Spells/spell_hunter.cpp - Spells/spell_rogue.cpp - Spells/spell_druid.cpp - Spells/spell_dk.cpp - Spells/spell_quest.cpp - Spells/spell_warrior.cpp - Spells/spell_generic.cpp - Spells/spell_warlock.cpp - Spells/spell_priest.cpp - Spells/spell_mage.cpp - Spells/spell_paladin.cpp - Spells/spell_item.cpp - Spells/spell_holiday.cpp - Spells/spell_pet.cpp -) - -message(" -> Prepared: Spells") diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp index 3cea620559a..7c2bb0bfaa5 100644 --- a/src/server/scripts/Spells/spell_dk.cpp +++ b/src/server/scripts/Spells/spell_dk.cpp @@ -22,7 +22,7 @@ */ #include "Player.h" -#include "UnitAI.h" +#include "PlayerAI.h" #include "ScriptMgr.h" #include "SpellScript.h" #include "SpellAuraEffects.h" @@ -1909,7 +1909,7 @@ public: if (!player || player->GetGhoulResurrectGhoulGUID().IsEmpty()) return; - oldAI = player->GetAI(); + oldAI = player->AI(); oldAIState = player->IsAIEnabled; player->SetAI(new player_ghoulAI(player, player->GetGhoulResurrectGhoulGUID())); player->IsAIEnabled = true; @@ -1922,7 +1922,7 @@ public: return; player->IsAIEnabled = oldAIState; - UnitAI* thisAI = player->GetAI(); + PlayerAI* thisAI = player->AI(); player->SetAI(oldAI); delete thisAI; @@ -1943,7 +1943,7 @@ public: AfterEffectRemove += AuraEffectRemoveFn(spell_dk_raise_ally_AuraScript::OnRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); } - UnitAI* oldAI; + PlayerAI* oldAI; bool oldAIState; }; diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp index 7b853c36075..c088ae07e66 100644 --- a/src/server/scripts/Spells/spell_druid.cpp +++ b/src/server/scripts/Spells/spell_druid.cpp @@ -991,6 +991,37 @@ class spell_dru_swift_flight_passive : public SpellScriptLoader } }; +// -33943 - Flight Form +class spell_dru_flight_form : public SpellScriptLoader +{ + public: + spell_dru_flight_form() : SpellScriptLoader("spell_dru_flight_form") { } + + class spell_dru_flight_form_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dru_flight_form_SpellScript); + + SpellCastResult CheckCast() + { + Unit* caster = GetCaster(); + if (caster->IsInDisallowedMountForm()) + return SPELL_FAILED_NOT_SHAPESHIFT; + + return SPELL_CAST_OK; + } + + void Register() override + { + OnCheckCast += SpellCheckCastFn(spell_dru_flight_form_SpellScript::CheckCast); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_dru_flight_form_SpellScript(); + } +}; + // -5217 - Tiger's Fury class spell_dru_tiger_s_fury : public SpellScriptLoader { @@ -1196,6 +1227,7 @@ void AddSC_druid_spell_scripts() new spell_dru_starfall_dummy(); new spell_dru_survival_instincts(); new spell_dru_swift_flight_passive(); + new spell_dru_flight_form(); new spell_dru_tiger_s_fury(); new spell_dru_typhoon(); new spell_dru_t10_restoration_4p_bonus(); diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index 5c3ee1d7f4a..abde43ef952 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -1930,10 +1930,7 @@ class spell_gen_mount : public SpellScriptLoader if (map == 530 || (map == 571 && target->HasSpell(SPELL_COLD_WEATHER_FLYING))) canFly = true; - float x, y, z; - target->GetPosition(x, y, z); - uint32 areaFlag = target->GetBaseMap()->GetAreaFlag(x, y, z); - AreaTableEntry const* area = sAreaStore.LookupEntry(areaFlag); + AreaTableEntry const* area = sAreaTableStore.LookupEntry(target->GetAreaId()); if (!area || (canFly && (area->flags & AREA_FLAG_NO_FLY_ZONE))) canFly = false; diff --git a/src/server/scripts/Spells/spell_holiday.cpp b/src/server/scripts/Spells/spell_holiday.cpp index 7fe1f54a594..a3359fdf6f9 100644 --- a/src/server/scripts/Spells/spell_holiday.cpp +++ b/src/server/scripts/Spells/spell_holiday.cpp @@ -29,6 +29,7 @@ #include "GridNotifiers.h" #include "GridNotifiersImpl.h" #include "CellImpl.h" +#include "Vehicle.h" // 45102 Romantic Picnic enum SpellsPicnic @@ -410,6 +411,84 @@ class spell_pilgrims_bounty_buff_food : public SpellScriptLoader } }; +enum FeastOnSpells +{ + FEAST_ON_TURKEY = 61784, + FEAST_ON_CRANBERRIES = 61785, + FEAST_ON_SWEET_POTATOES = 61786, + FEAST_ON_PIE = 61787, + FEAST_ON_STUFFING = 61788, + SPELL_CRANBERRY_HELPINS = 61841, + SPELL_TURKEY_HELPINS = 61842, + SPELL_STUFFING_HELPINS = 61843, + SPELL_SWEET_POTATO_HELPINS = 61844, + SPELL_PIE_HELPINS = 61845, + SPELL_ON_PLATE_EAT_VISUAL = 61826 +}; + +class spell_pilgrims_bounty_feast_on : public SpellScriptLoader +{ + public: + spell_pilgrims_bounty_feast_on() : SpellScriptLoader("spell_pilgrims_bounty_feast_on") { } + + class spell_pilgrims_bounty_feast_on_SpellScript : public SpellScript + { + PrepareSpellScript(spell_pilgrims_bounty_feast_on_SpellScript); + + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + + uint32 _spellId = 0; + switch (GetSpellInfo()->Id) + { + case FEAST_ON_TURKEY: + _spellId = SPELL_TURKEY_HELPINS; + break; + case FEAST_ON_CRANBERRIES: + _spellId = SPELL_CRANBERRY_HELPINS; + break; + case FEAST_ON_SWEET_POTATOES: + _spellId = SPELL_SWEET_POTATO_HELPINS; + break; + case FEAST_ON_PIE: + _spellId = SPELL_PIE_HELPINS; + break; + case FEAST_ON_STUFFING: + _spellId = SPELL_STUFFING_HELPINS; + break; + default: + return; + } + + if (Vehicle* vehicle = caster->GetVehicleKit()) + if (Unit* target = vehicle->GetPassenger(0)) + if (Player* player = target->ToPlayer()) + { + player->CastSpell(player, SPELL_ON_PLATE_EAT_VISUAL, true); + caster->CastSpell(player, _spellId, true, NULL, NULL, player->GetGUID()); + } + + if (Aura* aura = caster->GetAura(GetEffectValue())) + { + if (aura->GetStackAmount() == 1) + caster->RemoveAurasDueToSpell(aura->GetSpellInfo()->Effects[EFFECT_0].CalcValue()); + aura->ModStackAmount(-1); + } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_pilgrims_bounty_feast_on_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_pilgrims_bounty_feast_on_SpellScript(); + } +}; + enum TheTurkinator { SPELL_KILL_COUNTER_VISUAL = 62015, @@ -429,7 +508,7 @@ class spell_pilgrims_bounty_turkey_tracker : public SpellScriptLoader { PrepareSpellScript(spell_pilgrims_bounty_turkey_tracker_SpellScript); - bool Validate(SpellInfo const* /*spell*/) + bool Validate(SpellInfo const* /*spell*/) override { if (!sSpellMgr->GetSpellInfo(SPELL_KILL_COUNTER_VISUAL) || !sSpellMgr->GetSpellInfo(SPELL_KILL_COUNTER_VISUAL_MAX)) return false; @@ -472,18 +551,90 @@ class spell_pilgrims_bounty_turkey_tracker : public SpellScriptLoader } } - void Register() + void Register() override { OnEffectHitTarget += SpellEffectFn(spell_pilgrims_bounty_turkey_tracker_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); } }; - SpellScript* GetSpellScript() const + SpellScript* GetSpellScript() const override { return new spell_pilgrims_bounty_turkey_tracker_SpellScript(); } }; +enum SpiritOfSharing +{ + SPELL_THE_SPIRIT_OF_SHARING = 61849 +}; + +class spell_pilgrims_bounty_well_fed : public SpellScriptLoader +{ + private: + uint32 _triggeredSpellId; + + public: + spell_pilgrims_bounty_well_fed(const char* name, uint32 triggeredSpellId) : SpellScriptLoader(name), _triggeredSpellId(triggeredSpellId) { } + + class spell_pilgrims_bounty_well_fed_SpellScript : public SpellScript + { + PrepareSpellScript(spell_pilgrims_bounty_well_fed_SpellScript); + private: + uint32 _triggeredSpellId; + + public: + spell_pilgrims_bounty_well_fed_SpellScript(uint32 triggeredSpellId) : SpellScript(), _triggeredSpellId(triggeredSpellId) { } + + bool Validate(SpellInfo const* /*spell*/) override + { + if (!sSpellMgr->GetSpellInfo(_triggeredSpellId)) + return false; + return true; + } + + void HandleScript(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + Player* target = GetHitPlayer(); + if (!target) + return; + + if (Aura const* aura = target->GetAura(GetSpellInfo()->Id)) + { + if (aura->GetStackAmount() == 5) + target->CastSpell(target, _triggeredSpellId, true); + } + + Aura const* turkey = target->GetAura(SPELL_TURKEY_HELPINS); + Aura const* cranberies = target->GetAura(SPELL_CRANBERRY_HELPINS); + Aura const* stuffing = target->GetAura(SPELL_STUFFING_HELPINS); + Aura const* sweetPotatoes = target->GetAura(SPELL_SWEET_POTATO_HELPINS); + Aura const* pie = target->GetAura(SPELL_PIE_HELPINS); + + if ((turkey && turkey->GetStackAmount() == 5) && (cranberies && cranberies->GetStackAmount() == 5) && (stuffing && stuffing->GetStackAmount() == 5) + && (sweetPotatoes && sweetPotatoes->GetStackAmount() == 5) && (pie && pie->GetStackAmount() == 5)) + { + target->CastSpell(target, SPELL_THE_SPIRIT_OF_SHARING, true); + target->RemoveAurasDueToSpell(SPELL_TURKEY_HELPINS); + target->RemoveAurasDueToSpell(SPELL_CRANBERRY_HELPINS); + target->RemoveAurasDueToSpell(SPELL_STUFFING_HELPINS); + target->RemoveAurasDueToSpell(SPELL_SWEET_POTATO_HELPINS); + target->RemoveAurasDueToSpell(SPELL_PIE_HELPINS); + } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_pilgrims_bounty_well_fed_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_pilgrims_bounty_well_fed_SpellScript(_triggeredSpellId); + } +}; + enum Mistletoe { SPELL_CREATE_MISTLETOE = 26206, @@ -1047,6 +1198,12 @@ void AddSC_holiday_spell_scripts() new spell_pilgrims_bounty_buff_food("spell_gen_spice_bread_stuffing", SPELL_WELL_FED_HIT_TRIGGER); new spell_pilgrims_bounty_buff_food("spell_gen_pumpkin_pie", SPELL_WELL_FED_SPIRIT_TRIGGER); new spell_pilgrims_bounty_buff_food("spell_gen_candied_sweet_potato", SPELL_WELL_FED_HASTE_TRIGGER); + new spell_pilgrims_bounty_feast_on(); + new spell_pilgrims_bounty_well_fed("spell_pilgrims_bounty_well_fed_turkey", SPELL_WELL_FED_AP_TRIGGER); + new spell_pilgrims_bounty_well_fed("spell_pilgrims_bounty_well_fed_cranberry", SPELL_WELL_FED_ZM_TRIGGER); + new spell_pilgrims_bounty_well_fed("spell_pilgrims_bounty_well_fed_stuffing", SPELL_WELL_FED_HIT_TRIGGER); + new spell_pilgrims_bounty_well_fed("spell_pilgrims_bounty_well_fed_sweet_potatoes", SPELL_WELL_FED_HASTE_TRIGGER); + new spell_pilgrims_bounty_well_fed("spell_pilgrims_bounty_well_fed_pie", SPELL_WELL_FED_SPIRIT_TRIGGER); new spell_pilgrims_bounty_turkey_tracker(); // Winter Veil new spell_winter_veil_mistletoe(); diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp index abf4c6c1ad8..4d7cc277ff6 100644 --- a/src/server/scripts/Spells/spell_hunter.cpp +++ b/src/server/scripts/Spells/spell_hunter.cpp @@ -40,6 +40,7 @@ enum HunterSpells SPELL_HUNTER_CHIMERA_SHOT_SERPENT = 53353, SPELL_HUNTER_CHIMERA_SHOT_VIPER = 53358, SPELL_HUNTER_CHIMERA_SHOT_SCORPID = 53359, + SPELL_HUNTER_GLYPH_OF_ARCANE_SHOT = 61389, SPELL_HUNTER_GLYPH_OF_ASPECT_OF_THE_VIPER = 56851, SPELL_HUNTER_IMPROVED_MEND_PET = 24406, SPELL_HUNTER_INVIGORATION_TRIGGERED = 53398, @@ -192,8 +193,8 @@ class spell_hun_chimera_shot : public SpellScriptLoader { uint32 spellId = 0; int32 basePoint = 0; - Unit::AuraApplicationMap& Auras = unitTarget->GetAppliedAuras(); - for (Unit::AuraApplicationMap::iterator i = Auras.begin(); i != Auras.end(); ++i) + Unit::AuraApplicationMap const& auras = unitTarget->GetAppliedAuras(); + for (Unit::AuraApplicationMap::const_iterator i = auras.begin(); i != auras.end(); ++i) { Aura* aura = i->second->GetBase(); if (aura->GetCasterGUID() != caster->GetGUID()) @@ -296,6 +297,68 @@ class spell_hun_disengage : public SpellScriptLoader } }; +// 56841 - Glyph of Arcane Shot +class spell_hun_glyph_of_arcane_shot : public SpellScriptLoader +{ + public: + spell_hun_glyph_of_arcane_shot() : SpellScriptLoader("spell_hun_glyph_of_arcane_shot") { } + + class spell_hun_glyph_of_arcane_shot_AuraScript : public AuraScript + { + PrepareAuraScript(spell_hun_glyph_of_arcane_shot_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_GLYPH_OF_ARCANE_SHOT)) + return false; + return true; + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + if (Unit* procTarget = eventInfo.GetProcTarget()) + { + Unit::AuraApplicationMap const& auras = procTarget->GetAppliedAuras(); + for (Unit::AuraApplicationMap::const_iterator i = auras.begin(); i != auras.end(); ++i) + { + Aura const* aura = i->second->GetBase(); + if (aura->GetCasterGUID() != GetTarget()->GetGUID()) + continue; + // Search only Serpent Sting, Viper Sting, Scorpid Sting, Wyvern Sting + if (aura->GetSpellInfo()->SpellFamilyName == SPELLFAMILY_HUNTER + && aura->GetSpellInfo()->SpellFamilyFlags.HasFlag(0xC000, 0x1080)) + return true; + } + } + return false; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + SpellInfo const* procSpell = eventInfo.GetSpellInfo(); + if (!procSpell) + return; + + int32 mana = procSpell->CalcPowerCost(GetTarget(), procSpell->GetSchoolMask()); + ApplyPct(mana, aurEff->GetAmount()); + + GetTarget()->CastCustomSpell(SPELL_HUNTER_GLYPH_OF_ARCANE_SHOT, SPELLVALUE_BASE_POINT0, mana, GetTarget()); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_hun_glyph_of_arcane_shot_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_hun_glyph_of_arcane_shot_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_hun_glyph_of_arcane_shot_AuraScript(); + } +}; + // -19572 - Improved Mend Pet class spell_hun_improved_mend_pet : public SpellScriptLoader { @@ -336,6 +399,7 @@ class spell_hun_improved_mend_pet : public SpellScriptLoader return new spell_hun_improved_mend_pet_AuraScript(); } }; + // 53412 - Invigoration class spell_hun_invigoration : public SpellScriptLoader { @@ -952,6 +1016,7 @@ void AddSC_hunter_spell_scripts() new spell_hun_ascpect_of_the_viper(); new spell_hun_chimera_shot(); new spell_hun_disengage(); + new spell_hun_glyph_of_arcane_shot(); new spell_hun_improved_mend_pet(); new spell_hun_invigoration(); new spell_hun_last_stand_pet(); diff --git a/src/server/scripts/Spells/spell_rogue.cpp b/src/server/scripts/Spells/spell_rogue.cpp index 3ca2db40d65..9b577d4e140 100644 --- a/src/server/scripts/Spells/spell_rogue.cpp +++ b/src/server/scripts/Spells/spell_rogue.cpp @@ -41,6 +41,9 @@ enum RogueSpells SPELL_ROGUE_SHIV_TRIGGERED = 5940, SPELL_ROGUE_TRICKS_OF_THE_TRADE_DMG_BOOST = 57933, SPELL_ROGUE_TRICKS_OF_THE_TRADE_PROC = 59628, + SPELL_ROGUE_HONOR_AMONG_THIEVES = 51698, + SPELL_ROGUE_HONOR_AMONG_THIEVES_PROC = 52916, + SPELL_ROGUE_HONOR_AMONG_THIEVES_2 = 51699 }; // 13877, 33735, (check 51211, 65956) - Blade Flurry @@ -703,6 +706,143 @@ class spell_rog_tricks_of_the_trade_proc : public SpellScriptLoader } }; +// 51698,51700,51701 - Honor Among Thieves +class spell_rog_honor_among_thieves : public SpellScriptLoader +{ +public: + spell_rog_honor_among_thieves() : SpellScriptLoader("spell_rog_honor_among_thieves") { } + + class spell_rog_honor_among_thieves_AuraScript : public AuraScript + { + PrepareAuraScript(spell_rog_honor_among_thieves_AuraScript); + + bool CheckProc(ProcEventInfo& /*eventInfo*/) + { + Unit* caster = GetCaster(); + if (!caster) + return false; + + if (!caster->GetSpellHistory()->HasCooldown(GetSpellInfo()->Effects[EFFECT_0].TriggerSpell)) + return true; + + return false; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + + Unit* caster = GetCaster(); + if (!caster) + return; + + Unit* target = GetTarget(); + target->CastSpell(target, GetSpellInfo()->Effects[EFFECT_0].TriggerSpell, TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD), nullptr, aurEff, caster->GetGUID()); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_rog_honor_among_thieves_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_rog_honor_among_thieves_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_rog_honor_among_thieves_AuraScript(); + } +}; + +// 52916 - Honor Among Thieves (Proc) +class spell_rog_honor_among_thieves_proc : public SpellScriptLoader +{ +public: + spell_rog_honor_among_thieves_proc() : SpellScriptLoader("spell_rog_honor_among_thieves_proc") { } + + class spell_rog_honor_among_thieves_proc_SpellScript : public SpellScript + { + PrepareSpellScript(spell_rog_honor_among_thieves_proc_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_ROGUE_HONOR_AMONG_THIEVES_PROC)) + return false; + + return true; + } + + void FilterTargets(std::list<WorldObject*>& targets) + { + targets.clear(); + + Unit* target = GetOriginalCaster(); + if (!target) + return; + + targets.push_back(target); + } + + void HandleBeforeHit() + { + Unit* target = GetHitUnit(); + if (!target) + return; + + /* + * The applied aura has a duration of 8 seconds + * This prevents new applications while its active + * Removing it on each new proc enables the application from different sources (different grouped players) + * and on new procs after the source cooldown is finished (1 second) + */ + if (target->HasAura(GetSpellInfo()->Id)) + target->RemoveAura(GetSpellInfo()->Id); + } + + void TriggerCooldown() + { + Unit* target = GetHitUnit(); + if (!target) + return; + + target->GetSpellHistory()->AddCooldown(GetSpellInfo()->Id, 0, std::chrono::seconds(1)); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_rog_honor_among_thieves_proc_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_PARTY); + BeforeHit += SpellHitFn(spell_rog_honor_among_thieves_proc_SpellScript::HandleBeforeHit); + AfterHit += SpellHitFn(spell_rog_honor_among_thieves_proc_SpellScript::TriggerCooldown); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_rog_honor_among_thieves_proc_SpellScript(); + } + + class spell_rog_honor_among_thieves_proc_AuraScript : public AuraScript + { + PrepareAuraScript(spell_rog_honor_among_thieves_proc_AuraScript); + + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Player* player = GetTarget()->ToPlayer()) + if (Unit* spellTarget = ObjectAccessor::GetUnit(*player, player->GetTarget())) + player->CastSpell(spellTarget, SPELL_ROGUE_HONOR_AMONG_THIEVES_2, true); + } + + void Register() override + { + AfterEffectApply += AuraEffectApplyFn(spell_rog_honor_among_thieves_proc_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_rog_honor_among_thieves_proc_AuraScript(); + } +}; + void AddSC_rogue_spell_scripts() { new spell_rog_blade_flurry(); @@ -716,4 +856,6 @@ void AddSC_rogue_spell_scripts() new spell_rog_shiv(); new spell_rog_tricks_of_the_trade(); new spell_rog_tricks_of_the_trade_proc(); + new spell_rog_honor_among_thieves(); + new spell_rog_honor_among_thieves_proc(); } diff --git a/src/server/scripts/Spells/spell_script_loader.cpp b/src/server/scripts/Spells/spell_script_loader.cpp new file mode 100644 index 00000000000..b2c8d6663fa --- /dev/null +++ b/src/server/scripts/Spells/spell_script_loader.cpp @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +// This is where scripts' loading functions should be declared: +void AddSC_deathknight_spell_scripts(); +void AddSC_druid_spell_scripts(); +void AddSC_generic_spell_scripts(); +void AddSC_hunter_spell_scripts(); +void AddSC_mage_spell_scripts(); +void AddSC_paladin_spell_scripts(); +void AddSC_priest_spell_scripts(); +void AddSC_rogue_spell_scripts(); +void AddSC_shaman_spell_scripts(); +void AddSC_warlock_spell_scripts(); +void AddSC_warrior_spell_scripts(); +void AddSC_quest_spell_scripts(); +void AddSC_item_spell_scripts(); +void AddSC_holiday_spell_scripts(); + +// The name of this function should match: +// void Add${NameOfDirectory}Scripts() +void AddSpellsScripts() +{ + AddSC_deathknight_spell_scripts(); + AddSC_druid_spell_scripts(); + AddSC_generic_spell_scripts(); + AddSC_hunter_spell_scripts(); + AddSC_mage_spell_scripts(); + AddSC_paladin_spell_scripts(); + AddSC_priest_spell_scripts(); + AddSC_rogue_spell_scripts(); + AddSC_shaman_spell_scripts(); + AddSC_warlock_spell_scripts(); + AddSC_warrior_spell_scripts(); + AddSC_quest_spell_scripts(); + AddSC_item_spell_scripts(); + AddSC_holiday_spell_scripts(); +} diff --git a/src/server/scripts/World/CMakeLists.txt b/src/server/scripts/World/CMakeLists.txt deleted file mode 100644 index 17b3f2d8492..00000000000 --- a/src/server/scripts/World/CMakeLists.txt +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> -# -# This file is free software; as a special exception the author gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -file(GLOB_RECURSE sources_World World/*.cpp World/*.h) - -set(scripts_STAT_SRCS - ${scripts_STAT_SRCS} - ${sources_World} -) - -message(" -> Prepared: World") diff --git a/src/server/scripts/World/npcs_special.cpp b/src/server/scripts/World/npcs_special.cpp index 56d48949fac..159faa38c62 100644 --- a/src/server/scripts/World/npcs_special.cpp +++ b/src/server/scripts/World/npcs_special.cpp @@ -57,7 +57,6 @@ EndContentData */ #include "SpellHistory.h" #include "SpellAuras.h" #include "Pet.h" -#include "PetAI.h" #include "CreatureTextMgr.h" #include "SmartAI.h" @@ -2192,7 +2191,7 @@ public: // Check if we are near Elune'ara lake south, if so try to summon Omen or a minion if (me->GetZoneId() == ZONE_MOONGLADE) { - if (!me->FindNearestCreature(NPC_OMEN, 100.0f, false) && me->GetDistance2d(omenSummonPos.GetPositionX(), omenSummonPos.GetPositionY()) <= 100.0f) + if (!me->FindNearestCreature(NPC_OMEN, 100.0f) && me->GetDistance2d(omenSummonPos.GetPositionX(), omenSummonPos.GetPositionY()) <= 100.0f) { switch (urand(0, 9)) { @@ -2572,159 +2571,6 @@ class npc_train_wrecker : public CreatureScript } }; -enum EgbertMisc -{ - EVENT_MOVE_POS = 1, - EVENT_RETURN = 2 -}; - -class npc_egbert : public CreatureScript -{ -public: - npc_egbert() : CreatureScript("npc_egbert") {} - - struct npc_egbertAI : public PetAI - { - npc_egbertAI(Creature* creature) : PetAI(creature) - { - if (Unit* owner = me->GetCharmerOrOwner()) - if (owner->GetMap()->GetEntry()->addon > 1) - me->SetCanFly(true); - } - - void Reset() override - { - _events.Reset(); - _events.ScheduleEvent(EVENT_MOVE_POS, urandms(1, 20)); - } - - void UpdateAI(uint32 diff) override - { - _events.Update(diff); - - while (uint32 eventId = _events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_MOVE_POS: - if (Unit* owner = me->GetCharmerOrOwner()) - { - me->GetMotionMaster()->Clear(); - me->GetMotionMaster()->MovePoint(0, owner->GetPositionX() + frand(-30.0f, 30.0f), owner->GetPositionY() + frand(-30.0f, 30.0f), owner->GetPositionZ()); - } - _events.ScheduleEvent(EVENT_RETURN, urandms(3, 4)); - break; - case EVENT_RETURN: - if (Unit* owner = me->GetCharmerOrOwner()) - me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, me->GetFollowAngle()); - _events.ScheduleEvent(EVENT_MOVE_POS, urandms(1, 20)); - break; - default: - break; - } - } - } - private: - EventMap _events; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_egbertAI(creature); - } -}; - -enum PandarenMonkMisc -{ - SPELL_PANDAREN_MONK = 69800, - EVENT_FOCUS = 1, - EVENT_EMOTE = 2, - EVENT_FOLLOW = 3, - EVENT_DRINK = 4 -}; - -class npc_pandaren_monk : public CreatureScript -{ -public: - npc_pandaren_monk() : CreatureScript("npc_pandaren_monk") {} - - struct npc_pandaren_monkAI : public NullCreatureAI - { - npc_pandaren_monkAI(Creature* creature) : NullCreatureAI(creature) { } - - void Reset() override - { - _events.Reset(); - _events.ScheduleEvent(EVENT_FOCUS, 1000); - } - - void EnterEvadeMode(EvadeReason why) override - { - if (!_EnterEvadeMode(why)) - return; - - Reset(); - } - - void ReceiveEmote(Player* /*player*/, uint32 emote) override - { - me->InterruptSpell(CURRENT_CHANNELED_SPELL); - me->StopMoving(); - - switch (emote) - { - case TEXT_EMOTE_BOW: - _events.ScheduleEvent(EVENT_FOCUS, 1000); - break; - case TEXT_EMOTE_DRINK: - _events.ScheduleEvent(EVENT_DRINK, 1000); - break; - } - } - - void UpdateAI(uint32 diff) override - { - _events.Update(diff); - - if (Unit* owner = me->GetCharmerOrOwner()) - if (!me->IsWithinDist(owner, 30.f)) - me->InterruptSpell(CURRENT_CHANNELED_SPELL); - - while (uint32 eventId = _events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_FOCUS: - if (Unit* owner = me->GetCharmerOrOwner()) - me->SetFacingToObject(owner); - _events.ScheduleEvent(EVENT_EMOTE, 1000); - break; - case EVENT_EMOTE: - me->HandleEmoteCommand(EMOTE_ONESHOT_BOW); - _events.ScheduleEvent(EVENT_FOLLOW, 1000); - break; - case EVENT_FOLLOW: - if (Unit* owner = me->GetCharmerOrOwner()) - me->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); - break; - case EVENT_DRINK: - me->CastSpell(me, SPELL_PANDAREN_MONK, false); - break; - default: - break; - } - } - } - private: - EventMap _events; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new npc_pandaren_monkAI(creature); - } -}; - void AddSC_npcs_special() { new npc_air_force_bots(); @@ -2750,6 +2596,4 @@ void AddSC_npcs_special() new npc_imp_in_a_ball(); new npc_stable_master(); new npc_train_wrecker(); - new npc_egbert(); - new npc_pandaren_monk(); } diff --git a/src/server/scripts/World/world_script_loader.cpp b/src/server/scripts/World/world_script_loader.cpp new file mode 100644 index 00000000000..0167024799f --- /dev/null +++ b/src/server/scripts/World/world_script_loader.cpp @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "World.h" + +// This is where scripts' loading functions should be declared: +// world +void AddSC_areatrigger_scripts(); +void AddSC_emerald_dragons(); +void AddSC_generic_creature(); +void AddSC_go_scripts(); +void AddSC_guards(); +void AddSC_item_scripts(); +void AddSC_npc_professions(); +void AddSC_npc_innkeeper(); +void AddSC_npcs_special(); +void AddSC_achievement_scripts(); +void AddSC_action_ip_logger(); +void AddSC_duel_reset(); +// player +void AddSC_chat_log(); +void AddSC_action_ip_logger(); + +// The name of this function should match: +// void Add${NameOfDirectory}Scripts() +void AddWorldScripts() +{ + AddSC_areatrigger_scripts(); + AddSC_emerald_dragons(); + AddSC_generic_creature(); + AddSC_go_scripts(); + AddSC_guards(); + AddSC_item_scripts(); + AddSC_npc_professions(); + AddSC_npc_innkeeper(); + AddSC_npcs_special(); + AddSC_achievement_scripts(); + AddSC_chat_log(); // location: scripts\World\chat_log.cpp + + // FIXME: This should be moved in a script validation hook. + // To avoid duplicate code, we check once /*ONLY*/ if logging is permitted or not. + if (sWorld->getBoolConfig(CONFIG_IP_BASED_ACTION_LOGGING)) + AddSC_action_ip_logger(); // location: scripts\World\action_ip_logger.cpp + AddSC_duel_reset(); +} diff --git a/src/server/shared/Networking/AsyncAcceptor.h b/src/server/shared/Networking/AsyncAcceptor.h index 260e1c8ea11..0f3fd9a145b 100644 --- a/src/server/shared/Networking/AsyncAcceptor.h +++ b/src/server/shared/Networking/AsyncAcceptor.h @@ -20,34 +20,39 @@ #include "Log.h" #include <boost/asio.hpp> +#include <functional> using boost::asio::ip::tcp; class AsyncAcceptor { public: - typedef void(*ManagerAcceptHandler)(tcp::socket&& newSocket); + typedef void(*AcceptCallback)(tcp::socket&& newSocket, uint32 threadIndex); AsyncAcceptor(boost::asio::io_service& ioService, std::string const& bindIp, uint16 port) : _acceptor(ioService, tcp::endpoint(boost::asio::ip::address::from_string(bindIp), port)), - _socket(ioService) + _socket(ioService), _closed(false), _socketFactory(std::bind(&AsyncAcceptor::DefeaultSocketFactory, this)) { } - template <class T> + template<class T> void AsyncAccept(); - void AsyncAcceptManaged(ManagerAcceptHandler mgrHandler) + template<AcceptCallback acceptCallback> + void AsyncAcceptWithCallback() { - _acceptor.async_accept(_socket, [this, mgrHandler](boost::system::error_code error) + tcp::socket* socket; + uint32 threadIndex; + std::tie(socket, threadIndex) = _socketFactory(); + _acceptor.async_accept(*socket, [this, socket, threadIndex](boost::system::error_code error) { if (!error) { try { - _socket.non_blocking(true); + socket->non_blocking(true); - mgrHandler(std::move(_socket)); + acceptCallback(std::move(*socket), threadIndex); } catch (boost::system::system_error const& err) { @@ -55,13 +60,29 @@ public: } } - AsyncAcceptManaged(mgrHandler); + if (!_closed) + this->AsyncAcceptWithCallback<acceptCallback>(); }); } + void Close() + { + if (_closed.exchange(true)) + return; + + boost::system::error_code err; + _acceptor.close(err); + } + + void SetSocketFactory(std::function<std::pair<tcp::socket*, uint32>()> func) { _socketFactory = func; } + private: + std::pair<tcp::socket*, uint32> DefeaultSocketFactory() { return std::make_pair(&_socket, 0); } + tcp::acceptor _acceptor; tcp::socket _socket; + std::atomic<bool> _closed; + std::function<std::pair<tcp::socket*, uint32>()> _socketFactory; }; template<class T> @@ -83,7 +104,8 @@ void AsyncAcceptor::AsyncAccept() } // lets slap some more this-> on this so we can fix this bug with gcc 4.7.2 throwing internals in yo face - this->AsyncAccept<T>(); + if (!_closed) + this->AsyncAccept<T>(); }); } diff --git a/src/server/shared/Networking/MessageBuffer.h b/src/server/shared/Networking/MessageBuffer.h index 189a56f18b6..d68bee181b1 100644 --- a/src/server/shared/Networking/MessageBuffer.h +++ b/src/server/shared/Networking/MessageBuffer.h @@ -105,7 +105,7 @@ public: return std::move(_storage); } - MessageBuffer& operator=(MessageBuffer& right) + MessageBuffer& operator=(MessageBuffer const& right) { if (this != &right) { diff --git a/src/server/shared/Networking/NetworkThread.h b/src/server/shared/Networking/NetworkThread.h index ac216838bce..be0e9f10176 100644 --- a/src/server/shared/Networking/NetworkThread.h +++ b/src/server/shared/Networking/NetworkThread.h @@ -22,6 +22,8 @@ #include "Errors.h" #include "Log.h" #include "Timer.h" +#include <boost/asio/ip/tcp.hpp> +#include <boost/asio/deadline_timer.hpp> #include <atomic> #include <chrono> #include <memory> @@ -29,11 +31,14 @@ #include <set> #include <thread> +using boost::asio::ip::tcp; + template<class SocketType> class NetworkThread { public: - NetworkThread() : _connections(0), _stopped(false), _thread(nullptr) + NetworkThread() : _connections(0), _stopped(false), _thread(nullptr), + _acceptSocket(_io_service), _updateTimer(_io_service) { } @@ -50,6 +55,7 @@ public: void Stop() { _stopped = true; + _io_service.stop(); } bool Start() @@ -80,10 +86,12 @@ public: std::lock_guard<std::mutex> lock(_newSocketsLock); ++_connections; - _newSockets.insert(sock); + _newSockets.push_back(sock); SocketAdded(sock); } + tcp::socket* GetSocketForAccept() { return &_acceptSocket; } + protected: virtual void SocketAdded(std::shared_ptr<SocketType> /*sock*/) { } virtual void SocketRemoved(std::shared_ptr<SocketType> /*sock*/) { } @@ -95,16 +103,15 @@ protected: if (_newSockets.empty()) return; - for (typename SocketSet::const_iterator i = _newSockets.begin(); i != _newSockets.end(); ++i) + for (std::shared_ptr<SocketType> sock : _newSockets) { - if (!(*i)->IsOpen()) + if (!sock->IsOpen()) { - SocketRemoved(*i); - + SocketRemoved(sock); --_connections; } else - _Sockets.insert(*i); + _sockets.push_back(sock); } _newSockets.clear(); @@ -114,53 +121,58 @@ protected: { TC_LOG_DEBUG("misc", "Network Thread Starting"); - typename SocketSet::iterator i, t; + _updateTimer.expires_from_now(boost::posix_time::milliseconds(10)); + _updateTimer.async_wait(std::bind(&NetworkThread<SocketType>::Update, this)); + _io_service.run(); - uint32 sleepTime = 10; - uint32 tickStart = 0, diff = 0; - while (!_stopped) - { - std::this_thread::sleep_for(std::chrono::milliseconds(sleepTime)); + TC_LOG_DEBUG("misc", "Network Thread exits"); + _newSockets.clear(); + _sockets.clear(); + } + + void Update() + { + if (_stopped) + return; - tickStart = getMSTime(); + _updateTimer.expires_from_now(boost::posix_time::milliseconds(10)); + _updateTimer.async_wait(std::bind(&NetworkThread<SocketType>::Update, this)); - AddNewSockets(); + AddNewSockets(); - for (i = _Sockets.begin(); i != _Sockets.end();) + _sockets.erase(std::remove_if(_sockets.begin(), _sockets.end(), [this](std::shared_ptr<SocketType> sock) + { + if (!sock->Update()) { - if (!(*i)->Update()) - { - if ((*i)->IsOpen()) - (*i)->CloseSocket(); - - SocketRemoved(*i); - - --_connections; - _Sockets.erase(i++); - } - else - ++i; - } + if (sock->IsOpen()) + sock->CloseSocket(); - diff = GetMSTimeDiffToNow(tickStart); - sleepTime = diff > 10 ? 0 : 10 - diff; - } + this->SocketRemoved(sock); - TC_LOG_DEBUG("misc", "Network Thread exits"); + --this->_connections; + return true; + } + + return false; + }), _sockets.end()); } private: - typedef std::set<std::shared_ptr<SocketType> > SocketSet; + typedef std::vector<std::shared_ptr<SocketType>> SocketContainer; std::atomic<int32> _connections; std::atomic<bool> _stopped; std::thread* _thread; - SocketSet _Sockets; + SocketContainer _sockets; std::mutex _newSocketsLock; - SocketSet _newSockets; + SocketContainer _newSockets; + + boost::asio::io_service _io_service; + tcp::socket _acceptSocket; + boost::asio::deadline_timer _updateTimer; }; #endif // NetworkThread_h__ diff --git a/src/server/shared/Networking/Socket.h b/src/server/shared/Networking/Socket.h index a2f57b5029e..d1ba7f49aa4 100644 --- a/src/server/shared/Networking/Socket.h +++ b/src/server/shared/Networking/Socket.h @@ -21,15 +21,11 @@ #include "MessageBuffer.h" #include "Log.h" #include <atomic> -#include <vector> -#include <mutex> #include <queue> #include <memory> #include <functional> #include <type_traits> #include <boost/asio/ip/tcp.hpp> -#include <boost/asio/write.hpp> -#include <boost/asio/read.hpp> using boost::asio::ip::tcp; @@ -63,14 +59,10 @@ public: return false; #ifndef TC_SOCKET_USE_IOCP - std::unique_lock<std::mutex> guard(_writeLock); - if (!guard) + if (_isWritingAsync || _writeQueue.empty()) return true; - if (_isWritingAsync || (!_writeBuffer.GetActiveSize() && _writeQueue.empty())) - return true; - - for (; WriteHandler(guard);) + for (; HandleQueue();) ; #endif @@ -98,14 +90,12 @@ public: std::bind(&Socket<T>::ReadHandlerInternal, this->shared_from_this(), std::placeholders::_1, std::placeholders::_2)); } - void QueuePacket(MessageBuffer&& buffer, std::unique_lock<std::mutex>& guard) + void QueuePacket(MessageBuffer&& buffer) { _writeQueue.push(std::move(buffer)); #ifdef TC_SOCKET_USE_IOCP - AsyncProcessQueue(guard); -#else - (void)guard; + AsyncProcessQueue(); #endif } @@ -135,7 +125,7 @@ protected: virtual void ReadHandler() = 0; - bool AsyncProcessQueue(std::unique_lock<std::mutex>&) + bool AsyncProcessQueue() { if (_isWritingAsync) return false; @@ -154,14 +144,6 @@ protected: return false; } - std::mutex _writeLock; - std::queue<MessageBuffer> _writeQueue; -#ifndef TC_SOCKET_USE_IOCP - MessageBuffer _writeBuffer; -#endif - - boost::asio::io_service& io_service() { return _socket.get_io_service(); } - private: void ReadHandlerInternal(boost::system::error_code error, size_t transferredBytes) { @@ -181,15 +163,13 @@ private: { if (!error) { - std::unique_lock<std::mutex> deleteGuard(_writeLock); - _isWritingAsync = false; _writeQueue.front().ReadCompleted(transferedBytes); if (!_writeQueue.front().GetActiveSize()) _writeQueue.pop(); if (!_writeQueue.empty()) - AsyncProcessQueue(deleteGuard); + AsyncProcessQueue(); else if (_closing) CloseSocket(); } @@ -201,48 +181,15 @@ private: void WriteHandlerWrapper(boost::system::error_code /*error*/, std::size_t /*transferedBytes*/) { - std::unique_lock<std::mutex> guard(_writeLock); _isWritingAsync = false; - WriteHandler(guard); + HandleQueue(); } - bool WriteHandler(std::unique_lock<std::mutex>& guard) + bool HandleQueue() { if (!IsOpen()) return false; - std::size_t bytesToSend = _writeBuffer.GetActiveSize(); - - if (bytesToSend == 0) - return HandleQueue(guard); - - boost::system::error_code error; - std::size_t bytesWritten = _socket.write_some(boost::asio::buffer(_writeBuffer.GetReadPointer(), bytesToSend), error); - - if (error) - { - if (error == boost::asio::error::would_block || error == boost::asio::error::try_again) - return AsyncProcessQueue(guard); - - return false; - } - else if (bytesWritten == 0) - return false; - else if (bytesWritten < bytesToSend) - { - _writeBuffer.ReadCompleted(bytesWritten); - _writeBuffer.Normalize(); - return AsyncProcessQueue(guard); - } - - // now bytesWritten == bytesToSend - _writeBuffer.Reset(); - - return HandleQueue(guard); - } - - bool HandleQueue(std::unique_lock<std::mutex>& guard) - { if (_writeQueue.empty()) return false; @@ -256,7 +203,7 @@ private: if (error) { if (error == boost::asio::error::would_block || error == boost::asio::error::try_again) - return AsyncProcessQueue(guard); + return AsyncProcessQueue(); _writeQueue.pop(); return false; @@ -269,7 +216,7 @@ private: else if (bytesSent < bytesToSend) // now n > 0 { queuedMessage.ReadCompleted(bytesSent); - return AsyncProcessQueue(guard); + return AsyncProcessQueue(); } _writeQueue.pop(); @@ -284,6 +231,7 @@ private: uint16 _remotePort; MessageBuffer _readBuffer; + std::queue<MessageBuffer> _writeQueue; std::atomic<bool> _closed; std::atomic<bool> _closing; diff --git a/src/server/shared/Networking/SocketMgr.h b/src/server/shared/Networking/SocketMgr.h index ce5bc2d8fc2..b14aac4ca47 100644 --- a/src/server/shared/Networking/SocketMgr.h +++ b/src/server/shared/Networking/SocketMgr.h @@ -33,7 +33,7 @@ class SocketMgr public: virtual ~SocketMgr() { - delete[] _threads; + ASSERT(!_threads && !_acceptor && !_threadCount, "StopNetwork must be called prior to SocketMgr destruction"); } virtual bool StartNetwork(boost::asio::io_service& service, std::string const& bindIp, uint16 port) @@ -68,11 +68,19 @@ public: virtual void StopNetwork() { + _acceptor->Close(); + if (_threadCount != 0) for (int32 i = 0; i < _threadCount; ++i) _threads[i].Stop(); Wait(); + + delete _acceptor; + _acceptor = nullptr; + delete[] _threads; + _threads = nullptr; + _threadCount = 0; } void Wait() @@ -82,20 +90,14 @@ public: _threads[i].Wait(); } - virtual void OnSocketOpen(tcp::socket&& sock) + virtual void OnSocketOpen(tcp::socket&& sock, uint32 threadIndex) { - size_t min = 0; - - for (int32 i = 1; i < _threadCount; ++i) - if (_threads[i].GetConnectionCount() < _threads[min].GetConnectionCount()) - min = i; - try { std::shared_ptr<SocketType> newSocket = std::make_shared<SocketType>(std::move(sock)); newSocket->Start(); - _threads[min].AddSocket(newSocket); + _threads[threadIndex].AddSocket(newSocket); } catch (boost::system::system_error const& err) { @@ -105,6 +107,23 @@ public: int32 GetNetworkThreadCount() const { return _threadCount; } + uint32 SelectThreadWithMinConnections() const + { + uint32 min = 0; + + for (int32 i = 1; i < _threadCount; ++i) + if (_threads[i].GetConnectionCount() < _threads[min].GetConnectionCount()) + min = i; + + return min; + } + + std::pair<tcp::socket*, uint32> GetSocketForAccept() + { + uint32 threadIndex = SelectThreadWithMinConnections(); + return std::make_pair(_threads[threadIndex].GetSocketForAccept(), threadIndex); + } + protected: SocketMgr() : _acceptor(nullptr), _threads(nullptr), _threadCount(1) { diff --git a/src/server/worldserver/CMakeLists.txt b/src/server/worldserver/CMakeLists.txt index 535383ac605..99495986842 100644 --- a/src/server/worldserver/CMakeLists.txt +++ b/src/server/worldserver/CMakeLists.txt @@ -131,10 +131,10 @@ set_target_properties(worldserver PROPERTIES LINK_FLAGS "${worldserver_LINK_FLAG target_link_libraries(worldserver game - common + scripts shared database - scripts + common g3dlib gsoap Detour diff --git a/src/server/worldserver/Main.cpp b/src/server/worldserver/Main.cpp index 53c5f250851..58ddce532c0 100644 --- a/src/server/worldserver/Main.cpp +++ b/src/server/worldserver/Main.cpp @@ -449,9 +449,9 @@ bool StartDB() // Load databases DatabaseLoader loader("server.worldserver", DatabaseLoader::DATABASE_NONE); loader - .AddDatabase(WorldDatabase, "World") + .AddDatabase(LoginDatabase, "Login") .AddDatabase(CharacterDatabase, "Character") - .AddDatabase(LoginDatabase, "Login"); + .AddDatabase(WorldDatabase, "World"); if (!loader.Load()) return false; diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index 217995cb88a..05d303cfd9b 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -161,6 +161,45 @@ BindIP = "0.0.0.0" ThreadPool = 2 # +# CMakeCommand +# Description: The path to your CMake binary. +# If the path is left empty, the built-in CMAKE_COMMAND is used. +# Example: "C:/Program Files (x86)/CMake/bin/cmake.exe" +# "/usr/bin/cmake" +# Default: "" + +CMakeCommand = "" + +# +# BuildDirectory +# Description: The path to your build directory. +# If the path is left empty, the built-in CMAKE_BINARY_DIR is used. +# Example: "../TrinityCore" +# Default: "" + +BuildDirectory = "" + +# +# SourceDirectory +# Description: The path to your TrinityCore source directory. +# If the path is left empty, the built-in CMAKE_SOURCE_DIR is used. +# Example: "../TrinityCore" +# Default: "" + +SourceDirectory = "" + +# +# MySQLExecutable +# Description: The path to your mysql cli binary. +# If the path is left empty, built-in path from cmake is used. +# Example: "C:/Program Files/MySQL/MySQL Server 5.6/bin/mysql.exe" +# "mysql.exe" +# "/usr/bin/mysql" +# Default: "" + +MySQLExecutable = "" + +# ################################################################################################### ################################################################################################### @@ -1167,26 +1206,6 @@ BirthdayTime = 1222964635 Updates.EnableDatabases = 7 # -# Updates.SourcePath -# Description: The path to your TrinityCore source directory. -# If the path is left empty, built-in CMAKE_SOURCE_DIR is used. -# Example: "../TrinityCore" -# Default: "" - -Updates.SourcePath = "" - -# -# Updates.MySqlCLIPath -# Description: The path to your mysql cli binary. -# If the path is left empty, built-in path from cmake is used. -# Example: "C:/Program Files/MySQL/MySQL Server 5.6/bin/mysql.exe" -# "mysql.exe" -# "/usr/bin/mysql" -# Default: "" - -Updates.MySqlCLIPath = "" - -# # Updates.AutoSetup # Description: Auto populate empty databases. # Default: 1 - (Enabled) @@ -1354,10 +1373,11 @@ AllowTwoSide.Trade = 0 # # TalentsInspecting -# Description: Allow inspecting characters from the opposing faction. -# Doesn't affect characters in gamemaster mode. -# Default: 1 - (Enabled) -# 0 - (Disabled) +# Description: Allow/disallow inspecting other characters' talents. +# Doesn't affect game master accounts. +# 2 - (Enabled for all characters) +# Default: 1 - (Enabled for characters of the same faction) +# 0 - (Talent inspecting is disabled) TalentsInspecting = 1 diff --git a/src/tools/map_extractor/CMakeLists.txt b/src/tools/map_extractor/CMakeLists.txt index e86ef6aedcb..d0f3e42cef8 100644 --- a/src/tools/map_extractor/CMakeLists.txt +++ b/src/tools/map_extractor/CMakeLists.txt @@ -14,6 +14,7 @@ file(GLOB_RECURSE mapextractor_SRCS *.cpp *.h) set(include_Dirs ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/dep/cppformat + ${CMAKE_SOURCE_DIR}/dep/g3dlite/include ${CMAKE_SOURCE_DIR}/dep/libmpq ${CMAKE_SOURCE_DIR}/src/common ${CMAKE_SOURCE_DIR}/src/common/Utilities @@ -37,6 +38,7 @@ add_executable(mapextractor target_link_libraries(mapextractor common format + g3dlib mpq ${BZIP2_LIBRARIES} ${ZLIB_LIBRARIES} diff --git a/src/tools/map_extractor/System.cpp b/src/tools/map_extractor/System.cpp index 5d1c31ba2dc..f3a761fd437 100644 --- a/src/tools/map_extractor/System.cpp +++ b/src/tools/map_extractor/System.cpp @@ -31,6 +31,7 @@ #include "adt.h" #include "wdt.h" +#include <G3D/Plane.h> #include <boost/filesystem.hpp> extern ArchiveSet gOpenArchives; @@ -42,12 +43,10 @@ typedef struct } map_id; map_id *map_ids; -uint16 *areas; uint16 *LiqType; #define MAX_PATH_LENGTH 128 char output_path[MAX_PATH_LENGTH] = "."; char input_path[MAX_PATH_LENGTH] = "."; -uint32 maxAreaId = 0; // ************************************************** // Extractor options @@ -231,30 +230,6 @@ uint32 ReadMapDBC() return map_count; } -void ReadAreaTableDBC() -{ - printf("Read AreaTable.dbc file..."); - DBCFile dbc("DBFilesClient\\AreaTable.dbc"); - - if(!dbc.open()) - { - printf("Fatal error: Invalid AreaTable.dbc file format!\n"); - exit(1); - } - - size_t area_count = dbc.getRecordCount(); - size_t maxid = dbc.getMaxId(); - areas = new uint16[maxid + 1]; - memset(areas, 0xff, (maxid + 1) * sizeof(uint16)); - - for(uint32 x = 0; x < area_count; ++x) - areas[dbc.getRecord(x).getUInt(0)] = dbc.getRecord(x).getUInt(3); - - maxAreaId = dbc.getMaxId(); - - printf("Done! (" SZFMTD " areas loaded)\n", area_count); -} - void ReadLiquidTypeTableDBC() { printf("Read LiquidType.dbc file..."); @@ -282,7 +257,7 @@ void ReadLiquidTypeTableDBC() // Map file format data static char const* MAP_MAGIC = "MAPS"; -static char const* MAP_VERSION_MAGIC = "v1.3"; +static char const* MAP_VERSION_MAGIC = "v1.8"; static char const* MAP_AREA_MAGIC = "AREA"; static char const* MAP_HEIGHT_MAGIC = "MHGT"; static char const* MAP_LIQUID_MAGIC = "MLIQ"; @@ -311,9 +286,10 @@ struct map_areaHeader uint16 gridArea; }; -#define MAP_HEIGHT_NO_HEIGHT 0x0001 -#define MAP_HEIGHT_AS_INT16 0x0002 -#define MAP_HEIGHT_AS_INT8 0x0004 +#define MAP_HEIGHT_NO_HEIGHT 0x0001 +#define MAP_HEIGHT_AS_INT16 0x0002 +#define MAP_HEIGHT_AS_INT8 0x0004 +#define MAP_HEIGHT_HAS_FLIGHT_BOUNDS 0x0008 struct map_heightHeader { @@ -358,7 +334,7 @@ float selectUInt16StepStore(float maxDiff) return 65535 / maxDiff; } // Temporary grid data store -uint16 area_flags[ADT_CELLS_PER_GRID][ADT_CELLS_PER_GRID]; +uint16 area_ids[ADT_CELLS_PER_GRID][ADT_CELLS_PER_GRID]; float V8[ADT_GRID_SIZE][ADT_GRID_SIZE]; float V9[ADT_GRID_SIZE+1][ADT_GRID_SIZE+1]; @@ -372,6 +348,9 @@ uint8 liquid_flags[ADT_CELLS_PER_GRID][ADT_CELLS_PER_GRID]; bool liquid_show[ADT_GRID_SIZE][ADT_GRID_SIZE]; float liquid_height[ADT_GRID_SIZE+1][ADT_GRID_SIZE+1]; +int16 flight_box_max[3][3]; +int16 flight_box_min[3][3]; + bool ConvertADT(std::string const& inputPath, std::string const& outputPath, int /*cell_y*/, int /*cell_x*/, uint32 build) { ADT_file adt; @@ -397,34 +376,20 @@ bool ConvertADT(std::string const& inputPath, std::string const& outputPath, int map.buildMagic = build; // Get area flags data - for (int i=0;i<ADT_CELLS_PER_GRID;i++) - { - for(int j=0;j<ADT_CELLS_PER_GRID;j++) - { - adt_MCNK * cell = cells->getMCNK(i,j); - uint32 areaid = cell->areaid; - if(areaid && areaid <= maxAreaId) - { - if(areas[areaid] != 0xffff) - { - area_flags[i][j] = areas[areaid]; - continue; - } - printf("File: %s\nCan't find area flag for areaid %u [%d, %d].\n", inputPath.c_str(), areaid, cell->ix, cell->iy); - } - area_flags[i][j] = 0xffff; - } - } + for (int i = 0; i < ADT_CELLS_PER_GRID; i++) + for (int j = 0; j < ADT_CELLS_PER_GRID; j++) + area_ids[i][j] = cells->getMCNK(i, j)->areaid; + //============================================ // Try pack area data //============================================ bool fullAreaData = false; - uint32 areaflag = area_flags[0][0]; - for (int y=0;y<ADT_CELLS_PER_GRID;y++) + uint32 areaId = area_ids[0][0]; + for (int y = 0; y < ADT_CELLS_PER_GRID; ++y) { - for(int x=0;x<ADT_CELLS_PER_GRID;x++) + for (int x = 0; x < ADT_CELLS_PER_GRID; ++x) { - if(area_flags[y][x]!=areaflag) + if (area_ids[y][x] != areaId) { fullAreaData = true; break; @@ -441,12 +406,12 @@ bool ConvertADT(std::string const& inputPath, std::string const& outputPath, int if (fullAreaData) { areaHeader.gridArea = 0; - map.areaMapSize+=sizeof(area_flags); + map.areaMapSize += sizeof(area_ids); } else { areaHeader.flags |= MAP_AREA_NO_AREA; - areaHeader.gridArea = static_cast<uint16>(areaflag); + areaHeader.gridArea = static_cast<uint16>(areaId); } // @@ -561,6 +526,14 @@ bool ConvertADT(std::string const& inputPath, std::string const& outputPath, int maxHeight = CONF_use_minHeight; } + bool hasFlightBox = false; + if (adt_MFBO* mfbo = adt.a_grid->getMFBO()) + { + memcpy(flight_box_max, &mfbo->max, sizeof(flight_box_max)); + memcpy(flight_box_min, &mfbo->min, sizeof(flight_box_min)); + hasFlightBox = true; + } + map.heightMapOffset = map.areaMapOffset + map.areaMapSize; map.heightMapSize = sizeof(map_heightHeader); @@ -577,6 +550,12 @@ bool ConvertADT(std::string const& inputPath, std::string const& outputPath, int if (CONF_allow_float_to_int && (maxHeight - minHeight) < CONF_flat_height_delta_limit) heightHeader.flags |= MAP_HEIGHT_NO_HEIGHT; + if (hasFlightBox) + { + heightHeader.flags |= MAP_HEIGHT_HAS_FLIGHT_BOUNDS; + map.heightMapSize += sizeof(flight_box_max) + sizeof(flight_box_min); + } + // Try store as packed in uint16 or uint8 values if (!(heightHeader.flags & MAP_HEIGHT_NO_HEIGHT)) { @@ -875,8 +854,8 @@ bool ConvertADT(std::string const& inputPath, std::string const& outputPath, int outFile.write(reinterpret_cast<const char*>(&map), sizeof(map)); // Store area data outFile.write(reinterpret_cast<const char*>(&areaHeader), sizeof(areaHeader)); - if (!(areaHeader.flags&MAP_AREA_NO_AREA)) - outFile.write(reinterpret_cast<const char*>(area_flags), sizeof(area_flags)); + if (!(areaHeader.flags & MAP_AREA_NO_AREA)) + outFile.write(reinterpret_cast<const char*>(area_ids), sizeof(area_ids)); // Store height data outFile.write(reinterpret_cast<const char*>(&heightHeader), sizeof(heightHeader)); @@ -899,6 +878,12 @@ bool ConvertADT(std::string const& inputPath, std::string const& outputPath, int } } + if (heightHeader.flags & MAP_HEIGHT_HAS_FLIGHT_BOUNDS) + { + outFile.write(reinterpret_cast<char*>(flight_box_max), sizeof(flight_box_max)); + outFile.write(reinterpret_cast<char*>(flight_box_min), sizeof(flight_box_min)); + } + // Store liquid data if need if (map.liquidMapOffset) { @@ -935,7 +920,6 @@ void ExtractMapsFromMpq(uint32 build) uint32 map_count = ReadMapDBC(); - ReadAreaTableDBC(); ReadLiquidTypeTableDBC(); std::string path = output_path; @@ -972,8 +956,7 @@ void ExtractMapsFromMpq(uint32 build) } } printf("\n"); - delete [] areas; - delete [] map_ids; + delete[] map_ids; } bool ExtractFile( char const* mpq_name, std::string const& filename ) diff --git a/src/tools/map_extractor/adt.cpp b/src/tools/map_extractor/adt.cpp index f8e6e469ff0..e97b40475d0 100644 --- a/src/tools/map_extractor/adt.cpp +++ b/src/tools/map_extractor/adt.cpp @@ -21,15 +21,16 @@ #include "adt.h" // Helper -int holetab_h[4] = {0x1111, 0x2222, 0x4444, 0x8888}; -int holetab_v[4] = {0x000F, 0x00F0, 0x0F00, 0xF000}; +int holetab_h[4] = { 0x1111, 0x2222, 0x4444, 0x8888 }; +int holetab_v[4] = { 0x000F, 0x00F0, 0x0F00, 0xF000 }; -u_map_fcc MHDRMagic = { {'R','D','H','M'} }; -u_map_fcc MCINMagic = { {'N','I','C','M'} }; -u_map_fcc MH2OMagic = { {'O','2','H','M'} }; -u_map_fcc MCNKMagic = { {'K','N','C','M'} }; -u_map_fcc MCVTMagic = { {'T','V','C','M'} }; -u_map_fcc MCLQMagic = { {'Q','L','C','M'} }; +u_map_fcc MHDRMagic = { { 'R','D','H','M' } }; +u_map_fcc MCINMagic = { { 'N','I','C','M' } }; +u_map_fcc MH2OMagic = { { 'O','2','H','M' } }; +u_map_fcc MCNKMagic = { { 'K','N','C','M' } }; +u_map_fcc MCVTMagic = { { 'T','V','C','M' } }; +u_map_fcc MCLQMagic = { { 'Q','L','C','M' } }; +u_map_fcc MFBOMagic = { { 'O','B','F','M' } }; bool isHole(int holes, int i, int j) { @@ -81,7 +82,7 @@ bool adt_MHDR::prepareLoadedData() if (fcc != MHDRMagic.fcc) return false; - if (size!=sizeof(adt_MHDR)-8) + if (size != sizeof(adt_MHDR) - 8) return false; // Check and prepare MCIN @@ -92,6 +93,9 @@ bool adt_MHDR::prepareLoadedData() if (offsMH2O && !getMH2O()->prepareLoadedData()) return false; + if (offsMFBO && flags & 1 && !getMFBO()->prepareLoadedData()) + return false; + return true; } @@ -154,3 +158,8 @@ bool adt_MCLQ::prepareLoadedData() return true; } + +bool adt_MFBO::prepareLoadedData() +{ + return fcc == MFBOMagic.fcc; +} diff --git a/src/tools/map_extractor/adt.h b/src/tools/map_extractor/adt.h index 7b3dc07ae84..30389939f38 100644 --- a/src/tools/map_extractor/adt.h +++ b/src/tools/map_extractor/adt.h @@ -263,6 +263,28 @@ public: }; // +// Adt file min/max height chunk +// +class adt_MFBO +{ + union + { + uint32 fcc; + char fcc_txt[4]; + }; +public: + uint32 size; + struct plane + { + int16 coords[9]; + }; + plane max; + plane min; + + bool prepareLoadedData(); +}; + +// // Adt file header chunk // class adt_MHDR @@ -274,12 +296,12 @@ class adt_MHDR public: uint32 size; - uint32 pad; + uint32 flags; uint32 offsMCIN; // MCIN - uint32 offsTex; // MTEX - uint32 offsModels; // MMDX - uint32 offsModelsIds; // MMID - uint32 offsMapObejcts; // MWMO + uint32 offsTex; // MTEX + uint32 offsModels; // MMDX + uint32 offsModelsIds; // MMID + uint32 offsMapObejcts; // MWMO uint32 offsMapObejctsIds; // MWID uint32 offsDoodsDef; // MDDF uint32 offsObjectsDef; // MODF @@ -291,9 +313,22 @@ public: uint32 data4; uint32 data5; bool prepareLoadedData(); - adt_MCIN *getMCIN(){ return (adt_MCIN *)((uint8 *)&pad+offsMCIN);} - adt_MH2O *getMH2O(){ return offsMH2O ? (adt_MH2O *)((uint8 *)&pad+offsMH2O) : 0;} - + adt_MCIN* getMCIN() + { + return reinterpret_cast<adt_MCIN*>(reinterpret_cast<uint8*>(&flags) + offsMCIN); + } + adt_MH2O* getMH2O() + { + if (offsMH2O) + return reinterpret_cast<adt_MH2O*>(reinterpret_cast<uint8*>(&flags) + offsMH2O); + return nullptr; + } + adt_MFBO* getMFBO() + { + if (flags & 1 && offsMFBO) + return reinterpret_cast<adt_MFBO*>(reinterpret_cast<uint8*>(&flags) + offsMFBO); + return nullptr; + } }; class ADT_file : public FileLoader{ diff --git a/src/tools/mmaps_generator/MapBuilder.cpp b/src/tools/mmaps_generator/MapBuilder.cpp index 3a63f9718db..80b7b266f27 100644 --- a/src/tools/mmaps_generator/MapBuilder.cpp +++ b/src/tools/mmaps_generator/MapBuilder.cpp @@ -699,7 +699,7 @@ namespace MMAP iv.polyMesh = rcAllocPolyMesh(); if (!iv.polyMesh) { - printf("%s alloc iv.polyMesh FIALED!\n", tileString); + printf("%s alloc iv.polyMesh FAILED!\n", tileString); delete[] pmmerge; delete[] dmmerge; delete[] tiles; @@ -710,7 +710,7 @@ namespace MMAP iv.polyMeshDetail = rcAllocPolyMeshDetail(); if (!iv.polyMeshDetail) { - printf("%s alloc m_dmesh FIALED!\n", tileString); + printf("%s alloc m_dmesh FAILED!\n", tileString); delete[] pmmerge; delete[] dmmerge; delete[] tiles; diff --git a/src/tools/mmaps_generator/TerrainBuilder.cpp b/src/tools/mmaps_generator/TerrainBuilder.cpp index 02f3fb1cf4d..69b1ffcb062 100644 --- a/src/tools/mmaps_generator/TerrainBuilder.cpp +++ b/src/tools/mmaps_generator/TerrainBuilder.cpp @@ -80,7 +80,7 @@ struct map_liquidHeader namespace MMAP { - char const* MAP_VERSION_MAGIC = "v1.3"; + char const* MAP_VERSION_MAGIC = "v1.8"; TerrainBuilder::TerrainBuilder(bool skipLiquid) : m_skipLiquid (skipLiquid){ } TerrainBuilder::~TerrainBuilder() { } |