diff options
76 files changed, 2062 insertions, 1016 deletions
diff --git a/README.md b/README.md index 614dea777f0..2ef13384aca 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,10 @@ ## Build Status -6.x | 4.3.4 | 3.3.5 -:------------: | :------------: | :------------: -[](https://travis-ci.org/TrinityCore/TrinityCore) | [](https://travis-ci.org/TrinityCore/TrinityCore) | [](https://travis-ci.org/TrinityCore/TrinityCore) -[](https://scan.coverity.com/projects/435) | | [](https://scan.coverity.com/projects/4656) +6.x | 3.3.5 +:------------: | :------------: +[](https://travis-ci.org/TrinityCore/TrinityCore) | [](https://travis-ci.org/TrinityCore/TrinityCore) +[](https://scan.coverity.com/projects/435) | [](https://scan.coverity.com/projects/4656) ## Introduction diff --git a/cmake/macros/FindMySQL.cmake b/cmake/macros/FindMySQL.cmake index 6b00510ba42..40fa716ed69 100644 --- a/cmake/macros/FindMySQL.cmake +++ b/cmake/macros/FindMySQL.cmake @@ -63,6 +63,19 @@ if( UNIX ) endif( MYSQL_CONFIG ) endif( UNIX ) +if( WIN32 ) + # read environment variables and change \ to / + SET(PROGRAM_FILES_32 $ENV{ProgramFiles}) + if (${PROGRAM_FILES_32}) + STRING(REPLACE "\\\\" "/" PROGRAM_FILES_32 ${PROGRAM_FILES_32}) + endif(${PROGRAM_FILES_32}) + + SET(PROGRAM_FILES_64 $ENV{ProgramW6432}) + if (${PROGRAM_FILES_64}) + STRING(REPLACE "\\\\" "/" PROGRAM_FILES_64 ${PROGRAM_FILES_64}) + endif(${PROGRAM_FILES_64}) +endif ( WIN32 ) + find_path(MYSQL_INCLUDE_DIR NAMES mysql.h @@ -73,25 +86,13 @@ find_path(MYSQL_INCLUDE_DIR /usr/local/include /usr/local/include/mysql /usr/local/mysql/include - "C:/Program Files/MySQL/MySQL Server 5.6/include" - "C:/Program Files/MySQL/MySQL Server 5.5/include" - "C:/Program Files/MySQL/MySQL Server 5.1/include" - "C:/Program Files/MySQL/MySQL Server 5.0/include" - "C:/Program Files/MySQL/include" - "C:/Program Files (x86)/MySQL/MySQL Server 5.6/include" - "C:/Program Files (x86)/MySQL/MySQL Server 5.5/include" - "C:/Program Files (x86)/MySQL/MySQL Server 5.1/include" - "C:/Program Files (x86)/MySQL/MySQL Server 5.0/include" - "C:/Program Files (x86)/MySQL/include" + "${PROGRAM_FILES_64}/MySQL/*/include" + "${PROGRAM_FILES_64}/MySQL/include" + "${PROGRAM_FILES_32}/MySQL/*/include" + "${PROGRAM_FILES_32}/MySQL/include" "C:/MySQL/include" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.6;Location]/include" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.5;Location]/include" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.1;Location]/include" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.0;Location]/include" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.6;Location]/include" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.5;Location]/include" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.1;Location]/include" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.0;Location]/include" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\*;Location]/include" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\*;Location]/include" "$ENV{ProgramFiles}/MySQL/*/include" "$ENV{SystemDrive}/MySQL/*/include" "c:/msys/local/include" @@ -123,41 +124,17 @@ if( WIN32 ) libmysql PATHS ${MYSQL_ADD_LIBRARIES_PATH} - "C:/Program Files/MySQL/MySQL Server 5.6/lib" - "C:/Program Files/MySQL/MySQL Server 5.6/lib/opt" - "C:/Program Files/MySQL/MySQL Server 5.5/lib" - "C:/Program Files/MySQL/MySQL Server 5.5/lib/opt" - "C:/Program Files/MySQL/MySQL Server 5.1/lib" - "C:/Program Files/MySQL/MySQL Server 5.1/lib/opt" - "C:/Program Files/MySQL/MySQL Server 5.0/lib" - "C:/Program Files/MySQL/MySQL Server 5.0/lib/opt" - "C:/Program Files/MySQL/lib" - "C:/Program Files (x86)/MySQL/MySQL Server 5.6/lib" - "C:/Program Files (x86)/MySQL/MySQL Server 5.6/lib/opt" - "C:/Program Files (x86)/MySQL/MySQL Server 5.5/lib" - "C:/Program Files (x86)/MySQL/MySQL Server 5.5/lib/opt" - "C:/Program Files (x86)/MySQL/MySQL Server 5.1/lib" - "C:/Program Files (x86)/MySQL/MySQL Server 5.1/lib/opt" - "C:/Program Files (x86)/MySQL/MySQL Server 5.0/lib" - "C:/Program Files (x86)/MySQL/MySQL Server 5.0/lib/opt" - "C:/Program Files (x86)/MySQL/lib" + "${PROGRAM_FILES_64}/MySQL/*/lib" + "${PROGRAM_FILES_64}/MySQL/*/lib/opt" + "${PROGRAM_FILES_64}/MySQL/lib" + "${PROGRAM_FILES_32}/MySQL/*/lib" + "${PROGRAM_FILES_32}/MySQL/*/lib/opt" + "${PROGRAM_FILES_32}/MySQL/lib" "C:/MySQL/lib/debug" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.6;Location]/lib" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.6;Location]/lib/opt" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.5;Location]/lib" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.5;Location]/lib/opt" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.1;Location]/lib" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.1;Location]/lib/opt" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.0;Location]/lib" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.0;Location]/lib/opt" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.6;Location]/lib" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.6;Location]/lib/opt" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.5;Location]/lib" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.5;Location]/lib/opt" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.1;Location]/lib" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.1;Location]/lib/opt" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.0;Location]/lib" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.0;Location]/lib/opt" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\*;Location]/lib" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\*;Location]/lib/opt" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\*;Location]/lib" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\*;Location]/lib/opt" "$ENV{ProgramFiles}/MySQL/*/lib/opt" "$ENV{SystemDrive}/MySQL/*/lib/opt" "c:/msys/local/include" @@ -198,41 +175,17 @@ endif( UNIX ) if( WIN32 ) find_program(MYSQL_EXECUTABLE mysql PATHS - "C:/Program Files/MySQL/MySQL Server 5.6/bin" - "C:/Program Files/MySQL/MySQL Server 5.6/bin/opt" - "C:/Program Files/MySQL/MySQL Server 5.5/bin" - "C:/Program Files/MySQL/MySQL Server 5.5/bin/opt" - "C:/Program Files/MySQL/MySQL Server 5.1/bin" - "C:/Program Files/MySQL/MySQL Server 5.1/bin/opt" - "C:/Program Files/MySQL/MySQL Server 5.0/bin" - "C:/Program Files/MySQL/MySQL Server 5.0/bin/opt" - "C:/Program Files/MySQL/bin" - "C:/Program Files (x86)/MySQL/MySQL Server 5.6/bin" - "C:/Program Files (x86)/MySQL/MySQL Server 5.6/bin/opt" - "C:/Program Files (x86)/MySQL/MySQL Server 5.5/bin" - "C:/Program Files (x86)/MySQL/MySQL Server 5.5/bin/opt" - "C:/Program Files (x86)/MySQL/MySQL Server 5.1/bin" - "C:/Program Files (x86)/MySQL/MySQL Server 5.1/bin/opt" - "C:/Program Files (x86)/MySQL/MySQL Server 5.0/bin" - "C:/Program Files (x86)/MySQL/MySQL Server 5.0/bin/opt" - "C:/Program Files (x86)/MySQL/bin" + "${PROGRAM_FILES_64}/MySQL/*/bin" + "${PROGRAM_FILES_64}/MySQL/*/bin/opt" + "${PROGRAM_FILES_64}/MySQL/bin" + "${PROGRAM_FILES_32}/MySQL/*/bin" + "${PROGRAM_FILES_32}/MySQL/*/bin/opt" + "${PROGRAM_FILES_32}/MySQL/bin" "C:/MySQL/bin/debug" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.6;Location]/bin" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.6;Location]/bin/opt" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.5;Location]/bin" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.5;Location]/bin/opt" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.1;Location]/bin" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.1;Location]/bin/opt" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.0;Location]/bin" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\MySQL Server 5.0;Location]/bin/opt" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.6;Location]/bin" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.6;Location]/bin/opt" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.5;Location]/bin" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.5;Location]/bin/opt" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.1;Location]/bin" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.1;Location]/bin/opt" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.0;Location]/bin" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\MySQL Server 5.0;Location]/bin/opt" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\*;Location]/bin" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MySQL AB\\*;Location]/bin/opt" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\*;Location]/bin" + "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MySQL AB\\*;Location]/bin/opt" "$ENV{ProgramFiles}/MySQL/*/bin/opt" "$ENV{SystemDrive}/MySQL/*/bin/opt" "c:/msys/local/include" diff --git a/dep/PackageList.txt b/dep/PackageList.txt index 704fab5c168..495bcffd239 100644 --- a/dep/PackageList.txt +++ b/dep/PackageList.txt @@ -46,4 +46,4 @@ gSOAP (a portable development toolkit for C and C++ XML Web services and XML dat recastnavigation (Recast is state of the art navigation mesh construction toolset for games) https://github.com/memononen/recastnavigation - Version: 42b96b7306d39bb7680ddb0f89d480a8296c83ff + Version: 1dd5cf1883d61e723fef3d4957cf758c50e7a52b diff --git a/dep/g3dlite/G3D-v9.0 hotfix3.diff b/dep/g3dlite/G3D-v9.0 hotfix3.diff new file mode 100644 index 00000000000..ff5a662684c --- /dev/null +++ b/dep/g3dlite/G3D-v9.0 hotfix3.diff @@ -0,0 +1,117 @@ + dep/g3dlite/Readme.txt | 3 ++- + dep/g3dlite/include/G3D/Log.h | 2 +- + dep/g3dlite/include/G3D/Rect2D.h | 2 +- + dep/g3dlite/source/FileSystem.cpp | 3 +++ + dep/g3dlite/source/debugAssert.cpp | 2 ++ + dep/g3dlite/source/fileutils.cpp | 10 ++++++++++ + dep/g3dlite/source/prompt.cpp | 2 ++ + 7 files changed, 21 insertions(+), 3 deletions(-) + +diff --git a/dep/g3dlite/Readme.txt b/dep/g3dlite/Readme.txt +index 7fab7f8..7439943 100644 +--- a/dep/g3dlite/Readme.txt ++++ b/dep/g3dlite/Readme.txt +@@ -11,4 +11,5 @@ G3D-v8.0_hotfix7.diff - 2013-08-31 - fix typo in Matrix4 == operator + G3D-v8.0_hotfix8.diff - 2013-09-01 - fix typo in Vector3int32 += operator + G3D-v8.0_hotfix9.diff - 2014-06-01 - only VS < 10 don't ship inttypes.h + G3D-v9.0 hotfix1.diff - 2014-08-22 - updated to G3D9, reapplied previous patches and removed unneeded changes +-G3D-v9.0 hotfix2.diff - 2014-08-23 - fix some -Wconversion warnings +\ No newline at end of file ++G3D-v9.0 hotfix2.diff - 2014-08-23 - fix some -Wconversion warnings ++G3D-v9.0 hotfix3.diff - 2015-06-28 - fix some warnings +diff --git a/dep/g3dlite/include/G3D/Log.h b/dep/g3dlite/include/G3D/Log.h +index 2aedb13..c8a5d53 100644 +--- a/dep/g3dlite/include/G3D/Log.h ++++ b/dep/g3dlite/include/G3D/Log.h +@@ -57,9 +57,9 @@ private: + + static Log* commonLog; + ++public: + int stripFromStackBottom; + +-public: + + /** + @param stripFromStackBottom Number of call stacks to strip from the +diff --git a/dep/g3dlite/include/G3D/Rect2D.h b/dep/g3dlite/include/G3D/Rect2D.h +index f72dd08..93dd0e6 100644 +--- a/dep/g3dlite/include/G3D/Rect2D.h ++++ b/dep/g3dlite/include/G3D/Rect2D.h +@@ -118,7 +118,7 @@ private: + } + + /** Uninitialized constructor */ +- Rect2D(bool b) {} ++ Rect2D(bool /*b*/) {} + public: + + /** \param any Must either Rect2D::xywh(#, #, #, #) or Rect2D::xyxy(#, #, #, #)*/ +diff --git a/dep/g3dlite/source/FileSystem.cpp b/dep/g3dlite/source/FileSystem.cpp +index 32a84e7..06e6ff0 100644 +--- a/dep/g3dlite/source/FileSystem.cpp ++++ b/dep/g3dlite/source/FileSystem.cpp +@@ -137,6 +137,9 @@ void FileSystem::Dir::computeZipListing(const std::string& zipfile, const std::s + + zip_close(z); + z = NULL; ++#else ++ (void)zipfile; ++ (void)_pathInsideZipfile; + #endif + } + +diff --git a/dep/g3dlite/source/debugAssert.cpp b/dep/g3dlite/source/debugAssert.cpp +index 92ce237..cfccf9a 100644 +--- a/dep/g3dlite/source/debugAssert.cpp ++++ b/dep/g3dlite/source/debugAssert.cpp +@@ -121,6 +121,8 @@ static void createErrorMessage( + const char* moduleName = strrchr(modulePath, '\\'); + outTitle = outTitle + string(" - ") + string(moduleName ? (moduleName + 1) : modulePath); + ++ #else ++ (void)outTitle; + #endif + + // Build the message. +diff --git a/dep/g3dlite/source/fileutils.cpp b/dep/g3dlite/source/fileutils.cpp +index 966cca7..2788ada 100644 +--- a/dep/g3dlite/source/fileutils.cpp ++++ b/dep/g3dlite/source/fileutils.cpp +@@ -396,6 +396,10 @@ bool zipfileExists(const std::string& filename, std::string& outZipfile, + } + + } ++#else ++ (void)filename; ++ (void)outZipfile; ++ (void)outInternalFile; + #endif + // not a valid directory structure ever, + // obviously no .zip was found within the path +@@ -756,6 +760,12 @@ static void getFileOrDirListZip(const std::string& path, + zip_close( z ); + + fileSet.getMembers(files); ++#else ++ (void)path; ++ (void)prefix; ++ (void)files; ++ (void)wantFiles; ++ (void)includePath; + #endif + } + +diff --git a/dep/g3dlite/source/prompt.cpp b/dep/g3dlite/source/prompt.cpp +index ee520d8..6927fd0 100644 +--- a/dep/g3dlite/source/prompt.cpp ++++ b/dep/g3dlite/source/prompt.cpp +@@ -572,6 +572,8 @@ int prompt( + return result; + } + #endif ++#else ++ (void)useGui; + #endif /* G3DFIX: exclude GUI prompt code */ + return textPrompt(windowTitle, prompt, choice, numChoices); + } diff --git a/dep/g3dlite/Readme.txt b/dep/g3dlite/Readme.txt index 7fab7f83e8d..74399439220 100644 --- a/dep/g3dlite/Readme.txt +++ b/dep/g3dlite/Readme.txt @@ -11,4 +11,5 @@ G3D-v8.0_hotfix7.diff - 2013-08-31 - fix typo in Matrix4 == operator G3D-v8.0_hotfix8.diff - 2013-09-01 - fix typo in Vector3int32 += operator G3D-v8.0_hotfix9.diff - 2014-06-01 - only VS < 10 don't ship inttypes.h G3D-v9.0 hotfix1.diff - 2014-08-22 - updated to G3D9, reapplied previous patches and removed unneeded changes -G3D-v9.0 hotfix2.diff - 2014-08-23 - fix some -Wconversion warnings
\ No newline at end of file +G3D-v9.0 hotfix2.diff - 2014-08-23 - fix some -Wconversion warnings +G3D-v9.0 hotfix3.diff - 2015-06-28 - fix some warnings diff --git a/dep/g3dlite/include/G3D/Log.h b/dep/g3dlite/include/G3D/Log.h index 2aedb13dcdc..c8a5d53f887 100644 --- a/dep/g3dlite/include/G3D/Log.h +++ b/dep/g3dlite/include/G3D/Log.h @@ -57,9 +57,9 @@ private: static Log* commonLog; +public: int stripFromStackBottom; -public: /** @param stripFromStackBottom Number of call stacks to strip from the diff --git a/dep/g3dlite/include/G3D/Rect2D.h b/dep/g3dlite/include/G3D/Rect2D.h index f72dd082ad8..93dd0e619cc 100644 --- a/dep/g3dlite/include/G3D/Rect2D.h +++ b/dep/g3dlite/include/G3D/Rect2D.h @@ -118,7 +118,7 @@ private: } /** Uninitialized constructor */ - Rect2D(bool b) {} + Rect2D(bool /*b*/) {} public: /** \param any Must either Rect2D::xywh(#, #, #, #) or Rect2D::xyxy(#, #, #, #)*/ diff --git a/dep/g3dlite/source/FileSystem.cpp b/dep/g3dlite/source/FileSystem.cpp index 32a84e77048..06e6ff00a5e 100644 --- a/dep/g3dlite/source/FileSystem.cpp +++ b/dep/g3dlite/source/FileSystem.cpp @@ -137,6 +137,9 @@ void FileSystem::Dir::computeZipListing(const std::string& zipfile, const std::s zip_close(z); z = NULL; +#else + (void)zipfile; + (void)_pathInsideZipfile; #endif } diff --git a/dep/g3dlite/source/debugAssert.cpp b/dep/g3dlite/source/debugAssert.cpp index 92ce2376490..cfccf9a0cc5 100644 --- a/dep/g3dlite/source/debugAssert.cpp +++ b/dep/g3dlite/source/debugAssert.cpp @@ -121,6 +121,8 @@ static void createErrorMessage( const char* moduleName = strrchr(modulePath, '\\'); outTitle = outTitle + string(" - ") + string(moduleName ? (moduleName + 1) : modulePath); + #else + (void)outTitle; #endif // Build the message. diff --git a/dep/g3dlite/source/fileutils.cpp b/dep/g3dlite/source/fileutils.cpp index 966cca7d4bf..2788adad3bc 100644 --- a/dep/g3dlite/source/fileutils.cpp +++ b/dep/g3dlite/source/fileutils.cpp @@ -396,6 +396,10 @@ bool zipfileExists(const std::string& filename, std::string& outZipfile, } } +#else + (void)filename; + (void)outZipfile; + (void)outInternalFile; #endif // not a valid directory structure ever, // obviously no .zip was found within the path @@ -756,6 +760,12 @@ static void getFileOrDirListZip(const std::string& path, zip_close( z ); fileSet.getMembers(files); +#else + (void)path; + (void)prefix; + (void)files; + (void)wantFiles; + (void)includePath; #endif } diff --git a/dep/g3dlite/source/prompt.cpp b/dep/g3dlite/source/prompt.cpp index ee520d85db7..6927fd03b85 100644 --- a/dep/g3dlite/source/prompt.cpp +++ b/dep/g3dlite/source/prompt.cpp @@ -572,6 +572,8 @@ int prompt( return result; } #endif +#else + (void)useGui; #endif /* G3DFIX: exclude GUI prompt code */ return textPrompt(windowTitle, prompt, choice, numChoices); } diff --git a/dep/recastnavigation/Detour/Include/DetourCommon.h b/dep/recastnavigation/Detour/Include/DetourCommon.h index 0888614ea9b..2afba0d780b 100644 --- a/dep/recastnavigation/Detour/Include/DetourCommon.h +++ b/dep/recastnavigation/Detour/Include/DetourCommon.h @@ -19,6 +19,8 @@ #ifndef DETOURCOMMON_H #define DETOURCOMMON_H +#include "DetourMath.h" + /** @defgroup detour Detour @@ -71,11 +73,6 @@ template<class T> inline T dtSqr(T a) { return a*a; } /// @return The value, clamped to the specified range. template<class T> inline T dtClamp(T v, T mn, T mx) { return v < mn ? mn : (v > mx ? mx : v); } -/// Returns the square root of the value. -/// @param[in] x The value. -/// @return The square root of the vlaue. -float dtSqrt(float x); - /// @} /// @name Vector helper functions. /// @{ @@ -202,7 +199,7 @@ inline void dtVcopy(float* dest, const float* a) /// @return The scalar length of the vector. inline float dtVlen(const float* v) { - return dtSqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]); + return dtMathSqrtf(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); } /// Derives the square of the scalar length of the vector. (len * len) @@ -222,7 +219,7 @@ inline float dtVdist(const float* v1, const float* v2) const float dx = v2[0] - v1[0]; const float dy = v2[1] - v1[1]; const float dz = v2[2] - v1[2]; - return dtSqrt(dx*dx + dy*dy + dz*dz); + return dtMathSqrtf(dx*dx + dy*dy + dz*dz); } /// Returns the square of the distance between two points. @@ -247,7 +244,7 @@ inline float dtVdist2D(const float* v1, const float* v2) { const float dx = v2[0] - v1[0]; const float dz = v2[2] - v1[2]; - return dtSqrt(dx*dx + dz*dz); + return dtMathSqrtf(dx*dx + dz*dz); } /// Derives the square of the distance between the specified points on the xz-plane. @@ -265,7 +262,7 @@ inline float dtVdist2DSqr(const float* v1, const float* v2) /// @param[in,out] v The vector to normalize. [(x, y, z)] inline void dtVnormalize(float* v) { - float d = 1.0f / dtSqrt(dtSqr(v[0]) + dtSqr(v[1]) + dtSqr(v[2])); + float d = 1.0f / dtMathSqrtf(dtSqr(v[0]) + dtSqr(v[1]) + dtSqr(v[2])); v[0] *= d; v[1] *= d; v[2] *= d; diff --git a/dep/recastnavigation/Detour/Include/DetourMath.h b/dep/recastnavigation/Detour/Include/DetourMath.h new file mode 100644 index 00000000000..95e14f8843b --- /dev/null +++ b/dep/recastnavigation/Detour/Include/DetourMath.h @@ -0,0 +1,20 @@ +/** +@defgroup detour Detour + +Members in this module are wrappers around the standard math library +*/ + +#ifndef DETOURMATH_H +#define DETOURMATH_H + +#include <math.h> + +inline float dtMathFabsf(float x) { return fabsf(x); } +inline float dtMathSqrtf(float x) { return sqrtf(x); } +inline float dtMathFloorf(float x) { return floorf(x); } +inline float dtMathCeilf(float x) { return ceilf(x); } +inline float dtMathCosf(float x) { return cosf(x); } +inline float dtMathSinf(float x) { return sinf(x); } +inline float dtMathAtan2f(float y, float x) { return atan2f(y, x); } + +#endif diff --git a/dep/recastnavigation/Detour/Source/DetourCommon.cpp b/dep/recastnavigation/Detour/Source/DetourCommon.cpp index b5700f5930b..26fe65c1781 100644 --- a/dep/recastnavigation/Detour/Source/DetourCommon.cpp +++ b/dep/recastnavigation/Detour/Source/DetourCommon.cpp @@ -16,16 +16,11 @@ // 3. This notice may not be removed or altered from any source distribution. // -#include <math.h> #include "DetourCommon.h" +#include "DetourMath.h" ////////////////////////////////////////////////////////////////////////////////////////// -float dtSqrt(float x) -{ - return sqrtf(x); -} - void dtClosestPtPointTriangle(float* closest, const float* p, const float* a, const float* b, const float* c) { @@ -360,7 +355,7 @@ void dtRandomPointInConvexPoly(const float* pts, const int npts, float* areas, acc += dacc; } - float v = dtSqrt(t); + float v = dtMathSqrtf(t); const float a = 1 - v; const float b = (1 - u) * v; diff --git a/dep/recastnavigation/Detour/Source/DetourNavMesh.cpp b/dep/recastnavigation/Detour/Source/DetourNavMesh.cpp index 51740509950..e8a679bb5d1 100644 --- a/dep/recastnavigation/Detour/Source/DetourNavMesh.cpp +++ b/dep/recastnavigation/Detour/Source/DetourNavMesh.cpp @@ -16,13 +16,13 @@ // 3. This notice may not be removed or altered from any source distribution. // -#include <math.h> #include <float.h> #include <string.h> #include <stdio.h> #include "DetourNavMesh.h" #include "DetourNode.h" #include "DetourCommon.h" +#include "DetourMath.h" #include "DetourAlloc.h" #include "DetourAssert.h" #include <new> @@ -709,7 +709,7 @@ dtPolyRef dtNavMesh::findNearestPolyInTile(const dtMeshTile* tile, float closestPtPoly[3]; float diff[3]; bool posOverPoly = false; - float d = 0; + float d; closestPointOnPoly(ref, center, closestPtPoly, &posOverPoly); // If a point is directly over a polygon and closer than diff --git a/dep/recastnavigation/Detour/Source/DetourNavMeshBuilder.cpp b/dep/recastnavigation/Detour/Source/DetourNavMeshBuilder.cpp index 9d8471b96a1..1bf271bed7a 100644 --- a/dep/recastnavigation/Detour/Source/DetourNavMeshBuilder.cpp +++ b/dep/recastnavigation/Detour/Source/DetourNavMeshBuilder.cpp @@ -16,13 +16,13 @@ // 3. This notice may not be removed or altered from any source distribution. // -#include <math.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <float.h> #include "DetourNavMesh.h" #include "DetourCommon.h" +#include "DetourMath.h" #include "DetourNavMeshBuilder.h" #include "DetourAlloc.h" #include "DetourAssert.h" @@ -202,8 +202,8 @@ static int createBVTree(const unsigned short* verts, const int /*nverts*/, if (z > it.bmax[2]) it.bmax[2] = z; } // Remap y - it.bmin[1] = (unsigned short)floorf((float)it.bmin[1]*ch/cs); - it.bmax[1] = (unsigned short)ceilf((float)it.bmax[1]*ch/cs); + it.bmin[1] = (unsigned short)dtMathFloorf((float)it.bmin[1]*ch/cs); + it.bmax[1] = (unsigned short)dtMathCeilf((float)it.bmax[1]*ch/cs); } int curNode = 0; diff --git a/dep/recastnavigation/Detour/Source/DetourNavMeshQuery.cpp b/dep/recastnavigation/Detour/Source/DetourNavMeshQuery.cpp index ec3a2946ea5..fbf3724e85b 100644 --- a/dep/recastnavigation/Detour/Source/DetourNavMeshQuery.cpp +++ b/dep/recastnavigation/Detour/Source/DetourNavMeshQuery.cpp @@ -16,13 +16,13 @@ // 3. This notice may not be removed or altered from any source distribution. // -#include <math.h> #include <float.h> #include <string.h> #include "DetourNavMeshQuery.h" #include "DetourNavMesh.h" #include "DetourNode.h" #include "DetourCommon.h" +#include "DetourMath.h" #include "DetourAlloc.h" #include "DetourAssert.h" #include <new> @@ -99,9 +99,9 @@ inline float dtQueryFilter::getCost(const float* pa, const float* pb, return dtVdist(pa, pb) * m_areaCost[curPoly->getArea()]; } #endif - + // Edited by TC -static const float H_SCALE = 2.0f; // Search heuristic scale. +static const float H_SCALE = 2.0f; // Search heuristic scale. dtNavMeshQuery* dtAllocNavMeshQuery() @@ -309,7 +309,7 @@ dtStatus dtNavMeshQuery::findRandomPoint(const dtQueryFilter* filter, float (*fr return DT_SUCCESS; } -dtStatus dtNavMeshQuery::findRandomPointAroundCircle(dtPolyRef startRef, const float* centerPos, const float radius, +dtStatus dtNavMeshQuery::findRandomPointAroundCircle(dtPolyRef startRef, const float* centerPos, const float maxRadius, const dtQueryFilter* filter, float (*frand)(), dtPolyRef* randomRef, float* randomPt) const { @@ -341,7 +341,7 @@ dtStatus dtNavMeshQuery::findRandomPointAroundCircle(dtPolyRef startRef, const f dtStatus status = DT_SUCCESS; - const float radiusSqr = dtSqr(radius); + const float radiusSqr = dtSqr(maxRadius); float areaSum = 0.0f; const dtMeshTile* randomTile = 0; @@ -705,7 +705,7 @@ dtStatus dtNavMeshQuery::getPolyHeight(dtPolyRef ref, const float* pos, float* h /// @p nearestRef before using @p nearestPt. /// /// @warning This function is not suitable for large area searches. If the search -/// extents overlaps more than 128 polygons it may return an invalid result. +/// extents overlaps more than MAX_SEARCH (128) polygons it may return an invalid result. /// dtStatus dtNavMeshQuery::findNearestPoly(const float* center, const float* extents, const dtQueryFilter* filter, @@ -716,9 +716,10 @@ dtStatus dtNavMeshQuery::findNearestPoly(const float* center, const float* exten *nearestRef = 0; // Get nearby polygons from proximity grid. - dtPolyRef polys[128]; + const int MAX_SEARCH = 128; + dtPolyRef polys[MAX_SEARCH]; int polyCount = 0; - if (dtStatusFailed(queryPolygons(center, extents, filter, polys, &polyCount, 128))) + if (dtStatusFailed(queryPolygons(center, extents, filter, polys, &polyCount, MAX_SEARCH))) return DT_FAILURE | DT_INVALID_PARAM; // Find nearest polygon amongst the nearby polygons. @@ -1304,12 +1305,8 @@ dtStatus dtNavMeshQuery::updateSlicedFindPath(const int maxIter, int* doneIters) if (!m_query.filter->passFilter(neighbourRef, neighbourTile, neighbourPoly)) continue; - // deal explicitly with crossing tile boundaries - unsigned char crossSide = 0; - if (bestTile->links[i].side != 0xff) - crossSide = bestTile->links[i].side >> 1; - - dtNode* neighbourNode = m_nodePool->getNode(neighbourRef, crossSide); + // get the neighbor node + dtNode* neighbourNode = m_nodePool->getNode(neighbourRef, 0); if (!neighbourNode) { m_query.status |= DT_OUT_OF_NODES; diff --git a/dep/recastnavigation/Recast/Include/Recast.h b/dep/recastnavigation/Recast/Include/Recast.h index 66974cdbcc3..d3e9219a9f6 100644 --- a/dep/recastnavigation/Recast/Include/Recast.h +++ b/dep/recastnavigation/Recast/Include/Recast.h @@ -1083,7 +1083,7 @@ bool rcBuildHeightfieldLayers(rcContext* ctx, rcCompactHeightfield& chf, /// @returns True if the operation completed successfully. bool rcBuildContours(rcContext* ctx, rcCompactHeightfield& chf, const float maxError, const int maxEdgeLen, - rcContourSet& cset, const int flags = RC_CONTOUR_TESS_WALL_EDGES); + rcContourSet& cset, const int buildFlags = RC_CONTOUR_TESS_WALL_EDGES); /// Builds a polygon mesh from the provided contours. /// @ingroup recast diff --git a/dep/recastnavigation/Recast/Source/Recast.cpp b/dep/recastnavigation/Recast/Source/Recast.cpp index b9d86036c3f..59d99609446 100644 --- a/dep/recastnavigation/Recast/Source/Recast.cpp +++ b/dep/recastnavigation/Recast/Source/Recast.cpp @@ -238,7 +238,7 @@ static void calcTriNormal(const float* v0, const float* v1, const float* v2, flo /// @par /// -/// Only sets the aread id's for the walkable triangles. Does not alter the +/// Only sets the area id's for the walkable triangles. Does not alter the /// area id's for unwalkable triangles. /// /// See the #rcConfig documentation for more information on the configuration parameters. @@ -267,7 +267,7 @@ void rcMarkWalkableTriangles(rcContext* ctx, const float walkableSlopeAngle, /// @par /// -/// Only sets the aread id's for the unwalkable triangles. Does not alter the +/// Only sets the area id's for the unwalkable triangles. Does not alter the /// area id's for walkable triangles. /// /// See the #rcConfig documentation for more information on the configuration parameters. @@ -318,7 +318,7 @@ int rcGetHeightFieldSpanCount(rcContext* ctx, rcHeightfield& hf) /// @par /// /// This is just the beginning of the process of fully building a compact heightfield. -/// Various filters may be applied applied, then the distance field and regions built. +/// Various filters may be applied, then the distance field and regions built. /// E.g: #rcBuildDistanceField and #rcBuildRegions /// /// See the #rcConfig documentation for more information on the configuration parameters. @@ -486,4 +486,4 @@ static int getCompactHeightFieldMemoryusage(const rcCompactHeightfield& chf) size += sizeof(rcCompactCell) * chf.width * chf.height; return size; } -*/
\ No newline at end of file +*/ diff --git a/dep/recastnavigation/Recast/Source/RecastContour.cpp b/dep/recastnavigation/Recast/Source/RecastContour.cpp index 8aa9d1d92a1..a7be6691f3e 100644 --- a/dep/recastnavigation/Recast/Source/RecastContour.cpp +++ b/dep/recastnavigation/Recast/Source/RecastContour.cpp @@ -464,7 +464,7 @@ static int calcAreaOfPolygon2D(const int* verts, const int nverts) } // TODO: these are the same as in RecastMesh.cpp, consider using the same. - +// Last time I checked the if version got compiled using cmov, which was a lot faster than module (with idiv). inline int prev(int i, int n) { return i-1 >= 0 ? i-1 : n-1; } inline int next(int i, int n) { return i+1 < n ? i+1 : 0; } diff --git a/dep/recastnavigation/Recast/Source/RecastLayers.cpp b/dep/recastnavigation/Recast/Source/RecastLayers.cpp index cb1a39f4bda..41458c1ea68 100644 --- a/dep/recastnavigation/Recast/Source/RecastLayers.cpp +++ b/dep/recastnavigation/Recast/Source/RecastLayers.cpp @@ -38,7 +38,7 @@ struct rcLayerRegion unsigned char layerId; // Layer ID unsigned char nlayers; // Layer count unsigned char nneis; // Neighbour count - unsigned char base; // Flag indicating if the region is the base of merged regions. + unsigned char base; // Flag indicating if the region is the base of merged regions. }; @@ -293,7 +293,7 @@ bool rcBuildHeightfieldLayers(rcContext* ctx, rcCompactHeightfield& chf, for (int i = 0; i < nregs; ++i) { rcLayerRegion& root = regs[i]; - // Skip alreadu visited. + // Skip already visited. if (root.layerId != 0xff) continue; @@ -368,7 +368,7 @@ bool rcBuildHeightfieldLayers(rcContext* ctx, rcCompactHeightfield& chf, rcLayerRegion& rj = regs[j]; if (!rj.base) continue; - // Skip if teh regions are not close to each other. + // Skip if the regions are not close to each other. if (!overlapRange(ri.ymin,ri.ymax+mergeHeight, rj.ymin,rj.ymax+mergeHeight)) continue; // Skip if the height range would become too large. @@ -377,7 +377,7 @@ bool rcBuildHeightfieldLayers(rcContext* ctx, rcCompactHeightfield& chf, if ((ymax - ymin) >= 255) continue; - // Make sure that there is no overlap when mergin 'ri' and 'rj'. + // Make sure that there is no overlap when merging 'ri' and 'rj'. bool overlap = false; // Iterate over all regions which have the same layerId as 'rj' for (int k = 0; k < nregs; ++k) @@ -417,7 +417,7 @@ bool rcBuildHeightfieldLayers(rcContext* ctx, rcCompactHeightfield& chf, // Add overlaid layers from 'rj' to 'ri'. for (int k = 0; k < rj.nlayers; ++k) addUnique(ri.layers, ri.nlayers, rj.layers[k]); - // Update heigh bounds. + // Update height bounds. ri.ymin = rcMin(ri.ymin, rj.ymin); ri.ymax = rcMax(ri.ymax, rj.ymax); } @@ -481,10 +481,8 @@ bool rcBuildHeightfieldLayers(rcContext* ctx, rcCompactHeightfield& chf, for (int i = 0; i < lset.nlayers; ++i) { unsigned char curId = (unsigned char)i; - - // Allocate memory for the current layer. + rcHeightfieldLayer* layer = &lset.layers[i]; - memset(layer, 0, sizeof(rcHeightfieldLayer)); const int gridSize = sizeof(unsigned char)*lw*lh; @@ -528,7 +526,7 @@ bool rcBuildHeightfieldLayers(rcContext* ctx, rcCompactHeightfield& chf, layer->cs = chf.cs; layer->ch = chf.ch; - // Adjust the bbox to fit the heighfield. + // Adjust the bbox to fit the heightfield. rcVcopy(layer->bmin, bmin); rcVcopy(layer->bmax, bmax); layer->bmin[1] = bmin[1] + hmin*chf.ch; @@ -542,7 +540,7 @@ bool rcBuildHeightfieldLayers(rcContext* ctx, rcCompactHeightfield& chf, layer->miny = layer->height; layer->maxy = 0; - // Copy height and area from compact heighfield. + // Copy height and area from compact heightfield. for (int y = 0; y < lh; ++y) { for (int x = 0; x < lw; ++x) diff --git a/dep/recastnavigation/Recast/Source/RecastMesh.cpp b/dep/recastnavigation/Recast/Source/RecastMesh.cpp index e4f9c4b3629..c8853444019 100644 --- a/dep/recastnavigation/Recast/Source/RecastMesh.cpp +++ b/dep/recastnavigation/Recast/Source/RecastMesh.cpp @@ -160,6 +160,7 @@ static unsigned short addVertex(unsigned short x, unsigned short y, unsigned sho return (unsigned short)i; } +// Last time I checked the if version got compiled using cmov, which was a lot faster than module (with idiv). inline int prev(int i, int n) { return i-1 >= 0 ? i-1 : n-1; } inline int next(int i, int n) { return i+1 < n ? i+1 : 0; } @@ -746,7 +747,7 @@ static bool removeVertex(rcContext* ctx, rcPolyMesh& mesh, const unsigned short } // Remove vertex. - for (int i = (int)rem; i < mesh.nverts; ++i) + for (int i = (int)rem; i < mesh.nverts - 1; ++i) { mesh.verts[i*3+0] = mesh.verts[(i+1)*3+0]; mesh.verts[i*3+1] = mesh.verts[(i+1)*3+1]; @@ -836,7 +837,7 @@ static bool removeVertex(rcContext* ctx, rcPolyMesh& mesh, const unsigned short } rcScopedDelete<int> thole = (int*)rcAlloc(sizeof(int)*nhole, RC_ALLOC_TEMP); - if (!tverts) + if (!thole) { ctx->log(RC_LOG_WARNING, "removeVertex: Out of memory 'thole' (%d).", nhole); return false; @@ -875,7 +876,7 @@ static bool removeVertex(rcContext* ctx, rcPolyMesh& mesh, const unsigned short return false; } rcScopedDelete<unsigned char> pareas = (unsigned char*)rcAlloc(sizeof(unsigned char)*ntris, RC_ALLOC_TEMP); - if (!pregs) + if (!pareas) { ctx->log(RC_LOG_ERROR, "removeVertex: Out of memory 'pareas' (%d).", ntris); return false; diff --git a/dep/recastnavigation/Recast/Source/RecastMeshDetail.cpp b/dep/recastnavigation/Recast/Source/RecastMeshDetail.cpp index 5cc2adf0320..56b059d7dd5 100644 --- a/dep/recastnavigation/Recast/Source/RecastMeshDetail.cpp +++ b/dep/recastnavigation/Recast/Source/RecastMeshDetail.cpp @@ -237,8 +237,8 @@ static unsigned short getHeight(const float fx, const float fy, const float fz, enum EdgeValues { - UNDEF = -1, - HULL = -2, + EV_UNDEF = -1, + EV_HULL = -2, }; static int findEdge(const int* edges, int nedges, int s, int t) @@ -249,7 +249,7 @@ static int findEdge(const int* edges, int nedges, int s, int t) if ((e[0] == s && e[1] == t) || (e[0] == t && e[1] == s)) return i; } - return UNDEF; + return EV_UNDEF; } static int addEdge(rcContext* ctx, int* edges, int& nedges, const int maxEdges, int s, int t, int l, int r) @@ -257,12 +257,12 @@ static int addEdge(rcContext* ctx, int* edges, int& nedges, const int maxEdges, if (nedges >= maxEdges) { ctx->log(RC_LOG_ERROR, "addEdge: Too many edges (%d/%d).", nedges, maxEdges); - return UNDEF; + return EV_UNDEF; } // Add edge if not already in the triangulation. int e = findEdge(edges, nedges, s, t); - if (e == UNDEF) + if (e == EV_UNDEF) { int* edge = &edges[nedges*4]; edge[0] = s; @@ -273,15 +273,15 @@ static int addEdge(rcContext* ctx, int* edges, int& nedges, const int maxEdges, } else { - return UNDEF; + return EV_UNDEF; } } static void updateLeftFace(int* e, int s, int t, int f) { - if (e[0] == s && e[1] == t && e[2] == UNDEF) + if (e[0] == s && e[1] == t && e[2] == EV_UNDEF) e[2] = f; - else if (e[1] == s && e[0] == t && e[3] == UNDEF) + else if (e[1] == s && e[0] == t && e[3] == EV_UNDEF) e[3] = f; } @@ -322,12 +322,12 @@ static void completeFacet(rcContext* ctx, const float* pts, int npts, int* edges // Cache s and t. int s,t; - if (edge[2] == UNDEF) + if (edge[2] == EV_UNDEF) { s = edge[0]; t = edge[1]; } - else if (edge[3] == UNDEF) + else if (edge[3] == EV_UNDEF) { s = edge[1]; t = edge[0]; @@ -390,15 +390,15 @@ static void completeFacet(rcContext* ctx, const float* pts, int npts, int* edges // Add new edge or update face info of old edge. e = findEdge(edges, nedges, pt, s); - if (e == UNDEF) - addEdge(ctx, edges, nedges, maxEdges, pt, s, nfaces, UNDEF); + if (e == EV_UNDEF) + addEdge(ctx, edges, nedges, maxEdges, pt, s, nfaces, EV_UNDEF); else updateLeftFace(&edges[e*4], pt, s, nfaces); // Add new edge or update face info of old edge. e = findEdge(edges, nedges, t, pt); - if (e == UNDEF) - addEdge(ctx, edges, nedges, maxEdges, t, pt, nfaces, UNDEF); + if (e == EV_UNDEF) + addEdge(ctx, edges, nedges, maxEdges, t, pt, nfaces, EV_UNDEF); else updateLeftFace(&edges[e*4], t, pt, nfaces); @@ -406,7 +406,7 @@ static void completeFacet(rcContext* ctx, const float* pts, int npts, int* edges } else { - updateLeftFace(&edges[e*4], s, t, HULL); + updateLeftFace(&edges[e*4], s, t, EV_HULL); } } @@ -420,14 +420,14 @@ static void delaunayHull(rcContext* ctx, const int npts, const float* pts, edges.resize(maxEdges*4); for (int i = 0, j = nhull-1; i < nhull; j=i++) - addEdge(ctx, &edges[0], nedges, maxEdges, hull[j],hull[i], HULL, UNDEF); + addEdge(ctx, &edges[0], nedges, maxEdges, hull[j],hull[i], EV_HULL, EV_UNDEF); int currentEdge = 0; while (currentEdge < nedges) { - if (edges[currentEdge*4+2] == UNDEF) + if (edges[currentEdge*4+2] == EV_UNDEF) completeFacet(ctx, pts, npts, &edges[0], nedges, maxEdges, nfaces, currentEdge); - if (edges[currentEdge*4+3] == UNDEF) + if (edges[currentEdge*4+3] == EV_UNDEF) completeFacet(ctx, pts, npts, &edges[0], nedges, maxEdges, nfaces, currentEdge); currentEdge++; } @@ -507,17 +507,11 @@ static float polyMinExtent(const float* verts, const int nverts) return rcSqrt(minDist); } -inline int next(int i, int n) -{ - return (i+1) % n; -} - -inline int prev(int i, int n) -{ - return (i + n-1) % n; -} +// Last time I checked the if version got compiled using cmov, which was a lot faster than module (with idiv). +inline int prev(int i, int n) { return i-1 >= 0 ? i-1 : n-1; } +inline int next(int i, int n) { return i+1 < n ? i+1 : 0; } -static void triangulateHull(const int nverts, const float* verts, const int nhull, const int* hull, rcIntArray& tris) +static void triangulateHull(const int /*nverts*/, const float* verts, const int nhull, const int* hull, rcIntArray& tris) { int start = 0, left = 1, right = nhull-1; diff --git a/dep/recastnavigation/Recast/Source/RecastRasterization.cpp b/dep/recastnavigation/Recast/Source/RecastRasterization.cpp index 45a7d35bf3e..c3bda80cd71 100644 --- a/dep/recastnavigation/Recast/Source/RecastRasterization.cpp +++ b/dep/recastnavigation/Recast/Source/RecastRasterization.cpp @@ -50,7 +50,7 @@ static rcSpan* allocSpan(rcHeightfield& hf) // Allocate memory for the new pool. rcSpanPool* pool = (rcSpanPool*)rcAlloc(sizeof(rcSpanPool), RC_ALLOC_PERM); if (!pool) return 0; - pool->next = 0; + // Add the pool into the list of pools. pool->next = hf.pools; hf.pools = pool; diff --git a/dep/recastnavigation/Recast/Source/RecastRegion.cpp b/dep/recastnavigation/Recast/Source/RecastRegion.cpp index 38bc4ff476f..352ba579e5f 100644 --- a/dep/recastnavigation/Recast/Source/RecastRegion.cpp +++ b/dep/recastnavigation/Recast/Source/RecastRegion.cpp @@ -1041,7 +1041,7 @@ static void addUniqueConnection(rcRegion& reg, int n) static bool mergeAndFilterLayerRegions(rcContext* ctx, int minRegionArea, unsigned short& maxRegionId, rcCompactHeightfield& chf, - unsigned short* srcReg, rcIntArray& overlaps) + unsigned short* srcReg, rcIntArray& /*overlaps*/) { const int w = chf.width; const int h = chf.height; diff --git a/dep/recastnavigation/recastnavigation.diff b/dep/recastnavigation/recastnavigation.diff index 42bab6474e3..0be25bc11d1 100644 --- a/dep/recastnavigation/recastnavigation.diff +++ b/dep/recastnavigation/recastnavigation.diff @@ -1,18 +1,17 @@ -From b84e9ffbd1d1e1fb2f5d78cc53d2bb7b56c3fce3 Mon Sep 17 00:00:00 2001 +From 37b4c6d3d78ea676d8b300a282013a27a51912c1 Mon Sep 17 00:00:00 2001 From: jackpoz <giacomopoz@gmail.com> Date: Fri, 20 Jun 2014 23:15:04 +0200 Subject: [PATCH] Add custom trinitycore changes --- - Detour/Include/DetourNavMesh.h | 76 ++++++++------------------ - Detour/Source/DetourCommon.cpp | 4 +- - Detour/Source/DetourNavMesh.cpp | 32 ++++------- - Detour/Source/DetourNavMeshBuilder.cpp | 6 +- - Detour/Source/DetourNavMeshQuery.cpp | 9 +-- - Detour/Source/DetourNode.cpp | 29 +++------- - DetourCrowd/Source/DetourObstacleAvoidance.cpp | 6 +- - Recast/Include/Recast.h | 8 +-- - 8 files changed, 59 insertions(+), 111 deletions(-) + Detour/Include/DetourNavMesh.h | 76 ++++++++++++------------------------ + Detour/Source/DetourNavMesh.cpp | 30 +++++--------- + Detour/Source/DetourNavMeshQuery.cpp | 5 ++- + Detour/Source/DetourNode.cpp | 29 ++++---------- + Recast/Include/Recast.h | 8 ++-- + Recast/Source/RecastMeshDetail.cpp | 2 +- + Recast/Source/RecastRegion.cpp | 2 +- + 7 files changed, 50 insertions(+), 102 deletions(-) diff --git a/Detour/Include/DetourNavMesh.h b/Detour/Include/DetourNavMesh.h index 1060845..782ddbc 100644 @@ -177,46 +176,10 @@ index 1060845..782ddbc 100644 }; /// Allocates a navigation mesh object using the Detour allocator. -diff --git a/Detour/Source/DetourCommon.cpp b/Detour/Source/DetourCommon.cpp -index a98d8c8..b5700f5 100644 ---- a/Detour/Source/DetourCommon.cpp -+++ b/Detour/Source/DetourCommon.cpp -@@ -16,14 +16,14 @@ - // 3. This notice may not be removed or altered from any source distribution. - // - -+#include <math.h> - #include "DetourCommon.h" --#include "DetourMath.h" - - ////////////////////////////////////////////////////////////////////////////////////////// - - float dtSqrt(float x) - { -- return dtMathSqrtf(x); -+ return sqrtf(x); - } - - void dtClosestPtPointTriangle(float* closest, const float* p, diff --git a/Detour/Source/DetourNavMesh.cpp b/Detour/Source/DetourNavMesh.cpp -index 9d627be..5174050 100644 +index d353d08..e8a679b 100644 --- a/Detour/Source/DetourNavMesh.cpp +++ b/Detour/Source/DetourNavMesh.cpp -@@ -16,13 +16,13 @@ - // 3. This notice may not be removed or altered from any source distribution. - // - -+#include <math.h> - #include <float.h> - #include <string.h> - #include <stdio.h> - #include "DetourNavMesh.h" - #include "DetourNode.h" - #include "DetourCommon.h" --#include "DetourMath.h" - #include "DetourAlloc.h" - #include "DetourAssert.h" - #include <new> @@ -193,13 +193,11 @@ dtNavMesh::dtNavMesh() : m_tileLutMask(0), m_posLookup(0), @@ -270,68 +233,21 @@ index 9d627be..5174050 100644 if (tile->salt == 0) tile->salt++; -diff --git a/Detour/Source/DetourNavMeshBuilder.cpp b/Detour/Source/DetourNavMeshBuilder.cpp -index 1bf271b..9d8471b 100644 ---- a/Detour/Source/DetourNavMeshBuilder.cpp -+++ b/Detour/Source/DetourNavMeshBuilder.cpp -@@ -16,13 +16,13 @@ - // 3. This notice may not be removed or altered from any source distribution. - // - -+#include <math.h> - #include <stdio.h> - #include <stdlib.h> - #include <string.h> - #include <float.h> - #include "DetourNavMesh.h" - #include "DetourCommon.h" --#include "DetourMath.h" - #include "DetourNavMeshBuilder.h" - #include "DetourAlloc.h" - #include "DetourAssert.h" -@@ -202,8 +202,8 @@ static int createBVTree(const unsigned short* verts, const int /*nverts*/, - if (z > it.bmax[2]) it.bmax[2] = z; - } - // Remap y -- it.bmin[1] = (unsigned short)dtMathFloorf((float)it.bmin[1]*ch/cs); -- it.bmax[1] = (unsigned short)dtMathCeilf((float)it.bmax[1]*ch/cs); -+ it.bmin[1] = (unsigned short)floorf((float)it.bmin[1]*ch/cs); -+ it.bmax[1] = (unsigned short)ceilf((float)it.bmax[1]*ch/cs); - } - - int curNode = 0; diff --git a/Detour/Source/DetourNavMeshQuery.cpp b/Detour/Source/DetourNavMeshQuery.cpp -index 9debb4d..ec3a294 100644 +index 5fbc83e..fbf3724 100644 --- a/Detour/Source/DetourNavMeshQuery.cpp +++ b/Detour/Source/DetourNavMeshQuery.cpp -@@ -16,13 +16,13 @@ - // 3. This notice may not be removed or altered from any source distribution. - // - -+#include <math.h> - #include <float.h> - #include <string.h> - #include "DetourNavMeshQuery.h" - #include "DetourNavMesh.h" - #include "DetourNode.h" - #include "DetourCommon.h" --#include "DetourMath.h" - #include "DetourAlloc.h" - #include "DetourAssert.h" - #include <new> -@@ -99,8 +99,9 @@ inline float dtQueryFilter::getCost(const float* pa, const float* pb, - return dtVdist(pa, pb) * m_areaCost[curPoly->getArea()]; +@@ -100,7 +100,8 @@ inline float dtQueryFilter::getCost(const float* pa, const float* pb, } #endif -- + -static const float H_SCALE = 0.999f; // Search heuristic scale. -+ +// Edited by TC -+static const float H_SCALE = 2.0f; // Search heuristic scale. ++static const float H_SCALE = 2.0f; // Search heuristic scale. dtNavMeshQuery* dtAllocNavMeshQuery() -@@ -3504,7 +3505,7 @@ dtStatus dtNavMeshQuery::findDistanceToWall(dtPolyRef startRef, const float* cen +@@ -3501,7 +3502,7 @@ dtStatus dtNavMeshQuery::findDistanceToWall(dtPolyRef startRef, const float* cen dtVsub(hitNormal, centerPos, hitPos); dtVnormalize(hitNormal); @@ -383,42 +299,8 @@ index 5cf6548..1d18977 100644 ////////////////////////////////////////////////////////////////////////////////////////// dtNodePool::dtNodePool(int maxNodes, int hashSize) : -diff --git a/DetourCrowd/Source/DetourObstacleAvoidance.cpp b/DetourCrowd/Source/DetourObstacleAvoidance.cpp -index 0fad9ef..d3f90b7 100644 ---- a/DetourCrowd/Source/DetourObstacleAvoidance.cpp -+++ b/DetourCrowd/Source/DetourObstacleAvoidance.cpp -@@ -18,10 +18,10 @@ - - #include "DetourObstacleAvoidance.h" - #include "DetourCommon.h" --#include "DetourMath.h" - #include "DetourAlloc.h" - #include "DetourAssert.h" - #include <string.h> -+#include <math.h> - #include <float.h> - #include <new> - -@@ -58,7 +58,7 @@ static int isectRaySeg(const float* ap, const float* u, - dtVsub(v,bq,bp); - dtVsub(w,ap,bp); - float d = dtVperp2D(u,v); -- if (dtMathFabs(d) < 1e-6f) return 0; -+ if (fabsf(d) < 1e-6f) return 0; - d = 1.0f/d; - t = dtVperp2D(v,w) * d; - if (t < 0 || t > 1) return 0; -@@ -482,7 +482,7 @@ int dtObstacleAvoidanceQuery::sampleVelocityAdaptive(const float* pos, const flo - const int nd = dtClamp(ndivs, 1, DT_MAX_PATTERN_DIVS); - const int nr = dtClamp(nrings, 1, DT_MAX_PATTERN_RINGS); - const float da = (1.0f/nd) * DT_PI*2; -- const float dang = dtMathAtan2f(dvel[2], dvel[0]); -+ const float dang = atan2f(dvel[2], dvel[0]); - - // Always add sample at zero - pat[npat*2+0] = 0; diff --git a/Recast/Include/Recast.h b/Recast/Include/Recast.h -index 83ca606..66974cd 100644 +index d8bdde2..d3e9219 100644 --- a/Recast/Include/Recast.h +++ b/Recast/Include/Recast.h @@ -243,7 +243,7 @@ struct rcConfig @@ -443,6 +325,32 @@ index 83ca606..66974cd 100644 rcSpan* next; ///< The next span higher up in column. }; +diff --git a/Recast/Source/RecastMeshDetail.cpp b/Recast/Source/RecastMeshDetail.cpp +index c0bba6f..56b059d 100644 +--- a/Recast/Source/RecastMeshDetail.cpp ++++ b/Recast/Source/RecastMeshDetail.cpp +@@ -511,7 +511,7 @@ static float polyMinExtent(const float* verts, const int nverts) + inline int prev(int i, int n) { return i-1 >= 0 ? i-1 : n-1; } + inline int next(int i, int n) { return i+1 < n ? i+1 : 0; } + +-static void triangulateHull(const int nverts, const float* verts, const int nhull, const int* hull, rcIntArray& tris) ++static void triangulateHull(const int /*nverts*/, const float* verts, const int nhull, const int* hull, rcIntArray& tris) + { + int start = 0, left = 1, right = nhull-1; + +diff --git a/Recast/Source/RecastRegion.cpp b/Recast/Source/RecastRegion.cpp +index 38bc4ff..352ba57 100644 +--- a/Recast/Source/RecastRegion.cpp ++++ b/Recast/Source/RecastRegion.cpp +@@ -1041,7 +1041,7 @@ static void addUniqueConnection(rcRegion& reg, int n) + static bool mergeAndFilterLayerRegions(rcContext* ctx, int minRegionArea, + unsigned short& maxRegionId, + rcCompactHeightfield& chf, +- unsigned short* srcReg, rcIntArray& overlaps) ++ unsigned short* srcReg, rcIntArray& /*overlaps*/) + { + const int w = chf.width; + const int h = chf.height; -- -1.9.0.msysgit.0 +1.9.5.msysgit.0 diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql index a85591767d4..f3c76ce2a79 100644 --- a/sql/base/characters_database.sql +++ b/sql/base/characters_database.sql @@ -483,22 +483,22 @@ DROP TABLE IF EXISTS `character_aura`; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `character_aura` ( `guid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Global Unique Identifier', - `caster_guid` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT 'Full Global Unique Identifier', - `item_guid` bigint(20) unsigned NOT NULL DEFAULT '0', + `casterGuid` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT 'Full Global Unique Identifier', + `itemGuid` bigint(20) unsigned NOT NULL DEFAULT '0', `spell` mediumint(8) unsigned NOT NULL DEFAULT '0', - `effect_mask` tinyint(3) unsigned NOT NULL DEFAULT '0', - `recalculate_mask` tinyint(3) unsigned NOT NULL DEFAULT '0', - `stackcount` tinyint(3) unsigned NOT NULL DEFAULT '1', + `effectMask` tinyint(3) unsigned NOT NULL DEFAULT '0', + `recalculateMask` tinyint(3) unsigned NOT NULL DEFAULT '0', + `stackCount` tinyint(3) unsigned NOT NULL DEFAULT '1', `amount0` int(11) NOT NULL DEFAULT '0', `amount1` int(11) NOT NULL DEFAULT '0', `amount2` int(11) NOT NULL DEFAULT '0', `base_amount0` int(11) NOT NULL DEFAULT '0', `base_amount1` int(11) NOT NULL DEFAULT '0', `base_amount2` int(11) NOT NULL DEFAULT '0', - `maxduration` int(11) NOT NULL DEFAULT '0', - `remaintime` int(11) NOT NULL DEFAULT '0', - `remaincharges` tinyint(3) unsigned NOT NULL DEFAULT '0', - PRIMARY KEY (`guid`,`caster_guid`,`item_guid`,`spell`,`effect_mask`) + `maxDuration` int(11) NOT NULL DEFAULT '0', + `remainTime` int(11) NOT NULL DEFAULT '0', + `remainCharges` tinyint(3) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`guid`,`casterGuid`,`itemGuid`,`spell`,`effectMask`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Player System'; /*!40101 SET character_set_client = @saved_cs_client */; @@ -702,14 +702,14 @@ DROP TABLE IF EXISTS `character_glyphs`; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `character_glyphs` ( `guid` int(10) unsigned NOT NULL, - `spec` tinyint(3) unsigned NOT NULL DEFAULT '0', + `talentGroup` tinyint(3) unsigned NOT NULL DEFAULT '0', `glyph1` smallint(5) unsigned DEFAULT '0', `glyph2` smallint(5) unsigned DEFAULT '0', `glyph3` smallint(5) unsigned DEFAULT '0', `glyph4` smallint(5) unsigned DEFAULT '0', `glyph5` smallint(5) unsigned DEFAULT '0', `glyph6` smallint(5) unsigned DEFAULT '0', - PRIMARY KEY (`guid`,`spec`) + PRIMARY KEY (`guid`,`talentGroup`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; @@ -1215,8 +1215,8 @@ DROP TABLE IF EXISTS `character_talent`; CREATE TABLE `character_talent` ( `guid` int(10) unsigned NOT NULL, `spell` mediumint(8) unsigned NOT NULL, - `spec` tinyint(3) unsigned NOT NULL DEFAULT '0', - PRIMARY KEY (`guid`,`spell`,`spec`) + `talentGroup` tinyint(3) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`guid`,`spell`,`talentGroup`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; @@ -1297,8 +1297,8 @@ CREATE TABLE `characters` ( `power6` int(10) unsigned NOT NULL DEFAULT '0', `power7` int(10) unsigned NOT NULL DEFAULT '0', `latency` mediumint(8) unsigned NOT NULL DEFAULT '0', - `speccount` tinyint(3) unsigned NOT NULL DEFAULT '1', - `activespec` tinyint(3) unsigned NOT NULL DEFAULT '0', + `talentGroupsCount` tinyint(3) unsigned NOT NULL DEFAULT '1', + `activeTalentGroup` tinyint(3) unsigned NOT NULL DEFAULT '0', `exploredZones` longtext, `equipmentCache` longtext, `ammoId` int(10) unsigned NOT NULL DEFAULT '0', @@ -1468,68 +1468,68 @@ LOCK TABLES `gameobject_respawn` WRITE; UNLOCK TABLES; -- --- Table structure for table `gm_subsurveys` +-- Table structure for table `gm_subsurvey` -- -DROP TABLE IF EXISTS `gm_subsurveys`; +DROP TABLE IF EXISTS `gm_subsurvey`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; -CREATE TABLE `gm_subsurveys` ( +CREATE TABLE `gm_subsurvey` ( `surveyId` int(10) unsigned NOT NULL AUTO_INCREMENT, - `subsurveyId` int(10) unsigned NOT NULL DEFAULT '0', - `rank` int(10) unsigned NOT NULL DEFAULT '0', - `comment` text NOT NULL, - PRIMARY KEY (`surveyId`,`subsurveyId`) + `questionId` int(10) unsigned NOT NULL DEFAULT '0', + `answer` int(10) unsigned NOT NULL DEFAULT '0', + `answerComment` text NOT NULL, + PRIMARY KEY (`surveyId`,`questionId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Player System'; /*!40101 SET character_set_client = @saved_cs_client */; -- --- Dumping data for table `gm_subsurveys` +-- Dumping data for table `gm_subsurvey` -- -LOCK TABLES `gm_subsurveys` WRITE; -/*!40000 ALTER TABLE `gm_subsurveys` DISABLE KEYS */; -/*!40000 ALTER TABLE `gm_subsurveys` ENABLE KEYS */; +LOCK TABLES `gm_subsurvey` WRITE; +/*!40000 ALTER TABLE `gm_subsurvey` DISABLE KEYS */; +/*!40000 ALTER TABLE `gm_subsurvey` ENABLE KEYS */; UNLOCK TABLES; -- --- Table structure for table `gm_surveys` +-- Table structure for table `gm_survey` -- -DROP TABLE IF EXISTS `gm_surveys`; +DROP TABLE IF EXISTS `gm_survey`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; -CREATE TABLE `gm_surveys` ( +CREATE TABLE `gm_survey` ( `surveyId` int(10) unsigned NOT NULL AUTO_INCREMENT, `guid` int(10) unsigned NOT NULL DEFAULT '0', `mainSurvey` int(10) unsigned NOT NULL DEFAULT '0', - `overallComment` longtext NOT NULL, + `comment` longtext NOT NULL, `createTime` int(10) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`surveyId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Player System'; /*!40101 SET character_set_client = @saved_cs_client */; -- --- Dumping data for table `gm_surveys` +-- Dumping data for table `gm_survey` -- -LOCK TABLES `gm_surveys` WRITE; -/*!40000 ALTER TABLE `gm_surveys` DISABLE KEYS */; -/*!40000 ALTER TABLE `gm_surveys` ENABLE KEYS */; +LOCK TABLES `gm_survey` WRITE; +/*!40000 ALTER TABLE `gm_survey` DISABLE KEYS */; +/*!40000 ALTER TABLE `gm_survey` ENABLE KEYS */; UNLOCK TABLES; -- --- Table structure for table `gm_tickets` +-- Table structure for table `gm_ticket` -- -DROP TABLE IF EXISTS `gm_tickets`; +DROP TABLE IF EXISTS `gm_ticket`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; -CREATE TABLE `gm_tickets` ( - `ticketId` int(10) unsigned NOT NULL AUTO_INCREMENT, - `guid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Global Unique Identifier of ticket creator', +CREATE TABLE `gm_ticket` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `playerGuid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Global Unique Identifier of ticket creator', `name` varchar(12) NOT NULL COMMENT 'Name of ticket creator', - `message` text NOT NULL, + `description` text NOT NULL, `createTime` int(10) unsigned NOT NULL DEFAULT '0', `mapId` smallint(5) unsigned NOT NULL DEFAULT '0', `posX` float NOT NULL DEFAULT '0', @@ -1543,18 +1543,18 @@ CREATE TABLE `gm_tickets` ( `completed` tinyint(3) unsigned NOT NULL DEFAULT '0', `escalated` tinyint(3) unsigned NOT NULL DEFAULT '0', `viewed` tinyint(3) unsigned NOT NULL DEFAULT '0', - `haveTicket` tinyint(3) unsigned NOT NULL DEFAULT '0', - PRIMARY KEY (`ticketId`) + `needMoreHelp` tinyint(3) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Player System'; /*!40101 SET character_set_client = @saved_cs_client */; -- --- Dumping data for table `gm_tickets` +-- Dumping data for table `gm_ticket` -- -LOCK TABLES `gm_tickets` WRITE; -/*!40000 ALTER TABLE `gm_tickets` DISABLE KEYS */; -/*!40000 ALTER TABLE `gm_tickets` ENABLE KEYS */; +LOCK TABLES `gm_ticket` WRITE; +/*!40000 ALTER TABLE `gm_ticket` DISABLE KEYS */; +/*!40000 ALTER TABLE `gm_ticket` ENABLE KEYS */; UNLOCK TABLES; -- @@ -1631,7 +1631,7 @@ CREATE TABLE `groups` ( `icon8` bigint(20) unsigned NOT NULL, `groupType` tinyint(3) unsigned NOT NULL, `difficulty` tinyint(3) unsigned NOT NULL DEFAULT '0', - `raiddifficulty` tinyint(3) unsigned NOT NULL DEFAULT '0', + `raidDifficulty` tinyint(3) unsigned NOT NULL DEFAULT '0', `masterLooterGuid` int(10) unsigned NOT NULL, PRIMARY KEY (`guid`), KEY `leaderGuid` (`leaderGuid`) @@ -2226,21 +2226,21 @@ DROP TABLE IF EXISTS `pet_aura`; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `pet_aura` ( `guid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Global Unique Identifier', - `caster_guid` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT 'Full Global Unique Identifier', + `casterGuid` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT 'Full Global Unique Identifier', `spell` mediumint(8) unsigned NOT NULL DEFAULT '0', - `effect_mask` tinyint(3) unsigned NOT NULL DEFAULT '0', - `recalculate_mask` tinyint(3) unsigned NOT NULL DEFAULT '0', - `stackcount` tinyint(3) unsigned NOT NULL DEFAULT '1', + `effectMask` tinyint(3) unsigned NOT NULL DEFAULT '0', + `recalculateMask` tinyint(3) unsigned NOT NULL DEFAULT '0', + `stackCount` tinyint(3) unsigned NOT NULL DEFAULT '1', `amount0` mediumint(8) NOT NULL, `amount1` mediumint(8) NOT NULL, `amount2` mediumint(8) NOT NULL, `base_amount0` mediumint(8) NOT NULL, `base_amount1` mediumint(8) NOT NULL, `base_amount2` mediumint(8) NOT NULL, - `maxduration` int(11) NOT NULL DEFAULT '0', - `remaintime` int(11) NOT NULL DEFAULT '0', - `remaincharges` tinyint(3) unsigned NOT NULL DEFAULT '0', - PRIMARY KEY (`guid`,`spell`,`effect_mask`) + `maxDuration` int(11) NOT NULL DEFAULT '0', + `remainTime` int(11) NOT NULL DEFAULT '0', + `remainCharges` tinyint(3) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`guid`,`spell`,`effectMask`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Pet System'; /*!40101 SET character_set_client = @saved_cs_client */; @@ -2511,7 +2511,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); +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','f8230a59a9e878a6f54f421d6621f1595bd93861','RELEASED','2015-03-21 21:44:51',0); /*!40000 ALTER TABLE `updates` ENABLE KEYS */; UNLOCK TABLES; @@ -2596,4 +2596,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2015-03-21 21:48:11 +-- Dump completed on 2015-06-25 17:43:13 diff --git a/sql/updates/characters/2015_06_26_00_characters_335.sql b/sql/updates/characters/2015_06_26_00_characters_335.sql new file mode 100644 index 00000000000..ea997fad252 --- /dev/null +++ b/sql/updates/characters/2015_06_26_00_characters_335.sql @@ -0,0 +1,57 @@ +-- `character_aura` +ALTER TABLE `character_aura` +CHANGE `caster_guid` `casterGuid` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT 'Full Global Unique Identifier', +CHANGE `item_guid` `itemGuid` bigint(20) unsigned NOT NULL DEFAULT '0', +CHANGE `effect_mask` `effectMask` tinyint(3) unsigned NOT NULL DEFAULT '0', +CHANGE `recalculate_mask` `recalculateMask` tinyint(3) unsigned NOT NULL DEFAULT '0', +CHANGE `stackcount` `stackCount` tinyint(3) unsigned NOT NULL DEFAULT '1', +CHANGE `maxduration` `maxDuration` int(11) NOT NULL DEFAULT '0', +CHANGE `remaintime` `remainTime` int(11) NOT NULL DEFAULT '0', +CHANGE `remaincharges` `remainCharges` tinyint(3) unsigned NOT NULL DEFAULT '0'; + +-- `character_glyphs` +ALTER TABLE `character_glyphs` +CHANGE `spec` `talentGroup` tinyint(3) unsigned NOT NULL DEFAULT '0'; + +-- `character_talent` +ALTER TABLE `character_talent` +CHANGE `spec` `talentGroup` tinyint(3) unsigned NOT NULL DEFAULT '0'; + +-- `characters` +ALTER TABLE `characters` +CHANGE `speccount` `talentGroupsCount` tinyint(3) unsigned NOT NULL DEFAULT '1', +CHANGE `activespec` `activeTalentGroup` tinyint(3) unsigned NOT NULL DEFAULT '0'; + +-- `gm_subsurveys` -> `gm_subsurvey` +RENAME TABLE `gm_subsurveys` TO `gm_subsurvey`; +ALTER TABLE `gm_subsurvey` +CHANGE `subsurveyId` `questionId` int(10) unsigned NOT NULL DEFAULT '0', +CHANGE `rank` `answer` int(10) unsigned NOT NULL DEFAULT '0', +CHANGE `comment` `answerComment` text NOT NULL; + +-- `gm_surveys` -> `gm_survey` +RENAME TABLE `gm_surveys` TO `gm_survey`; +ALTER TABLE `gm_survey` +CHANGE `overallComment` `comment` longtext NOT NULL; + +-- `gm_tickets` -> `gm_ticket` +RENAME TABLE `gm_tickets` TO `gm_ticket`; +ALTER TABLE `gm_ticket` +CHANGE `ticketId` `id` int(10) unsigned NOT NULL AUTO_INCREMENT, +CHANGE `guid` `playerGuid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Global Unique Identifier of ticket creator', +CHANGE `message` `description` text NOT NULL, +CHANGE `haveTicket` `needMoreHelp` tinyint(3) unsigned NOT NULL DEFAULT '0'; + +-- `groups` +ALTER TABLE `groups` +CHANGE `raiddifficulty` `raidDifficulty` tinyint(3) unsigned NOT NULL DEFAULT '0'; + +-- `pet_aura` +ALTER TABLE `pet_aura` +CHANGE `caster_guid` `casterGuid` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT 'Full Global Unique Identifier', +CHANGE `effect_mask` `effectMask` tinyint(3) unsigned NOT NULL DEFAULT '0', +CHANGE `recalculate_mask` `recalculateMask` tinyint(3) unsigned NOT NULL DEFAULT '0', +CHANGE `stackcount` `stackCount` tinyint(3) unsigned NOT NULL DEFAULT '1', +CHANGE `maxduration` `maxDuration` int(11) NOT NULL DEFAULT '0', +CHANGE `remaintime` `remainTime` int(11) NOT NULL DEFAULT '0', +CHANGE `remaincharges` `remainCharges` tinyint(3) unsigned NOT NULL DEFAULT '0'; diff --git a/sql/updates/world/2015_06_23_01_world.sql b/sql/updates/world/2015_06_23_01_world.sql new file mode 100644 index 00000000000..2e42d16cd7b --- /dev/null +++ b/sql/updates/world/2015_06_23_01_world.sql @@ -0,0 +1,3 @@ +DELETE FROM `spell_script_names` WHERE `spell_id`=45724; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(45724, 'spell_midsummer_braziers_hit'); diff --git a/sql/updates/world/2015_06_23_02_world.sql b/sql/updates/world/2015_06_23_02_world.sql new file mode 100644 index 00000000000..adcbb40f7d1 --- /dev/null +++ b/sql/updates/world/2015_06_23_02_world.sql @@ -0,0 +1,3 @@ +-- +UPDATE `quest_template` SET `RequiredRaces`=1101 WHERE `ID`=11580; +UPDATE `quest_template` SET `RequiredRaces`=690 WHERE `ID`=11581; diff --git a/sql/updates/world/2015_06_25_00_world.sql b/sql/updates/world/2015_06_25_00_world.sql new file mode 100644 index 00000000000..56e8aa61c9b --- /dev/null +++ b/sql/updates/world/2015_06_25_00_world.sql @@ -0,0 +1,18 @@ +-- ethereal sphere heroic version +UPDATE `creature_template` SET `scriptname` = 'npc_ethereal_sphere' WHERE `entry` = 32582; +-- spell script names +DELETE FROM `spell_script_names` WHERE `spell_id` IN (58694,54102,54164,54396,54438,54442,57804,59523,59524,61337); +INSERT INTO `spell_script_names`(`spell_id`,`ScriptName`) VALUES +(54102,'spell_xevozz_summon_ethereal_sphere'), +(54164,'spell_xevozz_summon_players'), +(54396,'spell_moragg_optic_link'), +(54438,'spell_moragg_ray_of_pain'), +(54442,'spell_moragg_ray_of_suffering'), +(57804,'spell_crystal_activation'), +(59523,'spell_moragg_ray_of_pain'), +(59524,'spell_moragg_ray_of_suffering'), +(61337,'spell_xevozz_summon_ethereal_sphere'); +-- arcane vacuum summon effect +DELETE FROM `spell_linked_spell` WHERE `spell_trigger` = 58694; +INSERT INTO `spell_linked_spell` (`spell_trigger`,`spell_effect`,`type`,`comment`) VALUES +(58694,21150,1,'Cyanigosa: Arcane Vacuum teleport effect'); diff --git a/sql/updates/world/2015_06_26_00_world_2015_06_13_00.sql b/sql/updates/world/2015_06_26_00_world_2015_06_13_00.sql new file mode 100644 index 00000000000..1df4461fe38 --- /dev/null +++ b/sql/updates/world/2015_06_26_00_world_2015_06_13_00.sql @@ -0,0 +1,11 @@ +SET @GUID := 325984; + +DELETE FROM `creature` WHERE `guid` IN (@GUID, @GUID+1); +INSERT INTO `creature` (`guid`, `id`, `map`, `SpawnMask`, `modelid`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `MovementType`) VALUES +(@GUID, 20212, 642, 3, 0, 7.305609, -0.095246, 34.51022, 3.159046, 7200, 0, 0), +(@GUID+1, 20213, 641, 3, 0, 11.69965, 0.034146, 20.62076, 3.211406, 7200, 0, 0); + +DELETE FROM `creature_addon` WHERE `guid` IN (@GUID, @GUID+1); +INSERT INTO `creature_addon` (`guid`, `auras`) VALUES +(@GUID, '66656'), -- Parachute +(@GUID+1, '66656'); -- Parachute diff --git a/sql/updates/world/2015_06_26_01_world_2015_05_15_00.sql b/sql/updates/world/2015_06_26_01_world_2015_05_15_00.sql new file mode 100644 index 00000000000..06e2bdda370 --- /dev/null +++ b/sql/updates/world/2015_06_26_01_world_2015_05_15_00.sql @@ -0,0 +1,12 @@ +UPDATE `creature_template` SET `ScriptName`="npc_meteor_strike_flame" WHERE `entry`=40055; + +DELETE FROM `spell_script_names` WHERE `spell_id`=75880 OR `ScriptName`="spell_halion_spawn_living_embers"; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(75880, "spell_halion_spawn_living_embers"); + +UPDATE `spell_dbc` SET `Effect1`=77, `EffectImplicitTargetA1`=22, `EffectImplicitTargetB1`=7, `EffectRadiusIndex1`=12, `EffectMiscValue1`=0, `EffectMiscValueB1`=0 WHERE `Id`=75880; +UPDATE `spell_dbc` SET `Effect1`=28, `EffectImplicitTargetA1`=18, `EffectImplicitTargetB1`=0, `EffectRadiusIndex1`=12, `EffectMiscValue1`=40683, `EffectMiscValueB1`=64 WHERE `Id`=75881; + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=75880; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `Comment`) VALUES +(13, 1, 75880, 31, 0, 3, 40055, "Spawn Living Embers can only target Meteor Strike (Flame)"); diff --git a/sql/updates/world/2015_06_26_02_world.sql b/sql/updates/world/2015_06_26_02_world.sql new file mode 100644 index 00000000000..2e4c22ab110 --- /dev/null +++ b/sql/updates/world/2015_06_26_02_world.sql @@ -0,0 +1,24 @@ +-- Oculus GPS System Whispers +DELETE FROM `creature_text` where `entry` IN (27755,27756,27692) AND `groupid` IN (5,6,7,8,9,10); +INSERT INTO `creature_text` (`entry`, `groupid`, `text`, `type`, `probability`, `comment`, `BroadcastTextID`) VALUES +-- Amber Drake +(27755, 5, '$3486W Centrifuge Constructs remain. We must find and destroy them to disable Varos Cloudstrider\'s protective shield. The constructs should be about halfway up The Oculus, on the Band of Acceleration.', 15, 100, 'Amber - Say gps 10 constructs', 29518), +(27755, 6, 'One Centrifuge Construct remains. We must find and destroy it to disable Varos Cloudstrider\'s protective shield. The construct should be about halfway up The Oculus, on the Band of Acceleration.', 15, 100, 'Amber - Say gps 1 construct', 29519), +(27755, 7, 'The shield is down; Varos is vulnerable! Defeating him should disperse the Azure Ring Guardians and allow us access to the upper bands. Varos is on a floating platform about halfway up The Oculus, on the Band of Acceleration.', 15, 100, 'Amber - Say gps Varos', 29520), +(27755, 8, 'Mage-Lord Urom is our next target. He should be hiding on one of the floating platforms on the Band of Transmutation, near the top of The Oculus. Be warned, Urom is a powerful conjurer; he may not be alone.', 15, 100, 'Amber - Say gps Lord Urom', 29521), +(27755, 9, 'Ley-Guardian Eregos is all that now stands between us and control of The Oculus. He\'s flying above the Band of Alignment, at the very top of The Oculus. Eregos is incredibly powerful; stay on my back when we engage him and leave the fighting to me.', 15, 100, 'Amber - Say gps Eregos', 29522), +(27755, 10, 'We\'ve wrested control of The Oculus from the forces of Malygos. You\'re not getting any lighter, little one. My wings itch for the open sky.', 15, 100, 'Amber - Say gps End', 0), +-- Ruby Drake +(27756, 5, '$3486W Centrifuge Constructs remain. We must find and destroy them to disable Varos Cloudstrider\'s protective shield. The constructs should be about halfway up The Oculus, on the Band of Acceleration.', 15, 100, 'Ruby - Say gps 10 constructs', 29518), +(27756, 6, 'One Centrifuge Construct remains. We must find and destroy it to disable Varos Cloudstrider\'s protective shield. The construct should be about halfway up The Oculus, on the Band of Acceleration.', 15, 100, 'Ruby - Say gps 1 construct', 29519), +(27756, 7, 'The shield is down; Varos is vulnerable! Defeating him should disperse the Azure Ring Guardians and allow us access to the upper bands. Varos is on a floating platform about halfway up The Oculus, on the Band of Acceleration.', 15, 100, 'Ruby - Say gps Varos', 29520), +(27756, 8, 'Mage-Lord Urom is our next target. He should be hiding on one of the floating platforms on the Band of Transmutation, near the top of The Oculus. Be warned, Urom is a powerful conjurer; he may not be alone.', 15, 100, 'Ruby - Say gps Lord Urom', 29521), +(27756, 9, 'Ley-Guardian Eregos is all that now stands between us and control of The Oculus. He\'s flying above the Band of Alignment, at the very top of The Oculus. Eregos is incredibly powerful; stay on my back when we engage him and leave the fighting to me.', 15, 100, 'Ruby - Say gps Eregos', 29522), +(27756, 10, 'We\'ve wrested control of The Oculus from the forces of Malygos. You\'re not getting any lighter, little one. My wings itch for the open sky.', 15, 100, 'Ruby - Say gps End', 0), +-- Emerald Drake +(27692, 5, '$3486W Centrifuge Constructs remain. We must find and destroy them to disable Varos Cloudstrider\'s protective shield. The constructs should be about halfway up The Oculus, on the Band of Acceleration.', 15, 100, 'Emerald - Say gps 10 constructs', 29518), +(27692, 6, 'One Centrifuge Construct remains. We must find and destroy it to disable Varos Cloudstrider\'s protective shield. The construct should be about halfway up The Oculus, on the Band of Acceleration.', 15, 100, 'Emerald - Say gps 1 construct', 29519), +(27692, 7, 'The shield is down; Varos is vulnerable! Defeating him should disperse the Azure Ring Guardians and allow us access to the upper bands. Varos is on a floating platform about halfway up The Oculus, on the Band of Acceleration.', 15, 100, 'Emerald - Say gps Varos', 29520), +(27692, 8, 'Mage-Lord Urom is our next target. He should be hiding on one of the floating platforms on the Band of Transmutation, near the top of The Oculus. Be warned, Urom is a powerful conjurer; he may not be alone.', 15, 100, 'Emerald - Say gps Lord Urom', 29521), +(27692, 9, 'Ley-Guardian Eregos is all that now stands between us and control of The Oculus. He\'s flying above the Band of Alignment, at the very top of The Oculus. Eregos is incredibly powerful; stay on my back when we engage him and leave the fighting to me.', 15, 100, 'Emerald - Say gps Eregos', 29522), +(27692, 10, 'We\'ve wrested control of The Oculus from the forces of Malygos. You\'re not getting any lighter, little one. My wings itch for the open sky.', 15, 100, 'Emerald - Say gps End', 0); diff --git a/sql/updates/world/2015_06_28_00_world.sql b/sql/updates/world/2015_06_28_00_world.sql new file mode 100644 index 00000000000..3991d639615 --- /dev/null +++ b/sql/updates/world/2015_06_28_00_world.sql @@ -0,0 +1,17 @@ +-- +UPDATE `creature` SET `position_x`=1997.263,`position_y`=-3256.643, `position_z`=149.723,`orientation`=6.116 WHERE `guid`=105997; +UPDATE `creature` SET `position_x`=2091.723,`position_y`=-3245.161, `position_z`=161.245,`orientation`=3.312 WHERE `guid`=105998; +DELETE FROM `smart_scripts` WHERE `entryorguid`= -105997 AND `source_type`=0; +UPDATE `smart_scripts` SET `event_param1`=43892, `action_type`=11, `target_type`=1, `target_param1`=0, `target_param2`=0 WHERE `entryorguid` IN (24439) AND `source_type`=0 AND `id`=1; +UPDATE `smart_scripts` SET `action_type`=41, `action_param1`=0, `action_param2`=0 WHERE `entryorguid` IN (24439) AND `source_type`=0 AND `id`=4; +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceEntry` IN (24439); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(22,2,24439,0,0, 29,0,15214,1,0,0,0,'','event 1 for 24439 require npc 15214 at 1 yard'); + +DELETE FROM `spell_linked_spell` WHERE `spell_trigger`=43770; +INSERT INTO `spell_linked_spell` (`spell_trigger`,`spell_effect`,`type`,`comment`) VALUES +(43770,43892,1,'Steel Gate Drop Off Check'); + +DELETE FROM `creature` WHERE `guid` IN (104706, 104705); +UPDATE `creature` SET `MovementType`=0, `spawndist`=0 WHERE `guid`=104704; +UPDATE `creature_template` SET `npcflag`=16777216 WHERE `entry`=24418; diff --git a/sql/updates/world/2015_06_28_01_world.sql b/sql/updates/world/2015_06_28_01_world.sql new file mode 100644 index 00000000000..4f591bc293c --- /dev/null +++ b/sql/updates/world/2015_06_28_01_world.sql @@ -0,0 +1,23 @@ +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 13 AND `SourceGroup` = 1 AND `SourceEntry` IN ( 50036,51518,50087); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `ConditionTypeOrReference`, `ConditionValue1`, `ConditionValue2`) VALUES +(13, 1, 50036, 31, 3, 27641), +(13, 1, 51518, 31, 3, 27641), +(13, 1, 50087, 31, 3, 27641); + +DELETE FROM `spelldifficulty_dbc` WHERE `id` = 50044; +INSERT INTO `spelldifficulty_dbc` (`id`, `spellid0`, `spellid1`) VALUES (50044, 50044, 59213); + +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=27641; + +DELETE FROM `creature_template_addon` WHERE `entry` IN (27641,30905); +INSERT INTO `creature_template_addon` (`entry`,`auras`) VALUES +(27641,'50044'), +(30905,'59213'); + +DELETE FROM `smart_scripts` WHERE `entryorguid` = 27639 AND `source_type` = 0 AND `id` = 16; +DELETE FROM `smart_scripts` WHERE `entryorguid` = 27640 AND `source_type` = 0 AND `id` = 2; +DELETE FROM `smart_scripts` WHERE `entryorguid` = 27641 AND `source_type` = 0 AND `id` = 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 +(27639, 0, 16, 0, 1, 0, 100, 0, 1000, 1000, 0, 0, 11, 51518, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Ring-Lord Sorceress - Out of Combat - Cast Beam Visual'), +(27640, 0, 2, 0, 1, 0, 100, 0, 1000, 1000, 0, 0, 11, 51518, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Ring-Lord Conjurer - Out of combat - Cast Visual'), +(27641, 0, 0, 0, 1, 0, 100, 1, 0, 0, 0, 0, 11, 50088, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Centrifuge Core - Out of Combat - Cast Energy Link');
\ No newline at end of file diff --git a/sql/updates/world/2015_06_28_02_world.sql b/sql/updates/world/2015_06_28_02_world.sql new file mode 100644 index 00000000000..0b376442393 --- /dev/null +++ b/sql/updates/world/2015_06_28_02_world.sql @@ -0,0 +1,8 @@ +-- +DELETE FROM `creature_addon` WHERE `guid` IN (104706, 104705); + +DELETE FROM `spell_linked_spell` WHERE `spell_trigger` IN (53099, 54640, 55288); +DELETE FROM `spell_scripts` WHERE `id` IN (53099, 55288); +INSERT INTO `spell_scripts` (`id`,`effIndex`,`delay`,`command`,`datalong`,`datalong2`,`dataint`,`x`,`y`,`z`,`o`) VALUES +(53099,0,0,15,53098,0,0,0,0,0,0), +(55288,0,0,15,55289,0,0,0,0,0,0); diff --git a/sql/updates/world/2015_06_28_03_world.sql b/sql/updates/world/2015_06_28_03_world.sql new file mode 100644 index 00000000000..ff6dfc6330f --- /dev/null +++ b/sql/updates/world/2015_06_28_03_world.sql @@ -0,0 +1,2 @@ +-- +DELETE FROM `gossip_menu_option` WHERE `menu_id`=1293 AND `id`=3; diff --git a/sql/updates/world/2015_06_28_04_world.sql b/sql/updates/world/2015_06_28_04_world.sql new file mode 100644 index 00000000000..9e96b40fa0b --- /dev/null +++ b/sql/updates/world/2015_06_28_04_world.sql @@ -0,0 +1,34 @@ +-- +UPDATE `creature_template` SET `AIName`="SmartAI" WHERE `entry` IN (27405, 27406); +UPDATE `spell_area` SET `quest_start` =0, `quest_start_status` =0, `quest_end_status` =0 WHERE `spell` IN (48761, 48763); + +UPDATE `smart_scripts` SET `event_phase_mask`=0 WHERE `entryorguid`=27202 AND `source_type`=0 AND `id` =3; +UPDATE `smart_scripts` SET `link` =16 WHERE `entryorguid`=27202 AND `source_type`=0 AND `id` =12; +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (27405, 27406) AND `source_type`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (2740500, 2740600) AND `source_type`=9; +DELETE FROM `smart_scripts` WHERE `entryorguid`=27202 AND `source_type`=0 AND id>15 ; +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 +(27202, 0, 16, 17, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48654, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Onslaught Raven Priest - On Spellhit Banshee''s Magic Mirror - Cast The Perfect Dissemblance: Summon Priest''s Footman (No Repeat)'), +(27202, 0, 17, 18, 61, 0, 100, 0, 0, 0, 0, 0, 85, 48763, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Onslaught Raven Priest - On Spellhit Banshee''s Magic Mirror - Cast Scarlet Raven Priest Image'), +(27202, 0, 18, 19, 61, 0, 100, 0, 0, 0, 0, 0, 85, 48761, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Onslaught Raven Priest - On Spellhit Banshee''s Magic Mirror - Cast Scarlet Raven Priest Image'), +(27202, 0, 19, 0, 61, 0, 100, 0, 0, 0, 0, 0, 2, 14, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Onslaught Raven Priest - On Spellhit Banshee''s Magic Mirror - Set faction'), +(27405, 0, 0, 0, 54, 0, 100, 0, 0, 0, 0, 0, 80, 2740500, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Onslaught Footman - On just summoned - Action list'), +(2740500, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 2, 14, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Onslaught Footman - Action list - Set faction'), +(2740500, 9, 1, 0, 0, 0, 100, 0, 2000, 2000, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Onslaught Footman - Action list - Talk text1'), +(2740500, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 21, 40, 0, 0, 0, 0, 0, 0, 'Onslaught Footman - Action list - Start attack'), +(27405, 0, 1, 0, 0, 0, 100, 0, 2000, 2000, 28000, 28000, 11, 50713, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Onslaught Footman - IC - Unrelenting Onslaught '), +(27406, 0, 0, 0, 54, 0, 100, 0, 0, 0, 0, 0, 80, 2740600, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Onslaught Footman - On just summoned - Action list'), +(2740600, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 2, 14, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Onslaught Footman - Action list - Set faction'), +(2740600, 9, 1, 0, 0, 0, 100, 0, 4000, 4000, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Onslaught Footman - Action list - Talk text1'), +(2740600, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 21, 40, 0, 0, 0, 0, 0, 0, 'Onslaught Footman - Action list - Start attack'), +(27406, 0, 1, 0, 0, 0, 100, 0, 2000, 2000, 28000, 28000, 11, 50713, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Onslaught Footman - IC - Unrelenting Onslaught '); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=22 AND `SourceEntry` IN (27202); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(22,18,27202,0,0,20,1,0,0,0,0,0,0,'','Onslaught Raven Priest SAI event 17 require a male character'), +(22,19,27202,0,0,20,1,1,0,0,0,0,0,'','Onslaught Raven Priest SAI event 17 require a female character'); + +DELETE FROM `creature_text` WHERE `entry` IN (27405, 27406); +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`, `BroadcastTextId`) VALUES +(27405,0,0,'What''s going on here, sarge?',12,0,100,0,0,0,'Onslaught Footman', 26541), +(27406,0,0,'I don''t know. Better kill them both to be on the safe side!',12,0,100,0,0,0,'Onslaught Footman', 26542); diff --git a/sql/updates/world/2015_06_28_05_world.sql b/sql/updates/world/2015_06_28_05_world.sql new file mode 100644 index 00000000000..b01701a74bd --- /dev/null +++ b/sql/updates/world/2015_06_28_05_world.sql @@ -0,0 +1,5 @@ +-- +DELETE FROM `smart_scripts` WHERE `entryorguid` IN (2558400) AND `source_type`=9 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 +(2558400, 9, 3, 0, 0, 0, 100, 0, 0, 0, 0, 0, 28, 45775, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,'Inquisitor Salrand - On Script - Remove Aura'), +(2558400, 9, 4, 0, 0, 0, 100, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 21, 30, 0, 0, 0, 0, 0, 0,'Inquisitor Salrand - On Script - Start attack'); diff --git a/sql/updates/world/2015_06_28_06_world.sql b/sql/updates/world/2015_06_28_06_world.sql new file mode 100644 index 00000000000..f8937aaf081 --- /dev/null +++ b/sql/updates/world/2015_06_28_06_world.sql @@ -0,0 +1,13 @@ +-- +DELETE FROM `spell_area` WHERE `spell` IN(46424); +INSERT INTO `spell_area` (`spell`, `area`, `quest_start`, `quest_end`, `aura_spell`, `racemask`, `gender`, `autocast`, `quest_start_status`, `quest_end_status`) VALUES +(46424, 4119, 11896, 0, 0, 0, 2, 1, 10, 0), +(46424, 4035, 11896, 0, 0, 0, 2, 1, 10, 0), +(46424, 4146, 11896, 0, 0, 0, 2, 1, 10, 0), +(46424, 4116, 11896, 0, 0, 0, 2, 1, 10, 0), +(46424, 4117, 11896, 0, 0, 0, 2, 1, 10, 0), +(46424, 4037, 11896, 0, 0, 0, 2, 1, 10, 0); + +DELETE FROM `spell_scripts` WHERE `id`=46550; +INSERT INTO `spell_scripts` (`id`, `effIndex`, `delay`, `command`, `datalong`, `datalong2`, `dataint`, `x`, `y`, `z`, `o`) VALUES +(46550, 0, 0, 14, 46424, 0, 0, 0, 0, 0, 0); diff --git a/sql/updates/world/2015_06_28_07_world.sql b/sql/updates/world/2015_06_28_07_world.sql new file mode 100644 index 00000000000..20bddf5597c --- /dev/null +++ b/sql/updates/world/2015_06_28_07_world.sql @@ -0,0 +1,2 @@ +-- +UPDATE `gameobject_template` SET `faction`=1673 WHERE `entry` IN (181597); diff --git a/src/server/collision/Models/GameObjectModel.cpp b/src/server/collision/Models/GameObjectModel.cpp index 0355d2e848c..dd1502c45b0 100644 --- a/src/server/collision/Models/GameObjectModel.cpp +++ b/src/server/collision/Models/GameObjectModel.cpp @@ -186,12 +186,12 @@ bool GameObjectModel::intersectRay(const G3D::Ray& ray, float& MaxDist, bool Sto return hit; } -bool GameObjectModel::Relocate(const GameObject& go) +bool GameObjectModel::UpdatePosition() { if (!iModel) return false; - ModelList::const_iterator it = model_list.find(go.GetDisplayId()); + ModelList::const_iterator it = model_list.find(owner->GetDisplayId()); if (it == model_list.end()) return false; @@ -203,9 +203,9 @@ bool GameObjectModel::Relocate(const GameObject& go) return false; } - iPos = Vector3(go.GetPositionX(), go.GetPositionY(), go.GetPositionZ()); + iPos = Vector3(owner->GetPositionX(), owner->GetPositionY(), owner->GetPositionZ()); - G3D::Matrix3 iRotation = G3D::Matrix3::fromEulerAnglesZYX(go.GetOrientation(), 0, 0); + G3D::Matrix3 iRotation = G3D::Matrix3::fromEulerAnglesZYX(owner->GetOrientation(), 0, 0); iInvRot = iRotation.inverse(); // transform bounding box: mdl_box = AABox(mdl_box.low() * iScale, mdl_box.high() * iScale); @@ -219,7 +219,7 @@ bool GameObjectModel::Relocate(const GameObject& go) for (int i = 0; i < 8; ++i) { Vector3 pos(iBound.corner(i)); - go.SummonCreature(1, pos.x, pos.y, pos.z, 0, TEMPSUMMON_MANUAL_DESPAWN); + owner->SummonCreature(1, pos.x, pos.y, pos.z, 0, TEMPSUMMON_MANUAL_DESPAWN); } #endif diff --git a/src/server/collision/Models/GameObjectModel.h b/src/server/collision/Models/GameObjectModel.h index 232ebbee5e9..43d299d6d8f 100644 --- a/src/server/collision/Models/GameObjectModel.h +++ b/src/server/collision/Models/GameObjectModel.h @@ -68,7 +68,7 @@ public: static GameObjectModel* Create(const GameObject& go); - bool Relocate(GameObject const& go); + bool UpdatePosition(); }; #endif // _GAMEOBJECT_MODEL_H diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index a91bbf00735..3b9b6d9dfe8 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -1370,6 +1370,12 @@ bool Creature::CanStartAttack(Unit const* who, bool force) const if (IsCivilian()) return false; + // This set of checks is should be done only for creatures + if ((HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC) && who->GetTypeId() != TYPEID_PLAYER) // flag is valid only for non player characters + || (HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC) && who->GetTypeId() == TYPEID_PLAYER) // immune to PC and target is a player, return false + || (who->GetOwner() && who->GetOwner()->GetTypeId() == TYPEID_PLAYER) && HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC)) // player pets are immune to pc as well + return false; + // Do not attack non-combat pets if (who->GetTypeId() == TYPEID_UNIT && who->GetCreatureType() == CREATURE_TYPE_NON_COMBAT_PET) return false; diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index a4b140b9878..50981a163be 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -1757,6 +1757,9 @@ void GameObject::Use(Unit* user) return; } + if (Player* player = user->ToPlayer())
+ sOutdoorPvPMgr->HandleCustomSpell(player, spellId, this);
+
if (spellCaster) spellCaster->CastSpell(user, spellInfo, triggered); else @@ -2314,7 +2317,7 @@ void GameObject::UpdateModelPosition() if (GetMap()->ContainsGameObjectModel(*m_model)) { GetMap()->RemoveGameObjectModel(*m_model); - m_model->Relocate(*this); + m_model->UpdatePosition(); GetMap()->InsertGameObjectModel(*m_model); } } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 275dbf92dca..55d882c65d3 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -9616,13 +9616,9 @@ void Player::SendBattlefieldWorldStates() { if (BattlefieldWG* wg = (BattlefieldWG*)sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG)) { - if (wg->IsWarTime()) - SendUpdateWorldState(ClockWorldState[1], uint32(time(NULL))); - else // Time to next battle - { - uint32 timer = wg->GetTimer() / 1000; - SendUpdateWorldState(ClockWorldState[1], time(NULL) + timer); - } + SendUpdateWorldState(BATTLEFIELD_WG_WORLD_STATE_ACTIVE, wg->IsWarTime() ? 0 : 1); + uint32 timer = wg->IsWarTime() ? 0 : (wg->GetTimer() / 1000); // 0 - Time to next battle + SendUpdateWorldState(ClockWorldState[1], uint32(time(NULL) + timer)); } } } @@ -17052,8 +17048,8 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) //"resettalents_time, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, instance_mode_mask, " // 39 40 41 42 43 44 45 46 47 48 49 //"arenaPoints, totalHonorPoints, todayHonorPoints, yesterdayHonorPoints, totalKills, todayKills, yesterdayKills, chosenTitle, knownCurrencies, watchedFaction, drunk, " - // 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 - //"health, power1, power2, power3, power4, power5, power6, power7, instance_id, speccount, activespec, exploredZones, equipmentCache, ammoId, knownTitles, actionBars, grantableLevels FROM characters WHERE guid = '%u'", guid); + // 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 + //"health, power1, power2, power3, power4, power5, power6, power7, instance_id, talentGroupsCount, activeTalentGroup, exploredZones, equipmentCache, ammoId, knownTitles, actionBars, grantableLevels FROM characters WHERE guid = '%u'", guid); PreparedQueryResult result = holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_FROM); if (!result) { @@ -17812,9 +17808,9 @@ void Player::_LoadAuras(PreparedQueryResult result, uint32 timediff) TC_LOG_DEBUG("entities.player.loading", "Loading auras for player %u", GetGUIDLow()); /* 0 1 2 3 4 5 6 7 8 9 10 - QueryResult* result = CharacterDatabase.PQuery("SELECT caster_guid, spell, effect_mask, recalculate_mask, stackcount, amount0, amount1, amount2, base_amount0, base_amount1, base_amount2, + QueryResult* result = CharacterDatabase.PQuery("SELECT casterGuid, spell, effectMask, recalculateMask, stackCount, amount0, amount1, amount2, base_amount0, base_amount1, base_amount2, 11 12 13 - maxduration, remaintime, remaincharges FROM character_aura WHERE guid = '%u'", GetGUIDLow()); + maxDuration, remainTime, remainCharges FROM character_aura WHERE guid = '%u'", GetGUIDLow()); */ if (result) @@ -23657,6 +23653,9 @@ bool Player::IsAtGroupRewardDistance(WorldObject const* pRewardSource) const if (player->GetMapId() != pRewardSource->GetMapId() || player->GetInstanceId() != pRewardSource->GetInstanceId()) return false; + if (player->GetMap()->IsDungeon()) + return true; + return pRewardSource->GetDistance(player) <= sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE); } @@ -25621,7 +25620,7 @@ void Player::SetMap(Map* map) void Player::_LoadGlyphs(PreparedQueryResult result) { - // SELECT spec, glyph1, glyph2, glyph3, glyph4, glyph5, glyph6 from character_glyphs WHERE guid = '%u' + // SELECT talentGroup, glyph1, glyph2, glyph3, glyph4, glyph5, glyph6 from character_glyphs WHERE guid = '%u' if (!result) return; @@ -25668,7 +25667,7 @@ void Player::_SaveGlyphs(SQLTransaction& trans) void Player::_LoadTalents(PreparedQueryResult result) { - // SetPQuery(PLAYER_LOGIN_QUERY_LOADTALENTS, "SELECT spell, spec FROM character_talent WHERE guid = '%u'", GUID_LOPART(m_guid)); + // SetPQuery(PLAYER_LOGIN_QUERY_LOADTALENTS, "SELECT spell, talentGroup FROM character_talent WHERE guid = '%u'", GUID_LOPART(m_guid)); if (result) { do diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 9b0da57fa31..b9d4650de47 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -12322,15 +12322,15 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced) // Apply strongest slow aura mod to speed int32 slow = GetMaxNegativeAuraModifier(SPELL_AURA_MOD_DECREASE_SPEED); if (slow) - { AddPct(speed, slow); - if (float minSpeedMod = (float)GetMaxPositiveAuraModifier(SPELL_AURA_MOD_MINIMUM_SPEED)) - { - float min_speed = minSpeedMod / 100.0f; - if (speed < min_speed) - speed = min_speed; - } + + if (float minSpeedMod = (float)GetMaxPositiveAuraModifier(SPELL_AURA_MOD_MINIMUM_SPEED)) + { + float min_speed = minSpeedMod / 100.0f; + if (speed < min_speed) + speed = min_speed; } + SetSpeed(mtype, speed, forced); } diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index 2e81bdd1af8..f89c0e73008 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -936,7 +936,7 @@ void Group::GroupLoot(Loot* loot, WorldObject* pLootedObject) continue; if (i->AllowedForPlayer(member)) { - if (member->IsWithinDistInMap(pLootedObject, sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE), false)) + if (member->IsAtGroupRewardDistance(pLootedObject)) { r->totalPlayersRolling++; @@ -1021,7 +1021,7 @@ void Group::GroupLoot(Loot* loot, WorldObject* pLootedObject) if (i->AllowedForPlayer(member)) { - if (member->IsWithinDistInMap(pLootedObject, sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE), false)) + if (member->IsAtGroupRewardDistance(pLootedObject)) { r->totalPlayersRolling++; r->playerVote[member->GetGUID()] = NOT_EMITED_YET; @@ -1080,7 +1080,7 @@ void Group::NeedBeforeGreed(Loot* loot, WorldObject* lootedObject) continue; bool allowedForPlayer = i->AllowedForPlayer(playerToRoll); - if (allowedForPlayer && playerToRoll->IsWithinDistInMap(lootedObject, sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE), false)) + if (allowedForPlayer && playerToRoll->IsAtGroupRewardDistance(lootedObject)) { r->totalPlayersRolling++; if (playerToRoll->GetPassOnGroupLoot()) @@ -1155,7 +1155,7 @@ void Group::NeedBeforeGreed(Loot* loot, WorldObject* lootedObject) continue; bool allowedForPlayer = i->AllowedForPlayer(playerToRoll); - if (allowedForPlayer && playerToRoll->IsWithinDistInMap(lootedObject, sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE), false)) + if (allowedForPlayer && playerToRoll->IsAtGroupRewardDistance(lootedObject)) { r->totalPlayersRolling++; r->playerVote[playerToRoll->GetGUID()] = NOT_EMITED_YET; @@ -1231,7 +1231,7 @@ void Group::MasterLoot(Loot* loot, WorldObject* pLootedObject) if (!looter->IsInWorld()) continue; - if (looter->IsWithinDistInMap(pLootedObject, sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE), false)) + if (looter->IsAtGroupRewardDistance(pLootedObject)) { data << uint64(looter->GetGUID()); ++real_count; @@ -1243,7 +1243,7 @@ void Group::MasterLoot(Loot* loot, WorldObject* pLootedObject) for (GroupReference* itr = GetFirstMember(); itr != NULL; itr = itr->next()) { Player* looter = itr->GetSource(); - if (looter->IsWithinDistInMap(pLootedObject, sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE), false)) + if (looter->IsAtGroupRewardDistance(pLootedObject)) looter->GetSession()->SendPacket(&data); } } @@ -1743,7 +1743,7 @@ void Group::UpdateLooterGuid(WorldObject* pLootedObject, bool ifneed) { // not update if only update if need and ok Player* looter = ObjectAccessor::FindPlayer(guid_itr->guid); - if (looter && looter->IsWithinDistInMap(pLootedObject, sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE), false)) + if (looter && looter->IsAtGroupRewardDistance(pLootedObject)) return; } ++guid_itr; @@ -1754,7 +1754,7 @@ void Group::UpdateLooterGuid(WorldObject* pLootedObject, bool ifneed) for (member_citerator itr = guid_itr; itr != m_memberSlots.end(); ++itr) { if (Player* player = ObjectAccessor::FindPlayer(itr->guid)) - if (player->IsWithinDistInMap(pLootedObject, sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE), false)) + if (player->IsAtGroupRewardDistance(pLootedObject)) { pNewLooter = player; break; @@ -1767,7 +1767,7 @@ void Group::UpdateLooterGuid(WorldObject* pLootedObject, bool ifneed) for (member_citerator itr = m_memberSlots.begin(); itr != guid_itr; ++itr) { if (Player* player = ObjectAccessor::FindPlayer(itr->guid)) - if (player->IsWithinDistInMap(pLootedObject, sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE), false)) + if (player->IsAtGroupRewardDistance(pLootedObject)) { pNewLooter = player; break; diff --git a/src/server/game/Groups/GroupMgr.cpp b/src/server/game/Groups/GroupMgr.cpp index 771fcb17b32..ab80a208765 100644 --- a/src/server/game/Groups/GroupMgr.cpp +++ b/src/server/game/Groups/GroupMgr.cpp @@ -124,7 +124,7 @@ void GroupMgr::LoadGroups() // 0 1 2 3 4 5 6 7 8 9 QueryResult result = CharacterDatabase.Query("SELECT g.leaderGuid, g.lootMethod, g.looterGuid, g.lootThreshold, g.icon1, g.icon2, g.icon3, g.icon4, g.icon5, g.icon6" // 10 11 12 13 14 15 16 17 18 - ", g.icon7, g.icon8, g.groupType, g.difficulty, g.raiddifficulty, g.masterLooterGuid, g.guid, lfg.dungeon, lfg.state FROM groups g LEFT JOIN lfg_data lfg ON lfg.guid = g.guid ORDER BY g.guid ASC"); + ", g.icon7, g.icon8, g.groupType, g.difficulty, g.raidDifficulty, g.masterLooterGuid, g.guid, lfg.dungeon, lfg.state FROM groups g LEFT JOIN lfg_data lfg ON lfg.guid = g.guid ORDER BY g.guid ASC"); if (!result) { TC_LOG_INFO("server.loading", ">> Loaded 0 group definitions. DB table `groups` is empty!"); diff --git a/src/server/game/Handlers/LootHandler.cpp b/src/server/game/Handlers/LootHandler.cpp index b4f19234df9..26d1737257e 100644 --- a/src/server/game/Handlers/LootHandler.cpp +++ b/src/server/game/Handlers/LootHandler.cpp @@ -176,7 +176,7 @@ void WorldSession::HandleLootMoneyOpcode(WorldPacket& /*recvData*/) if (!member) continue; - if (player->IsWithinDistInMap(member, sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE), false)) + if (player->IsAtGroupRewardDistance(member)) playersNear.push_back(member); } diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp index ba4e4713458..c825db1e1eb 100644 --- a/src/server/game/Loot/LootMgr.cpp +++ b/src/server/game/Loot/LootMgr.cpp @@ -151,14 +151,8 @@ uint32 LootStore::LoadLootTable() bool needsquest = fields[4].GetBool(); uint16 lootmode = fields[5].GetUInt16(); uint8 groupid = fields[6].GetUInt8(); - int32 mincount = fields[7].GetUInt8(); - int32 maxcount = fields[8].GetUInt8(); - - if (maxcount > std::numeric_limits<uint8>::max()) - { - TC_LOG_ERROR("sql.sql", "Table '%s' Entry %d Item %d: MaxCount value (%u) to large. must be less %u - skipped", GetName(), entry, item, maxcount, std::numeric_limits<uint8>::max()); - continue; // error already printed to log/console. - } + uint8 mincount = fields[7].GetUInt8(); + uint8 maxcount = fields[8].GetUInt8(); if (groupid >= 1 << 7) // it stored in 7 bit field { diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index 9bae8fbdfae..63390ad61da 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -971,15 +971,15 @@ enum TrinityStrings LANG_GUILD_INFO_BANK_GOLD = 1181, LANG_GUILD_INFO_MOTD = 1182, LANG_GUILD_INFO_EXTRA_INFO = 1183, - // Room for more level 3 1184-1199 not used + // Room for more level 3 1184-1198 not used // Debug commands + LANG_DO_NOT_USE_6X_DEBUG_AREATRIGGER_LEFT = 1999, LANG_CINEMATIC_NOT_EXIST = 1200, LANG_MOVIE_NOT_EXIST = 1201, LANG_DEBUG_AREATRIGGER_ON = 1202, LANG_DEBUG_AREATRIGGER_OFF = 1203, LANG_DEBUG_AREATRIGGER_REACHED = 1204, - // Room for more debug 1205-1299 not used // Isle of Conquest LANG_BG_IC_START_TWO_MINUTES = 1205, diff --git a/src/server/game/Movement/PathGenerator.cpp b/src/server/game/Movement/PathGenerator.cpp index afd1f73c785..2aebac6beb4 100644 --- a/src/server/game/Movement/PathGenerator.cpp +++ b/src/server/game/Movement/PathGenerator.cpp @@ -116,7 +116,7 @@ dtPolyRef PathGenerator::GetPathPolyByPosition(dtPolyRef const* polyPath, uint32 } if (distance) - *distance = dtSqrt(minDist3d); + *distance = dtMathSqrtf(minDist3d); return (minDist2d < 3.0f) ? nearestPoly : INVALID_POLYREF; } @@ -799,7 +799,7 @@ dtStatus PathGenerator::FindSmoothPath(float const* startPos, float const* endPo // Find movement delta. float delta[VERTEX_SIZE]; dtVsub(delta, steerPos, iterPos); - float len = dtSqrt(dtVdot(delta, delta)); + float len = dtMathSqrtf(dtVdot(delta, delta)); // If the steer target is end of path or off-mesh link, do not move past the location. if ((endOfPath || offMeshConnection) && len < SMOOTH_PATH_STEP_SIZE) len = 1.0f; diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 3829e12b790..965b2463139 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -3100,19 +3100,18 @@ void Spell::EffectTaunt(SpellEffIndex /*effIndex*/) if (m_spellInfo->Id == 62124) m_caster->CastSpell(unitTarget, 67485, true); - // Also use this effect to set the taunter's threat to the taunted creature's highest value - if (unitTarget->getThreatManager().getCurrentVictim()) + if (!unitTarget->getThreatManager().getOnlineContainer().empty()) { + // Also use this effect to set the taunter's threat to the taunted creature's highest value float myThreat = unitTarget->getThreatManager().getThreat(m_caster); - float itsThreat = unitTarget->getThreatManager().getCurrentVictim()->getThreat(); - if (itsThreat > myThreat) - unitTarget->getThreatManager().addThreat(m_caster, itsThreat - myThreat); - } + float topThreat = unitTarget->getThreatManager().getOnlineContainer().getMostHated()->getThreat(); + if (topThreat > myThreat) + unitTarget->getThreatManager().doAddThreat(m_caster, topThreat - myThreat); - //Set aggro victim to caster - if (!unitTarget->getThreatManager().getOnlineContainer().empty()) + //Set aggro victim to caster if (HostileReference* forcedVictim = unitTarget->getThreatManager().getOnlineContainer().getReferenceByTarget(m_caster)) unitTarget->getThreatManager().setCurrentVictim(forcedVictim); + } if (unitTarget->ToCreature()->IsAIEnabled && !unitTarget->ToCreature()->HasReactState(REACT_PASSIVE)) unitTarget->ToCreature()->AI()->AttackStart(m_caster); diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 789b95e3e14..ea5e4c8df0b 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -1489,6 +1489,7 @@ SpellCastResult SpellInfo::CheckLocation(uint32 map_id, uint32 zone_id, uint32 a if (player && !player->CanFlyInZone(map_id, zone_id)) return SPELL_FAILED_INCORRECT_AREA; } + break; } } } diff --git a/src/server/game/Tickets/TicketMgr.cpp b/src/server/game/Tickets/TicketMgr.cpp index db37989bfc3..3d26f349ca5 100644 --- a/src/server/game/Tickets/TicketMgr.cpp +++ b/src/server/game/Tickets/TicketMgr.cpp @@ -296,7 +296,7 @@ void TicketMgr::LoadTickets() PreparedQueryResult result = CharacterDatabase.Query(stmt); if (!result) { - TC_LOG_INFO("server.loading", ">> Loaded 0 GM tickets. DB table `gm_tickets` is empty!"); + TC_LOG_INFO("server.loading", ">> Loaded 0 GM tickets. DB table `gm_ticket` is empty!"); return; } @@ -333,7 +333,7 @@ void TicketMgr::LoadSurveys() _lastSurveyId = 0; uint32 oldMSTime = getMSTime(); - if (QueryResult result = CharacterDatabase.Query("SELECT MAX(surveyId) FROM gm_surveys")) + if (QueryResult result = CharacterDatabase.Query("SELECT MAX(surveyId) FROM gm_survey")) _lastSurveyId = (*result)[0].GetUInt32(); TC_LOG_INFO("server.loading", ">> Loaded GM Survey count from database in %u ms", GetMSTimeDiffToNow(oldMSTime)); diff --git a/src/server/game/Tools/CharacterDatabaseCleaner.cpp b/src/server/game/Tools/CharacterDatabaseCleaner.cpp index 78bc1b799de..815212aa53d 100644 --- a/src/server/game/Tools/CharacterDatabaseCleaner.cpp +++ b/src/server/game/Tools/CharacterDatabaseCleaner.cpp @@ -147,7 +147,7 @@ bool CharacterDatabaseCleaner::TalentCheck(uint32 talent_id) void CharacterDatabaseCleaner::CleanCharacterTalent() { - CharacterDatabase.DirectPExecute("DELETE FROM character_talent WHERE spec > %u", MAX_TALENT_SPECS); + CharacterDatabase.DirectPExecute("DELETE FROM character_talent WHERE talentGroup > %u", MAX_TALENT_SPECS); CheckUnique("spell", "character_talent", &TalentCheck); } diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp index ad510682e15..04ea31bd1dd 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp @@ -26,14 +26,6 @@ #include "ruby_sanctum.h" #include "Player.h" -/* ScriptData -SDName: ruby_sanctum -SDAuthors: Kaelima, Warpten -SD%Complete: 90% -SDComment: Based on Kaelima's initial work (half of it). Corporeality handling is a pure guess, we lack info. -SDCategory: Chamber of Aspects -EndScriptData */ - enum Texts { // Shared @@ -87,6 +79,8 @@ enum Spells // Living Inferno SPELL_BLAZING_AURA = 75885, + SPELL_SPAWN_LIVING_EMBERS = 75880, + SPELL_SUMMON_LIVING_EMBER = 75881, // Halion Controller SPELL_COSMETIC_FIRE_PILLAR = 76006, @@ -143,7 +137,7 @@ enum Events EVENT_CHECK_CORPOREALITY = 14, EVENT_SHADOW_PULSARS_SHOOT = 15, EVENT_TRIGGER_BERSERK = 16, - EVENT_TWILIGHT_MENDING = 17 + EVENT_TWILIGHT_MENDING = 17, }; enum Actions @@ -156,7 +150,13 @@ enum Actions ACTION_MONITOR_CORPOREALITY = 3, // Orb Carrier - ACTION_SHOOT = 4 + ACTION_SHOOT = 4, + + // Living Inferno + ACTION_SUMMON_LIVING_EMBERS = 5, + + // Meteor Flame + ACTION_SUMMON_FLAME = 6 }; enum Phases @@ -174,7 +174,8 @@ enum Misc DATA_MATERIAL_DAMAGE_TAKEN = 2, DATA_STACKS_DISPELLED = 3, DATA_FIGHT_PHASE = 4, - DATA_EVADE_METHOD = 5 + DATA_EVADE_METHOD = 5, + DATA_SPAWNED_FLAMES = 6, }; enum OrbCarrierSeats @@ -703,7 +704,7 @@ class npc_halion_controller : public CreatureScript // The IsInCombat() check is needed because that check should be false when Halion is // not engaged, while it would return true without as UpdateVictim() checks for // combat state. - if (!(_events.IsInPhase(PHASE_INTRO)) && me->IsInCombat() && !UpdateVictim()) + if (!_events.IsInPhase(PHASE_INTRO) && me->IsInCombat() && !UpdateVictim()) { EnterEvadeMode(); return; @@ -894,8 +895,6 @@ class npc_halion_controller : public CreatureScript } }; -typedef npc_halion_controller::npc_halion_controllerAI controllerAI; - class npc_orb_carrier : public CreatureScript { public: @@ -997,7 +996,7 @@ class npc_meteor_strike_initial : public CreatureScript if (!owner) return; - // Let Halion Controller count as summoner + // Let Controller count as summoner if (Creature* controller = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_HALION_CONTROLLER))) controller->AI()->JustSummoned(me); @@ -1007,11 +1006,13 @@ class npc_meteor_strike_initial : public CreatureScript if (HalionAI* halionAI = CAST_AI(HalionAI, owner->AI())) { Position const* ownerPos = halionAI->GetMeteorStrikePosition(); + // Adjust randomness between 0 and pi. + float randomAdjustment = frand(static_cast<float>(M_PI / 14), static_cast<float>(13 * M_PI / 14)); float angle[4]; angle[0] = me->GetAngle(ownerPos); - angle[1] = me->GetAngle(ownerPos) - static_cast<float>(M_PI/2); - angle[2] = me->GetAngle(ownerPos) - static_cast<float>(-M_PI/2); - angle[3] = me->GetAngle(ownerPos) - static_cast<float>(M_PI); + angle[1] = angle[0] + randomAdjustment; + angle[2] = angle[0] + static_cast<float>(M_PI); + angle[3] = angle[2] + randomAdjustment; _meteorList.clear(); for (uint8 i = 0; i < 4; i++) @@ -1020,7 +1021,10 @@ class npc_meteor_strike_initial : public CreatureScript me->SetOrientation(angle[i]); Position newPos = me->GetNearPosition(10.0f, 0.0f); // Exact distance if (Creature* meteor = me->SummonCreature(NPC_METEOR_STRIKE_NORTH + i, newPos, TEMPSUMMON_TIMED_DESPAWN, 30000)) + { + meteor->SetOrientation(angle[i]); _meteorList.push_back(meteor); + } } } } @@ -1046,11 +1050,8 @@ class npc_meteor_strike : public CreatureScript struct npc_meteor_strikeAI : public ScriptedAI { npc_meteor_strikeAI(Creature* creature) : ScriptedAI(creature), - _instance(creature->GetInstanceScript()) + _instance(creature->GetInstanceScript()), _spawnCount(0) { - _range = 5.0f; - _spawnCount = 0; - SetCombatMovement(false); } @@ -1071,34 +1072,38 @@ class npc_meteor_strike : public CreatureScript controller->AI()->JustSummoned(me); } - void UpdateAI(uint32 diff) override + void SetData(uint32 dataType, uint32 dataCount) override { - if (_spawnCount > 5) - return; + if (dataType == DATA_SPAWNED_FLAMES) + _spawnCount += dataCount; + } - _events.Update(diff); + uint32 GetData(uint32 dataType) const override + { + if (dataType == DATA_SPAWNED_FLAMES) + return _spawnCount; + return 0; + } + void UpdateAI(uint32 diff) override + { + _events.Update(diff); if (_events.ExecuteEvent() == EVENT_SPAWN_METEOR_FLAME) { - Position pos = me->GetNearPosition( _range, 0.0f); - + Position pos = me->GetNearPosition(5.0f, 0.0f); if (Creature* flame = me->SummonCreature(NPC_METEOR_STRIKE_FLAME, pos, TEMPSUMMON_TIMED_DESPAWN, 25000)) { - if (Creature* controller = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_HALION_CONTROLLER))) - controller->AI()->JustSummoned(flame); + flame->SetOrientation(me->GetOrientation()); - flame->CastSpell(flame, SPELL_METEOR_STRIKE_FIRE_AURA_2, true); - ++_spawnCount; + flame->AI()->SetGUID(GetGUID()); + flame->AI()->DoAction(ACTION_SUMMON_FLAME); } - _range += 5.0f; - _events.ScheduleEvent(EVENT_SPAWN_METEOR_FLAME, 800); } } private: InstanceScript* _instance; EventMap _events; - float _range; uint8 _spawnCount; }; @@ -1108,6 +1113,67 @@ class npc_meteor_strike : public CreatureScript } }; +class npc_meteor_strike_flame : public CreatureScript +{ + public: + npc_meteor_strike_flame() : CreatureScript("npc_meteor_strike_flame") { } + + struct npc_meteor_strike_flameAI : public ScriptedAI + { + npc_meteor_strike_flameAI(Creature* creature) : ScriptedAI(creature), + _instance(creature->GetInstanceScript()) + { + SetCombatMovement(false); + } + + void SetGUID(ObjectGuid guid, int32 id /* = 0 */) override + { + _rootOwnerGuid = guid; + } + + void DoAction(int32 action) override + { + if (action != ACTION_SUMMON_FLAME || _rootOwnerGuid.IsEmpty()) + return; + + me->CastSpell(me, SPELL_METEOR_STRIKE_FIRE_AURA_2, true); + + Creature* meteorStrike = ObjectAccessor::GetCreature(*me, _rootOwnerGuid); + if (!meteorStrike || meteorStrike->AI()->GetData(DATA_SPAWNED_FLAMES) > 5) + return; + + me->SetOrientation(me->GetOrientation() + frand(static_cast<float>(-M_PI / 16), static_cast<float>(M_PI / 16))); + Position pos = me->GetNearPosition(5.0f, 0.0f); + + if (Creature* flame = me->SummonCreature(NPC_METEOR_STRIKE_FLAME, pos, TEMPSUMMON_TIMED_DESPAWN, 25000)) + { + flame->AI()->SetGUID(_rootOwnerGuid); + meteorStrike->AI()->SetData(DATA_SPAWNED_FLAMES, 1); + } + } + + void IsSummonedBy(Unit* /*summoner*/) override + { + // Let Halion Controller count as summoner. + if (Creature* controller = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_HALION_CONTROLLER))) + controller->AI()->JustSummoned(me); + } + + void UpdateAI(uint32 diff) override { } + void EnterEvadeMode() override { } + + private: + InstanceScript* _instance; + EventMap _events; + ObjectGuid _rootOwnerGuid = ObjectGuid::Empty; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetRubySanctumAI<npc_meteor_strike_flameAI>(creature); + } +}; + class npc_combustion_consumption : public CreatureScript { public: @@ -1120,26 +1186,23 @@ class npc_combustion_consumption : public CreatureScript { SetCombatMovement(false); - switch (me->GetEntry()) + switch (creature->GetEntry()) { case NPC_COMBUSTION: _explosionSpell = SPELL_FIERY_COMBUSTION_EXPLOSION; _damageSpell = SPELL_COMBUSTION_DAMAGE_AURA; - me->SetPhaseMask(0x01, true); + creature->SetPhaseMask(IsHeroic() ? 0x21 : 0x01, true); break; case NPC_CONSUMPTION: _explosionSpell = SPELL_SOUL_CONSUMPTION_EXPLOSION; _damageSpell = SPELL_CONSUMPTION_DAMAGE_AURA; - me->SetPhaseMask(0x20, true); + creature->SetPhaseMask(IsHeroic() ? 0x21 : 0x20, true); break; default: // Should never happen _explosionSpell = 0; _damageSpell = 0; break; } - - if (IsHeroic()) - me->SetPhaseMask(0x01 | 0x20, true); } void IsSummonedBy(Unit* summoner) override @@ -1161,7 +1224,7 @@ class npc_combustion_consumption : public CreatureScript me->CastCustomSpell(SPELL_SCALE_AURA, SPELLVALUE_AURA_STACK, stackAmount, me); DoCast(me, _damageSpell); - int32 damage = 1200 + (stackAmount * 1290); // Needs more researches. + int32 damage = 1200 + (stackAmount * 1290); // Needs more research. summoner->CastCustomSpell(_explosionSpell, SPELLVALUE_BASE_POINT0, damage, summoner); } @@ -1194,6 +1257,10 @@ class npc_living_inferno : public CreatureScript me->SetInCombatWithZone(); me->CastSpell(me, SPELL_BLAZING_AURA, true); + // SMSG_SPELL_GO for the living ember stuff isn't even sent to the client - Blizzard on drugs. + if (me->GetMap()->GetDifficulty() == RAID_DIFFICULTY_25MAN_HEROIC) + me->CastSpell(me, SPELL_SPAWN_LIVING_EMBERS, true); + if (InstanceScript* instance = me->GetInstanceScript()) if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_HALION_CONTROLLER))) controller->AI()->JustSummoned(me); @@ -1211,7 +1278,6 @@ class npc_living_inferno : public CreatureScript } }; -//! Need sniff data class npc_living_ember : public CreatureScript { public: @@ -1739,12 +1805,46 @@ class spell_halion_summon_exit_portals : public SpellScriptLoader } }; +class spell_halion_spawn_living_embers : public SpellScriptLoader +{ + public: + spell_halion_spawn_living_embers() : SpellScriptLoader("spell_halion_spawn_living_embers") { } + + class spell_halion_spawn_living_embers_SpellScript : public SpellScript + { + PrepareSpellScript(spell_halion_spawn_living_embers_SpellScript); + + void SelectMeteorFlames(std::list<WorldObject*>& unitList) + { + if (!unitList.empty()) + Trinity::Containers::RandomResizeList(unitList, 10); + } + + void HandleScript(SpellEffIndex /* effIndex */) + { + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_SUMMON_LIVING_EMBER, true); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_halion_spawn_living_embers_SpellScript::SelectMeteorFlames, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + OnEffectHitTarget += SpellEffectFn(spell_halion_spawn_living_embers_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_halion_spawn_living_embers_SpellScript(); + } +}; + void AddSC_boss_halion() { new boss_halion(); new boss_twilight_halion(); new npc_halion_controller(); + new npc_meteor_strike_flame(); new npc_meteor_strike_initial(); new npc_meteor_strike(); new npc_combustion_consumption(); @@ -1766,4 +1866,5 @@ void AddSC_boss_halion() new spell_halion_twilight_phasing(); new spell_halion_twilight_cutter(); new spell_halion_clear_debuffs(); + new spell_halion_spawn_living_embers(); } diff --git a/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp index c3f5c75e059..737a5d5c982 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp @@ -229,6 +229,21 @@ class instance_oculus : public InstanceMapScript return true; } + uint32 GetData(uint32 type) const override + { + if (type == DATA_CONSTRUCTS) + { + if (CentrifugueConstructCounter == 0) + return KILL_NO_CONSTRUCT; + else if (CentrifugueConstructCounter == 1) + return KILL_ONE_CONSTRUCT; + else if (CentrifugueConstructCounter > 1) + return KILL_MORE_CONSTRUCT; + } + + return KILL_NO_CONSTRUCT; + } + ObjectGuid GetGuidData(uint32 type) const override { switch (type) diff --git a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp index 450f97cb9b7..3ab9814b5b5 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp @@ -20,6 +20,7 @@ #include "ScriptedGossip.h" #include "SpellScript.h" #include "SpellAuraEffects.h" +#include "SpellInfo.h" #include "CombatAI.h" #include "Player.h" #include "Vehicle.h" @@ -76,6 +77,11 @@ enum Drakes SPELL_EMERALD_TOUCH_THE_NIGHTMARE = 50341, // (60 yds) - Instant - Consumes 30% of the caster's max health to inflict 25, 000 nature damage to an enemy dragon and reduce the damage it deals by 25% for 30 sec. // you do not have access to until you kill the Mage-Lord Urom SPELL_EMERALD_DREAM_FUNNEL = 50344, // (60 yds) - Channeled - Transfers 5% of the caster's max health to a friendly drake every second for 10 seconds as long as the caster channels. +/* + * All Drakes + * GPS System + */ + SPELL_GPS = 53389, // Misc POINT_LAND = 2, @@ -101,7 +107,13 @@ enum Says WHISPER_DRAKES_WELCOME = 1, WHISPER_DRAKES_ABILITIES = 2, WHISPER_DRAKES_SPECIAL = 3, - WHISPER_DRAKES_LOWHEALTH = 4 + WHISPER_DRAKES_LOWHEALTH = 4, + WHISPER_GPS_10_CONSTRUCTS = 5, + WHISPER_GPS_1_CONSTRUCT = 6, + WHISPER_GPS_VAROS = 7, + WHISPER_GPS_UROM = 8, + WHISPER_GPS_EREGOS = 9, + WHISPER_GPS_END = 10 }; class npc_verdisa_beglaristrasz_eternos : public CreatureScript @@ -250,6 +262,26 @@ class npc_ruby_emerald_amber_drake : public CreatureScript Initialize(); } + void SpellHit(Unit* /*caster*/, const SpellInfo* spell) override + { + if (Unit* creator = ObjectAccessor::GetUnit(*me, me->GetCreatorGUID())) + if (spell->Id == SPELL_GPS) + { + if (_instance->GetBossState(DATA_EREGOS) == DONE) + Talk(WHISPER_GPS_END, creator); + else if (_instance->GetBossState(DATA_UROM) == DONE) + Talk(WHISPER_GPS_EREGOS, creator); + else if (_instance->GetBossState(DATA_VAROS) == DONE) + Talk(WHISPER_GPS_UROM, creator); + else if (_instance->GetData(DATA_CONSTRUCTS) == KILL_NO_CONSTRUCT) + Talk(WHISPER_GPS_VAROS, creator); + else if (_instance->GetData(DATA_CONSTRUCTS) == KILL_ONE_CONSTRUCT) + Talk(WHISPER_GPS_1_CONSTRUCT, creator); + else if (_instance->GetData(DATA_CONSTRUCTS) == KILL_MORE_CONSTRUCT) + Talk(WHISPER_GPS_10_CONSTRUCTS, creator); + } + } + void IsSummonedBy(Unit* summoner) override { if (_instance->GetBossState(DATA_EREGOS) == IN_PROGRESS) diff --git a/src/server/scripts/Northrend/Nexus/Oculus/oculus.h b/src/server/scripts/Northrend/Nexus/Oculus/oculus.h index fd46f0a6bcc..08fc15c5752 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/oculus.h +++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.h @@ -29,7 +29,9 @@ enum DataTypes DATA_DRAKOS = 0, DATA_VAROS = 1, DATA_UROM = 2, - DATA_EREGOS = 3 + DATA_EREGOS = 3, + // GPS System + DATA_CONSTRUCTS = 4 }; enum CreatureIds @@ -91,6 +93,13 @@ enum InstanceEvents EVENT_EREGOS_INTRO }; +enum ConstructKillState +{ + KILL_NO_CONSTRUCT = 0, + KILL_ONE_CONSTRUCT = 1, + KILL_MORE_CONSTRUCT = 2 +}; + enum Misc { POINT_MOVE_OUT = 1 diff --git a/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp b/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp index 5c8d4b8691a..1f9fc6d7981 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp @@ -27,7 +27,8 @@ enum Spells SPELL_EARTH_SHIELD = 54479, SPELL_EARTH_SHOCK = 54511, SPELL_LIGHTNING_BOLT = 53044, - SPELL_STORMSTRIKE = 51876 + SPELL_STORMSTRIKE = 51876, + SPELL_WINDFURY = 54493 }; enum Yells @@ -40,11 +41,27 @@ enum Yells SAY_BOTH_ADDS_KILLED = 5 }; +enum ErekemEvents +{ + EVENT_EARTH_SHIELD = 1, + EVENT_CHAIN_HEAL, + EVENT_BLOODLUST, + EVENT_LIGHTNING_BOLT, + EVENT_EARTH_SHOCK, + EVENT_WINDFURY, + EVENT_STORMSTRIKE +}; + class boss_erekem : public CreatureScript { public: boss_erekem() : CreatureScript("boss_erekem") { } + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<boss_erekemAI>(creature); + } + struct boss_erekemAI : public ScriptedAI { boss_erekemAI(Creature* creature) : ScriptedAI(creature) @@ -55,39 +72,50 @@ public: void Initialize() { - uiBloodlustTimer = 15000; - uiChainHealTimer = 0; - uiEarthShockTimer = urand(2000, 8000); - uiLightningBoltTimer = urand(5000, 10000); - uiEarthShieldTimer = 20000; + phase = 0; + breakBondsCd = 0; } - uint32 uiBloodlustTimer; - uint32 uiChainHealTimer; - uint32 uiEarthShockTimer; - uint32 uiLightningBoltTimer; - uint32 uiEarthShieldTimer; - - InstanceScript* instance; - void Reset() override { Initialize(); + if (instance->GetData(DATA_WAVE_COUNT) == 6) instance->SetBossState(DATA_1ST_BOSS_EVENT, NOT_STARTED); else if (instance->GetData(DATA_WAVE_COUNT) == 12) instance->SetBossState(DATA_2ND_BOSS_EVENT, NOT_STARTED); - if (Creature* pGuard1 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_1))) + if (instance->GetData(DATA_MAIN_EVENT_PHASE) == IN_PROGRESS) { - if (!pGuard1->IsAlive()) - pGuard1->Respawn(); + if (Creature* pGuard1 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_1))) + pGuard1->DespawnOrUnsummon(); + if (Creature* pGuard2 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_2))) + pGuard2->DespawnOrUnsummon(); } - if (Creature* pGuard2 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_2))) + else { - if (!pGuard2->IsAlive()) - pGuard2->Respawn(); + if (Creature* pGuard1 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_1))) + { + if (!pGuard1->IsAlive()) + pGuard1->Respawn(); + } + if (Creature* pGuard2 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_2))) + { + if (!pGuard2->IsAlive()) + pGuard2->Respawn(); + } } + + events.Reset(); + } + + void JustReachedHome() override + { + if (Creature* pGuard1 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_1))) + pGuard1->Respawn(); + + if (Creature* pGuard2 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_2))) + pGuard2->Respawn(); } void AttackStart(Unit* who) override @@ -104,13 +132,13 @@ public: if (Creature* pGuard1 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_1))) { - pGuard1->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NON_ATTACKABLE); + pGuard1->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); if (!pGuard1->GetVictim() && pGuard1->AI()) pGuard1->AI()->AttackStart(who); } if (Creature* pGuard2 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_2))) { - pGuard2->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NON_ATTACKABLE); + pGuard2->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); if (!pGuard2->GetVictim() && pGuard2->AI()) pGuard2->AI()->AttackStart(who); } @@ -133,68 +161,13 @@ public: instance->SetBossState(DATA_1ST_BOSS_EVENT, IN_PROGRESS); else if (instance->GetData(DATA_WAVE_COUNT) == 12) instance->SetBossState(DATA_2ND_BOSS_EVENT, IN_PROGRESS); - } - - void MoveInLineOfSight(Unit* /*who*/) override { } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - //spam stormstrike in hc mode if spawns are dead - if (IsHeroic()) - { - if (Creature* pGuard1 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_1))) - { - if (Creature* pGuard2 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_2))) - { - if (!pGuard1->IsAlive() && !pGuard2->IsAlive()) - DoCastVictim(SPELL_STORMSTRIKE); - } - } - } - - if (uiEarthShieldTimer <= diff) - { - DoCast(me, SPELL_EARTH_SHIELD); - uiEarthShieldTimer = 20000; - } else uiEarthShieldTimer -= diff; - - if (uiChainHealTimer <= diff) - { - if (ObjectGuid TargetGUID = GetChainHealTargetGUID()) - { - if (Creature* target = ObjectAccessor::GetCreature(*me, TargetGUID)) - DoCast(target, SPELL_CHAIN_HEAL); - - //If one of the adds is dead spawn heals faster - Creature* pGuard1 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_1)); - Creature* pGuard2 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_2)); - uiChainHealTimer = ((pGuard1 && !pGuard1->IsAlive()) || (pGuard2 && !pGuard2->IsAlive()) ? 3000 : 8000) + rand32() % 3000; - } - } else uiChainHealTimer -= diff; - - if (uiBloodlustTimer <= diff) - { - DoCast(me, SPELL_BLOODLUST); - uiBloodlustTimer = urand(35000, 45000); - } else uiBloodlustTimer -= diff; - if (uiEarthShockTimer <= diff) - { - DoCastVictim(SPELL_EARTH_SHOCK); - uiEarthShockTimer = urand(8000, 13000); - } else uiEarthShockTimer -= diff; + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_NPC); - if (uiLightningBoltTimer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - DoCast(target, SPELL_LIGHTNING_BOLT); - uiLightningBoltTimer = urand(18000, 24000); - } else uiLightningBoltTimer -= diff; - - DoMeleeAttackIfReady(); + events.ScheduleEvent(EVENT_EARTH_SHIELD, 20000); + events.ScheduleEvent(EVENT_BLOODLUST, 15000); + events.ScheduleEvent(EVENT_CHAIN_HEAL, 10000); + events.ScheduleEvent(EVENT_LIGHTNING_BOLT, 2000); } void JustDied(Unit* /*killer*/) override @@ -219,27 +192,118 @@ public: Talk(SAY_SLAY); } - ObjectGuid GetChainHealTargetGUID() + void UpdateAI(uint32 diff) override { - if (HealthBelowPct(85)) - return me->GetGUID(); + if (!UpdateVictim()) + return; - Creature* pGuard1 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_1)); - if (pGuard1 && pGuard1->IsAlive() && !pGuard1->HealthAbovePct(75)) - return pGuard1->GetGUID(); + if (phase == 0) + if (Creature* pGuard1 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_1))) + { + if (Creature* pGuard2 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_2))) + { + if (!pGuard1->IsAlive() && !pGuard2->IsAlive()) + { + phase = 1; + DoCastVictim(SPELL_STORMSTRIKE); + DoCast(SPELL_WINDFURY); + events.Reset(); + events.ScheduleEvent(EVENT_EARTH_SHOCK, urand(2000, 8000)); + events.ScheduleEvent(EVENT_WINDFURY, urand(1500, 2000)); + events.ScheduleEvent(EVENT_STORMSTRIKE, urand(1500, 2000)); + } + } + } - Creature* pGuard2 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_2)); - if (pGuard2 && pGuard2->IsAlive() && !pGuard2->HealthAbovePct(75)) - return pGuard2->GetGUID(); + events.Update(diff); - return ObjectGuid::Empty; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + if (breakBondsCd <= 0) + { + if (Creature* pGuard1 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_1))) + { + if (Creature* pGuard2 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_2))) + { + if (pGuard1->IsAlive()) + { + if (pGuard1->HasAuraType(SPELL_AURA_MOD_STUN) || pGuard1->HasAuraType(SPELL_AURA_MOD_ROOT) + || pGuard1->HasAuraType(SPELL_AURA_MOD_CONFUSE) || pGuard1->HasAuraType(SPELL_AURA_MOD_PACIFY) + || pGuard1->HasAuraType(SPELL_AURA_MOD_DECREASE_SPEED)) + { + DoCast(SPELL_BREAK_BONDS); + breakBondsCd = 10000; + return; + } + } + if (pGuard2->IsAlive()) + { + if (pGuard2->HasAuraType(SPELL_AURA_MOD_STUN) || pGuard2->HasAuraType(SPELL_AURA_MOD_ROOT) + || pGuard2->HasAuraType(SPELL_AURA_MOD_CONFUSE) || pGuard2->HasAuraType(SPELL_AURA_MOD_PACIFY) + || pGuard2->HasAuraType(SPELL_AURA_MOD_DECREASE_SPEED)) + { + DoCast(SPELL_BREAK_BONDS); + breakBondsCd = 10000; + return; + } + } + } + } + } + else + breakBondsCd -= diff; + + switch (uint32 eventId = events.ExecuteEvent()) + { + case EVENT_EARTH_SHIELD: + if (Unit* ally = DoSelectLowestHpFriendly(30.0f)) + DoCast(ally, SPELL_EARTH_SHIELD); + events.ScheduleEvent(EVENT_EARTH_SHIELD, 20000); + break; + case EVENT_BLOODLUST: + DoCast(SPELL_BLOODLUST); + events.ScheduleEvent(EVENT_BLOODLUST, urand(35000, 45000)); + break; + case EVENT_LIGHTNING_BOLT: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + DoCast(target, SPELL_LIGHTNING_BOLT); + events.ScheduleEvent(EVENT_LIGHTNING_BOLT, 2500); + break; + case EVENT_CHAIN_HEAL: + if (Unit* ally = DoSelectLowestHpFriendly(40.0f)) + DoCast(ally, SPELL_CHAIN_HEAL); + { + Creature* pGuard1 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_1)); + Creature* pGuard2 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_2)); + events.ScheduleEvent(EVENT_CHAIN_HEAL, ((pGuard1 && !pGuard1->IsAlive()) || (pGuard2 && !pGuard2->IsAlive()) ? 3000 : 8000 + rand() % 3000)); + } + break; + case EVENT_EARTH_SHOCK: + DoCastVictim(SPELL_EARTH_SHOCK); + events.ScheduleEvent(EVENT_EARTH_SHOCK, urand(8000, 13000)); + break; + case EVENT_WINDFURY: + DoCast(SPELL_WINDFURY); + events.ScheduleEvent(EVENT_WINDFURY, urand(1500, 2000)); + break; + case EVENT_STORMSTRIKE: + DoCastVictim(SPELL_STORMSTRIKE); + events.ScheduleEvent(EVENT_STORMSTRIKE, urand(1500, 2000)); + break; + default: + break; + } + + DoMeleeAttackIfReady(); } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<boss_erekemAI>(creature); - } + private: + EventMap events; + InstanceScript* instance; + uint8 phase; + int32 breakBondsCd; + }; }; enum GuardSpells @@ -254,6 +318,11 @@ class npc_erekem_guard : public CreatureScript public: npc_erekem_guard() : CreatureScript("npc_erekem_guard") { } + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<npc_erekem_guardAI>(creature); + } + struct npc_erekem_guardAI : public ScriptedAI { npc_erekem_guardAI(Creature* creature) : ScriptedAI(creature) @@ -278,6 +347,9 @@ public: void Reset() override { Initialize(); + + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC); } void AttackStart(Unit* who) override @@ -322,11 +394,6 @@ public: } else uiGushingWoundTimer -= diff; } }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_erekem_guardAI>(creature); - } }; void AddSC_boss_erekem() diff --git a/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp b/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp index 9be73febd52..137f63a381d 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp @@ -27,12 +27,16 @@ enum Spells SPELL_WATER_BLAST = 54237, SPELL_WATER_BOLT_VOLLEY = 54241, SPELL_SPLASH = 59516, - SPELL_WATER_GLOBULE = 54268 + SPELL_BURST = 54379, + SPELL_WATER_GLOBULE = 54268, + SPELL_MERGE = 54269, + SPELL_WATER_GLOBULE_VISUAL = 54260 }; enum IchoronCreatures { - NPC_ICHOR_GLOBULE = 29321 + NPC_ICHOR_GLOBULE = 29321, + NPC_ICHORON_SUMMON_TARGET = 29326 }; enum Yells @@ -48,26 +52,48 @@ enum Yells enum Actions { - ACTION_WATER_ELEMENT_HIT = 1, - ACTION_WATER_ELEMENT_KILLED = 2 + ACTION_WATER_ELEMENT_HIT = 1 }; -/// @todo get those positions from spawn of creature 29326 -#define MAX_SPAWN_LOC 5 -static Position const SpawnLoc[MAX_SPAWN_LOC]= +enum IchoronEvents { - {1840.64f, 795.407f, 44.079f, 1.676f}, - {1886.24f, 757.733f, 47.750f, 5.201f}, - {1877.91f, 845.915f, 43.417f, 3.560f}, - {1918.97f, 850.645f, 47.225f, 4.136f}, - {1935.50f, 796.224f, 52.492f, 4.224f} + EVENT_WATER_BLAST = 1, + EVENT_WATER_BOLT_VOLLEY +}; + +enum GlobuleEvents +{ + EVENT_GLOBULE_MOVE = 1 }; enum Misc { + DATA_GLOBULE_PATH = 0, DATA_DEHYDRATION = 1 }; + +#define MAX_GLOBULE_PATHS 10 + +Position const globulePaths[MAX_GLOBULE_PATHS] = +{ + // first target + { 1861.357f, 804.039f, 44.008f, 6.268f }, + { 1869.375f, 803.976f, 38.781f, 0.009f }, + // second target + { 1888.063f, 763.488f, 47.667f, 1.744f }, + { 1882.865f, 776.385f, 38.824f, 1.882f }, + // third target + { 1935.140f, 817.752f, 52.181f, 1.885f }, + { 1916.642f, 826.337f, 39.139f, 2.851f }, + // fourth target + { 1930.257f, 833.053f, 46.906f, 4.579f }, + { 1916.642f, 826.337f, 39.139f, 2.851f }, + // fifth target + { 1878.248f, 841.883f, 43.334f, 4.717f }, + { 1879.438f, 834.443f, 38.699f, 4.831f } +}; + class boss_ichoron : public CreatureScript { public: @@ -78,33 +104,24 @@ public: boss_ichoronAI(Creature* creature) : ScriptedAI(creature), m_waterElements(creature) { Initialize(); - instance = creature->GetInstanceScript(); + instance = creature->GetInstanceScript(); } void Initialize() { bIsExploded = false; bIsFrenzy = false; + bIsDrained = false; dehydration = true; - uiBubbleCheckerTimer = 1000; - uiWaterBoltVolleyTimer = urand(10000, 15000); + drainedTimer = 50; + burstTimer = 15000; } - bool bIsExploded; - bool bIsFrenzy; - bool dehydration; - - uint32 uiBubbleCheckerTimer; - uint32 uiWaterBoltVolleyTimer; - - InstanceScript* instance; - - SummonList m_waterElements; - void Reset() override { Initialize(); + events.Reset(); me->SetVisible(true); DespawnWaterElements(); @@ -131,6 +148,9 @@ public: instance->SetBossState(DATA_1ST_BOSS_EVENT, IN_PROGRESS); else if (instance->GetData(DATA_WAVE_COUNT) == 12) instance->SetBossState(DATA_2ND_BOSS_EVENT, IN_PROGRESS); + + events.ScheduleEvent(EVENT_WATER_BOLT_VOLLEY, urand(10000, 15000)); + events.ScheduleEvent(EVENT_WATER_BLAST, urand(6000, 9000)); } void AttackStart(Unit* who) override @@ -155,18 +175,14 @@ public: switch (param) { case ACTION_WATER_ELEMENT_HIT: - me->ModifyHealth(int32(me->CountPctFromMaxHealth(1))); - + { if (bIsExploded) DoExplodeCompleted(); + me->SetHealth(me->GetHealth() + me->CountPctFromMaxHealth(3)); dehydration = false; - break; - case ACTION_WATER_ELEMENT_KILLED: - uint32 damage = me->CountPctFromMaxHealth(3); - me->ModifyHealth(-int32(damage)); - me->LowerPlayerDamageReq(damage); - break; + } + break; } } @@ -180,6 +196,7 @@ public: void DoExplodeCompleted() { bIsExploded = false; + bIsDrained = false; if (!HealthBelowPct(25)) { @@ -199,74 +216,24 @@ public: return 0; } - void MoveInLineOfSight(Unit* /*who*/) override { } - - void UpdateAI(uint32 uiDiff) override + void MoveInLineOfSight(Unit* who) override { - if (!UpdateVictim()) + if (!who->ToCreature()) return; - if (!bIsFrenzy && HealthBelowPct(25) && !bIsExploded) - { - Talk(SAY_ENRAGE); - DoCast(me, SPELL_FRENZY, true); - bIsFrenzy = true; - } - - if (!bIsFrenzy) - { - if (uiBubbleCheckerTimer <= uiDiff) - { - if (!bIsExploded) - { - if (!me->HasAura(SPELL_PROTECTIVE_BUBBLE)) - { - Talk(SAY_SHATTER); - DoCast(me, SPELL_WATER_BLAST); // wrong target - DoCast(me, SPELL_DRAINED); - bIsExploded = true; - me->AttackStop(); - me->SetVisible(false); - for (uint8 i = 0; i < 10; i++) - { - int tmp = urand(0, MAX_SPAWN_LOC-1); - me->SummonCreature(NPC_ICHOR_GLOBULE, SpawnLoc[tmp], TEMPSUMMON_CORPSE_DESPAWN); - } - } - } - else - { - bool bIsWaterElementsAlive = false; - if (!m_waterElements.empty()) - { - for (SummonList::const_iterator itr = m_waterElements.begin(); itr != m_waterElements.end(); ++itr) - if (Creature* temp = ObjectAccessor::GetCreature(*me, *itr)) - if (temp->IsAlive()) - { - bIsWaterElementsAlive = true; - break; - } - } + if (who->GetEntry() != NPC_ICHOR_GLOBULE) + return; - if (!bIsWaterElementsAlive) - DoExplodeCompleted(); - } - uiBubbleCheckerTimer = 1000; - } - else uiBubbleCheckerTimer -= uiDiff; - } + if (!me->IsWithinDist(who, 4.0f, false)) + return; - if (!bIsExploded) - { - if (uiWaterBoltVolleyTimer <= uiDiff) - { - DoCast(me, SPELL_WATER_BOLT_VOLLEY); - uiWaterBoltVolleyTimer = urand(10000, 15000); - } - else uiWaterBoltVolleyTimer -= uiDiff; + if (who->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)) + return; - DoMeleeAttackIfReady(); - } + who->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + who->CastSpell(who, SPELL_MERGE); + DoAction(ACTION_WATER_ELEMENT_HIT); + who->ToCreature()->DespawnOrUnsummon(1000); } void JustDied(Unit* /*killer*/) override @@ -295,22 +262,23 @@ public: void JustSummoned(Creature* summoned) override { - if (summoned) - { - summoned->SetSpeed(MOVE_RUN, 0.3f); - summoned->GetMotionMaster()->MoveFollow(me, 0, 0); - m_waterElements.Summon(summoned); - instance->SetGuidData(DATA_ADD_TRASH_MOB, summoned->GetGUID()); - } + summoned->SetSpeed(MOVE_RUN, 0.3f); + m_waterElements.Summon(summoned); + + instance->SetGuidData(DATA_ADD_TRASH_MOB, summoned->GetGUID()); } void SummonedCreatureDespawn(Creature* summoned) override { - if (summoned) + m_waterElements.Despawn(summoned); + + if (m_waterElements.empty() && bIsExploded) { - m_waterElements.Despawn(summoned); - instance->SetGuidData(DATA_DEL_TRASH_MOB, summoned->GetGUID()); + me->RemoveAllAuras(); + DoExplodeCompleted(); } + + instance->SetGuidData(DATA_DEL_TRASH_MOB, summoned->GetGUID()); } void KilledUnit(Unit* victim) override @@ -318,6 +286,145 @@ public: if (victim->GetTypeId() == TYPEID_PLAYER) Talk(SAY_SLAY); } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + if (!bIsFrenzy && HealthBelowPct(25) && !bIsExploded) + { + Talk(SAY_ENRAGE); + DoCast(me, SPELL_FRENZY, true); + bIsFrenzy = true; + } + + if (!bIsFrenzy) + { + if (!bIsExploded) + { + if (!me->HasAura(SPELL_PROTECTIVE_BUBBLE)) + { + bIsExploded = true; + Talk(SAY_SHATTER); + DoCast(SPELL_BURST); + me->RemoveAllAuras(); + burstTimer = 15000; + + std::list<Creature*> summonTargets; + GetCreatureListWithEntryInGrid(summonTargets, me, NPC_ICHORON_SUMMON_TARGET, 200.0f); + std::list<Creature*>::iterator itr = summonTargets.begin(); + + for (uint8 i = 0; i < MAX_GLOBULE_PATHS; i++) + { + std::advance(itr, urand(0, summonTargets.size() - 1)); // I take a random minion in the list + Position targetPos = (*itr)->GetRandomNearPosition(10.0f); + itr = summonTargets.begin(); + TempSummon* globule = me->SummonCreature(NPC_ICHOR_GLOBULE, targetPos, TEMPSUMMON_CORPSE_DESPAWN); + DoCast(globule, SPELL_WATER_GLOBULE_VISUAL); + + float minDistance = 1000.0f; + uint8 nextPath = 0; + // I move the globules to next position. the 10 positions are in couples, defined in globulePaths, so i have to increase by 2. + for (uint8 gpath = 0; gpath < MAX_GLOBULE_PATHS; gpath += 2) + { + if (globule->GetDistance(globulePaths[gpath]) < minDistance) + { + minDistance = globule->GetDistance(globulePaths[gpath]); + nextPath = gpath; + } + } + + globule->GetAI()->SetData(DATA_GLOBULE_PATH, nextPath); + } + return; + } + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + events.Update(diff); + + switch (uint32 eventId = events.ExecuteEvent()) + { + case EVENT_WATER_BLAST: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + DoCast(target, SPELL_WATER_BLAST); + events.ScheduleEvent(EVENT_WATER_BLAST, urand(6000, 9000)); + break; + case EVENT_WATER_BOLT_VOLLEY: + DoCast(SPELL_WATER_BOLT_VOLLEY); + events.ScheduleEvent(EVENT_WATER_BOLT_VOLLEY, urand(10000, 15000)); + break; + } + + DoMeleeAttackIfReady(); + } + else if (!bIsDrained) + { + if (drainedTimer <= 0) + { + bIsDrained = true; + drainedTimer = 50; + uint32 damage = me->CountPctFromMaxHealth(30); + if (me->GetHealth() < damage) + me->SetHealth(me->CountPctFromMaxHealth(1)); + else + { + me->SetHealth(me->GetHealth() - damage); + me->LowerPlayerDamageReq(damage); + } + DoCast(SPELL_DRAINED); + me->SetVisible(false); + me->AttackStop(); + } + else + drainedTimer -= diff; + } + else if (bIsDrained) + { + if (burstTimer <= 0) + { + DoExplodeCompleted(); + } + else + burstTimer -= diff; + } + } + else + { + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + events.Update(diff); + + switch (uint32 eventId = events.ExecuteEvent()) + { + case EVENT_WATER_BLAST: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + DoCast(target, SPELL_WATER_BLAST); + events.ScheduleEvent(EVENT_WATER_BLAST, urand(6000, 9000)); + break; + case EVENT_WATER_BOLT_VOLLEY: + DoCast(SPELL_WATER_BOLT_VOLLEY); + events.ScheduleEvent(EVENT_WATER_BOLT_VOLLEY, urand(10000, 15000)); + break; + } + + DoMeleeAttackIfReady(); + } + } + + private: + InstanceScript* instance; + SummonList m_waterElements; + EventMap events; + bool bIsExploded; + bool bIsFrenzy; + bool bIsDrained; + bool dehydration; + int32 drainedTimer; + int32 burstTimer; }; CreatureAI* GetAI(Creature* creature) const override @@ -341,48 +448,68 @@ public: void Initialize() { - uiRangeCheck_Timer = 1000; + pathId = 0; } - InstanceScript* instance; - - uint32 uiRangeCheck_Timer; - void Reset() override { Initialize(); - DoCast(me, SPELL_WATER_GLOBULE); + events.Reset(); + DoCast(SPELL_WATER_GLOBULE); + me->SetReactState(REACT_PASSIVE); } - void AttackStart(Unit* /*who*/) override + void SetData(uint32 id, uint32 data) override { + if (id == DATA_GLOBULE_PATH) + { + pathId = data; + me->GetMotionMaster()->MovePoint(0, globulePaths[pathId]); + } } - void UpdateAI(uint32 uiDiff) override + void MovementInform(uint32 type, uint32 id) override { - if (uiRangeCheck_Timer < uiDiff) + if (type != POINT_MOTION_TYPE) + return; + + switch (id) { - if (Creature* ichoron = instance->GetCreature(DATA_ICHORON)) - { - if (me->IsWithinDist(ichoron, 2.0f, false)) - { - if (ichoron->AI()) - ichoron->AI()->DoAction(ACTION_WATER_ELEMENT_HIT); - me->DespawnOrUnsummon(); - } - } - uiRangeCheck_Timer = 1000; + case 0: + me->GetMotionMaster()->Clear(); + events.ScheduleEvent(EVENT_GLOBULE_MOVE, 500); + break; + case 1: + me->GetMotionMaster()->Clear(); + if (Creature* ichoron = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ICHORON))) + me->GetMotionMaster()->MoveFollow(ichoron, 0.0f, 0.0f); + break; } - else uiRangeCheck_Timer -= uiDiff; } - void JustDied(Unit* /*killer*/) override + // on retail spell casted on a creature's death are not casted after death but keeping mob at 1 health, casting it and then letting the mob die. + // this feature should be still implemented + void DamageTaken(Unit* attacker, uint32 &damage) override { - DoCast(me, SPELL_SPLASH); - if (Creature* ichoron = instance->GetCreature(DATA_ICHORON)) - if (ichoron->AI()) - ichoron->AI()->DoAction(ACTION_WATER_ELEMENT_KILLED); + int32 actualHp = me->GetHealth(); + actualHp -= damage; + + if (actualHp <= 0) + DoCast(SPELL_SPLASH); } + + void UpdateAI(uint32 diff) override + { + events.Update(diff); + + if (events.ExecuteEvent() == EVENT_GLOBULE_MOVE) + me->GetMotionMaster()->MovePoint(1, globulePaths[pathId + 1]); + } + + private: + InstanceScript* instance; + EventMap events; + uint8 pathId; }; CreatureAI* GetAI(Creature* creature) const override diff --git a/src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp b/src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp index 5040dccfa36..8dc0e32fb31 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp @@ -27,41 +27,39 @@ enum Spells SPELL_LAVA_BURN = 54249 }; +enum LavanthorEvents +{ + EVENT_CAUTERIZING_FLAMES = 1, + EVENT_FIREBOLT, + EVENT_FLAME_BREATH, + EVENT_LAVA_BURN +}; + class boss_lavanthor : public CreatureScript { public: boss_lavanthor() : CreatureScript("boss_lavanthor") { } + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<boss_lavanthorAI>(creature); + } + struct boss_lavanthorAI : public ScriptedAI { boss_lavanthorAI(Creature* creature) : ScriptedAI(creature) { - Initialize(); instance = creature->GetInstanceScript(); } - void Initialize() - { - uiFireboltTimer = 1000; - uiFlameBreathTimer = 5000; - uiLavaBurnTimer = 10000; - uiCauterizingFlamesTimer = 3000; - } - - uint32 uiFireboltTimer; - uint32 uiFlameBreathTimer; - uint32 uiLavaBurnTimer; - uint32 uiCauterizingFlamesTimer; - - InstanceScript* instance; - void Reset() override { - Initialize(); if (instance->GetData(DATA_WAVE_COUNT) == 6) instance->SetBossState(DATA_1ST_BOSS_EVENT, NOT_STARTED); else if (instance->GetData(DATA_WAVE_COUNT) == 12) instance->SetBossState(DATA_2ND_BOSS_EVENT, NOT_STARTED); + + events.Reset(); } void EnterCombat(Unit* /*who*/) override @@ -72,11 +70,16 @@ public: EnterEvadeMode(); return; } - if (instance->GetData(DATA_WAVE_COUNT) == 6) instance->SetBossState(DATA_1ST_BOSS_EVENT, IN_PROGRESS); else if (instance->GetData(DATA_WAVE_COUNT) == 12) instance->SetBossState(DATA_2ND_BOSS_EVENT, IN_PROGRESS); + + events.ScheduleEvent(EVENT_FIREBOLT, 1000); + events.ScheduleEvent(EVENT_FLAME_BREATH, 5000); + events.ScheduleEvent(EVENT_LAVA_BURN, 10000); + if (IsHeroic()) + events.ScheduleEvent(EVENT_CAUTERIZING_FLAMES, 3000); } void AttackStart(Unit* who) override @@ -93,39 +96,38 @@ public: } } - void MoveInLineOfSight(Unit* /*who*/) override { } - void UpdateAI(uint32 diff) override { if (!UpdateVictim()) return; - if (uiFireboltTimer <= diff) - { - DoCastVictim(SPELL_FIREBOLT); - uiFireboltTimer = urand(5000, 13000); - } else uiFireboltTimer -= diff; - - if (uiFlameBreathTimer <= diff) - { - DoCastVictim(SPELL_FLAME_BREATH); - uiFlameBreathTimer = urand(10000, 15000); - } else uiFlameBreathTimer -= diff; + events.Update(diff); - if (uiLavaBurnTimer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true)) - DoCast(target, SPELL_LAVA_BURN); - uiLavaBurnTimer = urand(15000, 23000); - } else uiLavaBurnTimer -= diff; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - if (IsHeroic()) + switch (uint32 eventId = events.ExecuteEvent()) { - if (uiCauterizingFlamesTimer <= diff) - { - DoCastVictim(SPELL_CAUTERIZING_FLAMES); - uiCauterizingFlamesTimer = urand(10000, 16000); - } else uiCauterizingFlamesTimer -= diff; + case EVENT_FIREBOLT: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + DoCast(target, SPELL_FIREBOLT); + events.ScheduleEvent(EVENT_FIREBOLT, urand(5000, 13000)); + break; + case EVENT_FLAME_BREATH: + DoCast(SPELL_FLAME_BREATH); + events.ScheduleEvent(EVENT_FLAME_BREATH, urand(10000, 15000)); + break; + case EVENT_LAVA_BURN: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + DoCast(target, SPELL_LAVA_BURN); + events.ScheduleEvent(EVENT_LAVA_BURN, urand(15000, 23000)); + break; + case EVENT_CAUTERIZING_FLAMES: + DoCast(SPELL_CAUTERIZING_FLAMES); + events.ScheduleEvent(EVENT_CAUTERIZING_FLAMES, urand(10000, 16000)); + break; + default: + break; } DoMeleeAttackIfReady(); @@ -144,12 +146,11 @@ public: instance->SetData(DATA_WAVE_COUNT, 13); } } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<boss_lavanthorAI>(creature); - } + private: + EventMap events; + InstanceScript* instance; + }; }; void AddSC_boss_lavanthor() diff --git a/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp b/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp index 1c98806b127..f9e223d3bab 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp @@ -17,6 +17,8 @@ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "SpellScript.h" +#include "SpellAuraEffects.h" #include "violet_hold.h" enum Spells @@ -24,7 +26,18 @@ enum Spells SPELL_CORROSIVE_SALIVA = 54527, SPELL_OPTIC_LINK = 54396, SPELL_RAY_OF_PAIN = 54438, // NYI missing spelldifficulty - SPELL_RAY_OF_SUFFERING = 54442 // NYI missing spelldifficulty + SPELL_RAY_OF_SUFFERING = 54442, // NYI missing spelldifficulty + + // Visual + SPELL_OPTIC_LINK_LEVEL_1 = 54393, + SPELL_OPTIC_LINK_LEVEL_2 = 54394, + SPELL_OPTIC_LINK_LEVEL_3 = 54395 +}; + +enum MoraggEvents +{ + EVENT_CORROSIVE_SALIVA = 1, + EVENT_OPTIC_LINK }; class boss_moragg : public CreatureScript @@ -36,24 +49,12 @@ public: { boss_moraggAI(Creature* creature) : ScriptedAI(creature) { - Initialize(); instance = creature->GetInstanceScript(); } - void Initialize() - { - uiOpticLinkTimer = 10000; - uiCorrosiveSalivaTimer = 5000; - } - - uint32 uiOpticLinkTimer; - uint32 uiCorrosiveSalivaTimer; - - InstanceScript* instance; - void Reset() override { - Initialize(); + events.Reset(); if (instance->GetData(DATA_WAVE_COUNT) == 6) instance->SetBossState(DATA_1ST_BOSS_EVENT, NOT_STARTED); @@ -74,6 +75,13 @@ public: instance->SetBossState(DATA_1ST_BOSS_EVENT, IN_PROGRESS); else if (instance->GetData(DATA_WAVE_COUNT) == 12) instance->SetBossState(DATA_2ND_BOSS_EVENT, IN_PROGRESS); + + me->SetInCombatWithZone(); + + DoCast(SPELL_RAY_OF_PAIN); + DoCast(SPELL_RAY_OF_SUFFERING); + events.ScheduleEvent(EVENT_OPTIC_LINK, 15000); + events.ScheduleEvent(EVENT_CORROSIVE_SALIVA, 5000); } void AttackStart(Unit* who) override @@ -90,25 +98,30 @@ public: } } - void MoveInLineOfSight(Unit* /*who*/) override { } - void UpdateAI(uint32 diff) override { if (!UpdateVictim()) return; - if (uiOpticLinkTimer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - DoCast(target, SPELL_OPTIC_LINK); - uiOpticLinkTimer = 15000; - } else uiOpticLinkTimer -= diff; + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - if (uiCorrosiveSalivaTimer <= diff) + switch (uint32 eventId = events.ExecuteEvent()) { - DoCastVictim(SPELL_CORROSIVE_SALIVA); - uiCorrosiveSalivaTimer = 10000; - } else uiCorrosiveSalivaTimer -= diff; + case EVENT_OPTIC_LINK: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + DoCast(target, SPELL_OPTIC_LINK); + events.ScheduleEvent(EVENT_OPTIC_LINK, 25000); + break; + case EVENT_CORROSIVE_SALIVA: + DoCastVictim(SPELL_CORROSIVE_SALIVA); + events.ScheduleEvent(EVENT_CORROSIVE_SALIVA, 10000); + break; + default: + break; + } DoMeleeAttackIfReady(); } @@ -126,6 +139,10 @@ public: instance->SetData(DATA_WAVE_COUNT, 13); } } + + private: + EventMap events; + InstanceScript* instance; }; CreatureAI* GetAI(Creature* creature) const override @@ -134,7 +151,149 @@ public: } }; +class spell_moragg_ray_of_suffering : public SpellScriptLoader +{ +public: + spell_moragg_ray_of_suffering() : SpellScriptLoader("spell_moragg_ray_of_suffering") { } + + class spell_moragg_ray_of_suffering_AuraScript : public AuraScript + { + PrepareAuraScript(spell_moragg_ray_of_suffering_AuraScript); + + void OnPeriodic(AuraEffect const* aurEff) + { + PreventDefaultAction(); + std::list<HostileReference*> players = GetTarget()->getThreatManager().getThreatList(); + if (!players.empty()) + { + std::list<HostileReference*>::iterator itr = players.begin(); + std::advance(itr, urand(0, players.size() - 1)); + + uint32 triggerSpell = GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell; + GetTarget()->CastCustomSpell(triggerSpell, SPELLVALUE_MAX_TARGETS, 1, (*itr)->getTarget(), TRIGGERED_FULL_MASK, NULL, aurEff); + } + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_moragg_ray_of_suffering_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_moragg_ray_of_suffering_AuraScript(); + } +}; + +class spell_moragg_ray_of_pain : public SpellScriptLoader +{ +public: + spell_moragg_ray_of_pain() : SpellScriptLoader("spell_moragg_ray_of_pain") { } + + class spell_moragg_ray_of_pain_AuraScript : public AuraScript + { + PrepareAuraScript(spell_moragg_ray_of_pain_AuraScript); + + void OnPeriodic(AuraEffect const* aurEff) + { + PreventDefaultAction(); + std::list<HostileReference*> players = GetTarget()->getThreatManager().getThreatList(); + if (!players.empty()) + { + std::list<HostileReference*>::iterator itr = players.begin(); + std::advance(itr, urand(0, players.size() - 1)); + + uint32 triggerSpell = GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell; + GetTarget()->CastCustomSpell(triggerSpell, SPELLVALUE_MAX_TARGETS, 1, (*itr)->getTarget(), TRIGGERED_FULL_MASK, NULL, aurEff); + } + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_moragg_ray_of_pain_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_moragg_ray_of_pain_AuraScript(); + } +}; + +class spell_moragg_optic_link : public SpellScriptLoader +{ +public: + spell_moragg_optic_link() : SpellScriptLoader("spell_moragg_optic_link") { } + + class spell_moragg_optic_link_AuraScript : public AuraScript + { + PrepareAuraScript(spell_moragg_optic_link_AuraScript); + + void OnPeriodic(AuraEffect const* aurEff) + { + switch (aurEff->GetTickNumber()) // Different visual based on tick + { + case 1: + case 2: + case 3: + GetTarget()->CastCustomSpell(SPELL_OPTIC_LINK_LEVEL_1, SPELLVALUE_MAX_TARGETS, 1, (Unit*)NULL, TRIGGERED_FULL_MASK, NULL, aurEff); + break; + case 4: + case 5: + case 6: + case 7: + GetTarget()->CastCustomSpell(SPELL_OPTIC_LINK_LEVEL_1, SPELLVALUE_MAX_TARGETS, 1, (Unit*)NULL, TRIGGERED_FULL_MASK, NULL, aurEff); + GetTarget()->CastCustomSpell(SPELL_OPTIC_LINK_LEVEL_2, SPELLVALUE_MAX_TARGETS, 1, (Unit*)NULL, TRIGGERED_FULL_MASK, NULL, aurEff); + break; + case 8: + case 9: + case 10: + case 11: + GetTarget()->CastCustomSpell(SPELL_OPTIC_LINK_LEVEL_1, SPELLVALUE_MAX_TARGETS, 1, (Unit*)NULL, TRIGGERED_FULL_MASK, NULL, aurEff); + GetTarget()->CastCustomSpell(SPELL_OPTIC_LINK_LEVEL_2, SPELLVALUE_MAX_TARGETS, 1, (Unit*)NULL, TRIGGERED_FULL_MASK, NULL, aurEff); + GetTarget()->CastCustomSpell(SPELL_OPTIC_LINK_LEVEL_3, SPELLVALUE_MAX_TARGETS, 1, (Unit*)NULL, TRIGGERED_FULL_MASK, NULL, aurEff); + break; + default: + break; + } + } + + void OnUpdate(AuraEffect* aurEff) + { + switch (aurEff->GetTickNumber()) + { + case 1: + aurEff->SetAmount(aurEff->GetAmount() + 250); // base amount is 500 + break; + case 4: + aurEff->SetAmount(aurEff->GetAmount() * 2); // goes to 1500 + break; + case 8: + aurEff->SetAmount(aurEff->GetAmount() * 2); // goes to 3000 + break; + default: + break; + } + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_moragg_optic_link_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_moragg_optic_link_AuraScript::OnUpdate, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_moragg_optic_link_AuraScript(); + } +}; + void AddSC_boss_moragg() { new boss_moragg(); + new spell_moragg_ray_of_suffering(); + new spell_moragg_ray_of_pain(); + new spell_moragg_optic_link(); } diff --git a/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp b/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp index d1efcb8ca7a..4fb7646558d 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp @@ -17,29 +17,33 @@ #include "ScriptMgr.h" #include "ScriptedCreature.h" -#include "violet_hold.h" +#include "SpellInfo.h" +#include "SpellScript.h" #include "Player.h" +#include "violet_hold.h" enum Spells { SPELL_ARCANE_BARRAGE_VOLLEY = 54202, SPELL_ARCANE_BUFFET = 54226, SPELL_SUMMON_ETHEREAL_SPHERE_1 = 54102, - SPELL_SUMMON_ETHEREAL_SPHERE_2 = 54137, + SPELL_SUMMON_ETHEREAL_SPHERE_2 = 61337, SPELL_SUMMON_ETHEREAL_SPHERE_3 = 54138 }; enum NPCs { NPC_ETHEREAL_SPHERE = 29271, - //NPC_ETHEREAL_SPHERE2 = 32582, // heroic only? + NPC_ETHEREAL_SPHERE2 = 32582 }; enum CreatureSpells { SPELL_ARCANE_POWER = 54160, + H_SPELL_ARCANE_POWER = 59474, SPELL_SUMMON_PLAYERS = 54164, - SPELL_POWER_BALL_VISUAL = 54141 + SPELL_POWER_BALL_VISUAL = 54141, + SPELL_POWER_BALL_DAMAGE_TRIGGER = 54207 }; enum Yells @@ -53,6 +57,22 @@ enum Yells SAY_SUMMON_ENERGY = 6 }; +enum XevozzEvents +{ + EVENT_ARCANE_BARRAGE = 1, + EVENT_ARCANE_BUFFET, + EVENT_SUMMON_SPHERE, + EVENT_SUMMON_SPHERE_2, + EVENT_RANGE_CHECK, + EVENT_SUMMON_PLAYERS, + EVENT_DESPAWN_SPHERE +}; + +enum SphereActions +{ + ACTION_SUMMON = 1, +}; + class boss_xevozz : public CreatureScript { public: @@ -62,23 +82,9 @@ public: { boss_xevozzAI(Creature* creature) : ScriptedAI(creature) { - Initialize(); - instance = creature->GetInstanceScript(); + instance = creature->GetInstanceScript(); } - void Initialize() - { - uiSummonEtherealSphere_Timer = urand(10000, 12000); - uiArcaneBarrageVolley_Timer = urand(20000, 22000); - uiArcaneBuffet_Timer = uiSummonEtherealSphere_Timer + urand(5000, 6000); - } - - InstanceScript* instance; - - uint32 uiSummonEtherealSphere_Timer; - uint32 uiArcaneBarrageVolley_Timer; - uint32 uiArcaneBuffet_Timer; - void Reset() override { if (instance->GetData(DATA_WAVE_COUNT) == 6) @@ -86,14 +92,15 @@ public: else if (instance->GetData(DATA_WAVE_COUNT) == 12) instance->SetBossState(DATA_2ND_BOSS_EVENT, NOT_STARTED); - Initialize(); DespawnSphere(); + events.Reset(); } void DespawnSphere() { std::list<Creature*> assistList; GetCreatureListWithEntryInGrid(assistList, me, NPC_ETHEREAL_SPHERE, 150.0f); + GetCreatureListWithEntryInGrid(assistList, me, NPC_ETHEREAL_SPHERE2, 150.0f); if (assistList.empty()) return; @@ -108,11 +115,7 @@ public: void JustSummoned(Creature* summoned) override { summoned->SetSpeed(MOVE_RUN, 0.5f); - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - { - summoned->AddThreat(target, 0.00f); - summoned->AI()->AttackStart(target); - } + summoned->GetMotionMaster()->MoveFollow(me, 0.0f, 0.0f); } void AttackStart(Unit* who) override @@ -144,45 +147,10 @@ public: instance->SetBossState(DATA_1ST_BOSS_EVENT, IN_PROGRESS); else if (instance->GetData(DATA_WAVE_COUNT) == 12) instance->SetBossState(DATA_2ND_BOSS_EVENT, IN_PROGRESS); - } - - void MoveInLineOfSight(Unit* /*who*/) override { } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - if (uiArcaneBarrageVolley_Timer < diff) - { - DoCast(me, SPELL_ARCANE_BARRAGE_VOLLEY); - uiArcaneBarrageVolley_Timer = urand(20000, 22000); - } - else uiArcaneBarrageVolley_Timer -= diff; - if (uiArcaneBuffet_Timer) - { - if (uiArcaneBuffet_Timer < diff) - { - DoCastVictim(SPELL_ARCANE_BUFFET); - uiArcaneBuffet_Timer = 0; - } - else uiArcaneBuffet_Timer -= diff; - } - - if (uiSummonEtherealSphere_Timer < diff) - { - Talk(SAY_SPAWN); - DoCast(me, SPELL_SUMMON_ETHEREAL_SPHERE_1); - if (IsHeroic()) // extra one for heroic - me->SummonCreature(NPC_ETHEREAL_SPHERE, me->GetPositionX() - 5 + rand32() % 10, me->GetPositionY() - 5 + rand32() % 10, me->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 40000); - - uiSummonEtherealSphere_Timer = urand(45000, 47000); - uiArcaneBuffet_Timer = urand(5000, 6000); - } - else uiSummonEtherealSphere_Timer -= diff; - - DoMeleeAttackIfReady(); + events.ScheduleEvent(EVENT_SUMMON_SPHERE, 5000); + events.ScheduleEvent(EVENT_ARCANE_BARRAGE, urand(8000, 10000)); + events.ScheduleEvent(EVENT_ARCANE_BUFFET, urand(10000, 11000)); } void JustDied(Unit* /*killer*/) override @@ -208,6 +176,65 @@ public: if (victim->GetTypeId() == TYPEID_PLAYER) Talk(SAY_SLAY); } + + void SpellHit(Unit* who, const SpellInfo* spell) override + { + if (!who->ToCreature()) + return; + + if ((spell->Id == SPELL_ARCANE_POWER) || (spell->Id == H_SPELL_ARCANE_POWER)) + Talk(SAY_SUMMON_ENERGY); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (uint32 eventId = events.ExecuteEvent()) + { + case EVENT_ARCANE_BARRAGE: + DoCast(SPELL_ARCANE_BARRAGE_VOLLEY); + events.ScheduleEvent(EVENT_ARCANE_BARRAGE, urand(8000, 10000)); + break; + case EVENT_ARCANE_BUFFET: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + DoCast(target, SPELL_ARCANE_BUFFET); + events.ScheduleEvent(EVENT_ARCANE_BUFFET, urand(15000, 20000)); + break; + case EVENT_SUMMON_SPHERE: + Talk(SAY_REPEAT_SUMMON); + DoCast(SPELL_SUMMON_ETHEREAL_SPHERE_1); + if (IsHeroic()) + events.ScheduleEvent(EVENT_SUMMON_SPHERE_2, 2500); + events.ScheduleEvent(EVENT_SUMMON_PLAYERS, urand(33000, 35000)); + events.ScheduleEvent(EVENT_SUMMON_SPHERE, urand(45000, 47000)); + break; + case EVENT_SUMMON_SPHERE_2: + Talk(SAY_REPEAT_SUMMON); + DoCast(SPELL_SUMMON_ETHEREAL_SPHERE_2); + break; + case EVENT_SUMMON_PLAYERS: + if (Creature* sphere = me->FindNearestCreature(NPC_ETHEREAL_SPHERE, 150.0f)) + sphere->GetAI()->DoAction(ACTION_SUMMON); + else if (Creature* sphere = me->FindNearestCreature(NPC_ETHEREAL_SPHERE2, 150.0f)) + sphere->GetAI()->DoAction(ACTION_SUMMON); + break; + default: + break; + } + + DoMeleeAttackIfReady(); + } + + private: + InstanceScript* instance; + EventMap events; }; CreatureAI* GetAI(Creature* creature) const override @@ -226,71 +253,137 @@ public: npc_ethereal_sphereAI(Creature* creature) : ScriptedAI(creature) { Initialize(); - instance = creature->GetInstanceScript(); + instance = creature->GetInstanceScript(); } void Initialize() { - uiSummonPlayers_Timer = urand(33000, 35000); - uiRangeCheck_Timer = 1000; + arcanePower = false; } - InstanceScript* instance; - - uint32 uiSummonPlayers_Timer; - uint32 uiRangeCheck_Timer; - void Reset() override { Initialize(); + events.Reset(); + DoCast(SPELL_POWER_BALL_VISUAL); + DoCast(SPELL_POWER_BALL_DAMAGE_TRIGGER); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); + me->setFaction(16); + events.ScheduleEvent(EVENT_DESPAWN_SPHERE, 40000); + events.ScheduleEvent(EVENT_RANGE_CHECK, 1000); + } + + void DoAction(int32 action) override + { + if (action == ACTION_SUMMON) + DoCast(SPELL_SUMMON_PLAYERS); } void UpdateAI(uint32 diff) override { - if (!UpdateVictim()) - return; + events.Update(diff); - if (!me->HasAura(SPELL_POWER_BALL_VISUAL)) - DoCast(me, SPELL_POWER_BALL_VISUAL); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - if (uiRangeCheck_Timer < diff) + switch (uint32 eventId = events.ExecuteEvent()) { - if (Creature* pXevozz = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_XEVOZZ))) - { - float fDistance = me->GetDistance2d(pXevozz); - if (fDistance <= 3) - DoCast(pXevozz, SPELL_ARCANE_POWER); - else - DoCast(me, 35845); //Is it blizzlike? - } - uiRangeCheck_Timer = 1000; + case EVENT_RANGE_CHECK: + if (Creature* xevozz = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_XEVOZZ))) + { + if (me->IsWithinDist(xevozz, 3.0f) && !arcanePower) + { + DoCast(SPELL_ARCANE_POWER); + arcanePower = true; + events.ScheduleEvent(EVENT_DESPAWN_SPHERE, 8000); + } + } + events.ScheduleEvent(EVENT_RANGE_CHECK, 1000); + break; + case EVENT_DESPAWN_SPHERE: + me->DespawnOrUnsummon(); + break; } - else uiRangeCheck_Timer -= diff; + } + + private: + InstanceScript* instance; + EventMap events; + bool arcanePower; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<npc_ethereal_sphereAI>(creature); + } +}; + +class spell_xevozz_summon_players : public SpellScriptLoader +{ +public: + spell_xevozz_summon_players() : SpellScriptLoader("spell_xevozz_summon_players") { } + + class spell_xevozz_summon_players_SpellScript : public SpellScript + { + PrepareSpellScript(spell_xevozz_summon_players_SpellScript); + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Unit* target = GetHitUnit(); - if (uiSummonPlayers_Timer < diff) + if (target) { - DoCast(me, SPELL_SUMMON_PLAYERS); // not working right + Position pos = GetOriginalCaster()->GetPosition(); - Map* map = me->GetMap(); - if (map && map->IsDungeon()) - { - Map::PlayerList const &PlayerList = map->GetPlayers(); + target->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation()); + } + } - if (!PlayerList.isEmpty()) - for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) - if (i->GetSource()->IsAlive()) - DoTeleportPlayer(i->GetSource(), me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), i->GetSource()->GetOrientation()); - } + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_xevozz_summon_players_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_xevozz_summon_players_SpellScript(); + } +}; - uiSummonPlayers_Timer = urand(33000, 35000); +class spell_xevozz_summon_ethereal_sphere : public SpellScriptLoader +{ +public: + spell_xevozz_summon_ethereal_sphere() : SpellScriptLoader("spell_xevozz_summon_ethereal_sphere") { } + + class spell_xevozz_summon_ethereal_sphere_SpellScript : public SpellScript + { + PrepareSpellScript(spell_xevozz_summon_ethereal_sphere_SpellScript); + + void HandleScript(SpellDestination& target) + { + Unit* caster = GetOriginalCaster(); + Position pos; + float distance = 0.0f; + + while (distance < 20.0f) + { + pos = caster->GetRandomNearPosition(60.0f); + distance = caster->GetDistance(pos); } - else uiSummonPlayers_Timer -= diff; + + target.Relocate(pos); + } + + void Register() override + { + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_xevozz_summon_ethereal_sphere_SpellScript::HandleScript, EFFECT_0, TARGET_DEST_DB); } }; - CreatureAI* GetAI(Creature* creature) const override + SpellScript* GetSpellScript() const override { - return GetInstanceAI<npc_ethereal_sphereAI>(creature); + return new spell_xevozz_summon_ethereal_sphere_SpellScript(); } }; @@ -298,4 +391,6 @@ void AddSC_boss_xevozz() { new boss_xevozz(); new npc_ethereal_sphere(); + new spell_xevozz_summon_players(); + new spell_xevozz_summon_ethereal_sphere(); } diff --git a/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp b/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp index c29861f08a4..02e479a22f4 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp @@ -23,12 +23,8 @@ enum Spells { SPELL_SHROUD_OF_DARKNESS = 54524, SPELL_SUMMON_VOID_SENTRY = 54369, - SPELL_VOID_SHIFT = 54361 -}; - -enum Creatures -{ - NPC_VOID_SENTRY = 29364 + SPELL_VOID_SHIFT = 54361, + SPELL_VOID_SHIFTED = 54343, }; enum Yells @@ -46,6 +42,13 @@ enum Misc DATA_VOID_DANCE = 2153 }; +enum ZuramatEvents +{ + EVENT_VOID_SHIFT = 1, + EVENT_SUMMON_VOID, + EVENT_SHROUD_OF_DARKNESS +}; + class boss_zuramat : public CreatureScript { public: @@ -53,7 +56,7 @@ public: struct boss_zuramatAI : public ScriptedAI { - boss_zuramatAI(Creature* creature) : ScriptedAI(creature) + boss_zuramatAI(Creature* creature) : ScriptedAI(creature), sentries(me) { Initialize(); instance = creature->GetInstanceScript(); @@ -61,18 +64,18 @@ public: void Initialize() { - SpellShroudOfDarknessTimer = 22000; - SpellVoidShiftTimer = 15000; - SpellSummonVoidTimer = 12000; voidDance = true; } - InstanceScript* instance; - - uint32 SpellVoidShiftTimer; - uint32 SpellSummonVoidTimer; - uint32 SpellShroudOfDarknessTimer; - bool voidDance; + void DespawnSentries() + { + sentries.DespawnAll(); + std::list<Creature*> sentrylist; + GetCreatureListWithEntryInGrid(sentrylist, me, NPC_VOID_SENTRY_BALL, 200.0f); + if (!sentrylist.empty()) + for (std::list<Creature*>::const_iterator itr = sentrylist.begin(); itr != sentrylist.end(); ++itr) + (*itr)->DespawnOrUnsummon(); + } void Reset() override { @@ -82,6 +85,8 @@ public: instance->SetData(DATA_2ND_BOSS_EVENT, NOT_STARTED); Initialize(); + events.Reset(); + DespawnSentries(); } void AttackStart(Unit* who) override @@ -112,36 +117,17 @@ public: if (instance->GetData(DATA_WAVE_COUNT) == 6) instance->SetBossState(DATA_1ST_BOSS_EVENT, IN_PROGRESS); else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetBossState(DATA_2ND_BOSS_EVENT, IN_PROGRESS); - } + instance->SetData(DATA_2ND_BOSS_EVENT, IN_PROGRESS); - void MoveInLineOfSight(Unit* /*who*/) override { } + me->SetInCombatWithZone(); + events.ScheduleEvent(EVENT_SHROUD_OF_DARKNESS, urand(18000, 20000)); + events.ScheduleEvent(EVENT_VOID_SHIFT, 9000); + events.ScheduleEvent(EVENT_SUMMON_VOID, 4000); + } - void UpdateAI(uint32 diff) override + void JustSummoned(Creature* summon) override { - if (!UpdateVictim()) - return; - - if (SpellSummonVoidTimer <= diff) - { - DoCastVictim(SPELL_SUMMON_VOID_SENTRY, false); - SpellSummonVoidTimer = 20000; - } else SpellSummonVoidTimer -=diff; - - if (SpellVoidShiftTimer <= diff) - { - if (Unit* unit = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(unit, SPELL_VOID_SHIFT); - SpellVoidShiftTimer = 20000; - } else SpellVoidShiftTimer -=diff; - - if (SpellShroudOfDarknessTimer <= diff) - { - DoCastVictim(SPELL_SHROUD_OF_DARKNESS); - SpellShroudOfDarknessTimer = 20000; - } else SpellShroudOfDarknessTimer -=diff; - - DoMeleeAttackIfReady(); + sentries.Summon(summon); } void SummonedCreatureDies(Creature* summoned, Unit* /*who*/) override @@ -160,8 +146,12 @@ public: void JustDied(Unit* /*killer*/) override { + instance->SetData(DATA_ZURAMAT, 1); + Talk(SAY_DEATH); + DespawnSentries(); + if (instance->GetData(DATA_WAVE_COUNT) == 6) { instance->SetBossState(DATA_1ST_BOSS_EVENT, DONE); @@ -179,6 +169,44 @@ public: if (victim->GetTypeId() == TYPEID_PLAYER) Talk(SAY_SLAY); } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (uint32 eventId = events.ExecuteEvent()) + { + case EVENT_SUMMON_VOID: + DoCast(SPELL_SUMMON_VOID_SENTRY); + events.ScheduleEvent(EVENT_SUMMON_VOID, urand(7000, 10000)); + break; + case EVENT_VOID_SHIFT: + if (Unit* unit = SelectTarget(SELECT_TARGET_RANDOM, 0)) + DoCast(unit, SPELL_VOID_SHIFT); + events.ScheduleEvent(EVENT_VOID_SHIFT, 15000); + break; + case EVENT_SHROUD_OF_DARKNESS: + DoCast(SPELL_SHROUD_OF_DARKNESS); + events.ScheduleEvent(EVENT_SHROUD_OF_DARKNESS, urand(18000, 20000)); + break; + default: + break; + } + + DoMeleeAttackIfReady(); + } + + private: + InstanceScript* instance; + EventMap events; + SummonList sentries; + bool voidDance; }; CreatureAI* GetAI(Creature* creature) const override diff --git a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp index 28c56a02255..652b4815be0 100644 --- a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp +++ b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp @@ -145,6 +145,7 @@ public: bCrystalActivated = false; defenseless = true; uiMainEventPhase = NOT_STARTED; + zuramatDead = false; } ObjectGuid uiErekemGuard[2]; @@ -178,6 +179,7 @@ public: bool bIsDoorSpellCast; bool bCrystalActivated; bool defenseless; + bool zuramatDead; std::list<uint8> NpcAtDoorCastingList; @@ -199,16 +201,20 @@ public: break; default: break; + case NPC_VOID_SENTRY: + if (zuramatDead) + { + creature->DespawnOrUnsummon(); + zuramatDead = false; + } + break; } - /* - BEWARE - SHIT. if (creature->GetGUID() == uiFirstBoss || creature->GetGUID() == uiSecondBoss) { creature->AllLootRemovedFromCorpse(); creature->RemoveLootMode(1); } - */ } void OnGameObjectCreate(GameObject* go) override @@ -314,6 +320,9 @@ public: uiRemoveNpc = 0; // might not have been reset after a wipe on a boss. } break; + case DATA_ZURAMAT: + zuramatDead = true; + break; } } @@ -393,19 +402,23 @@ public: if (Creature* pGuard1 = instance->GetCreature(uiErekemGuard[0])) { if (bForceRespawn) + { pGuard1->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NON_ATTACKABLE); + pGuard1->GetMotionMaster()->MovePoint(0, BossStartMove21); + } else - pGuard1->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NON_ATTACKABLE); - pGuard1->GetMotionMaster()->MovePoint(0, BossStartMove21); + pGuard1->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); } if (Creature* pGuard2 = instance->GetCreature(uiErekemGuard[1])) { if (bForceRespawn) - pGuard2->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NON_ATTACKABLE); + { + pGuard2->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); + pGuard2->GetMotionMaster()->MovePoint(0, BossStartMove22); + } else - pGuard2->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NON_ATTACKABLE); - pGuard2->GetMotionMaster()->MovePoint(0, BossStartMove22); + pGuard2->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); } break; case BOSS_ICHORON: @@ -448,6 +461,9 @@ public: boss->Respawn(); boss->RemoveLootMode(1); } + else + boss->GetMotionMaster()->MoveTargetedHome(); + boss->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); uiWaveCount = 0; } @@ -527,6 +543,7 @@ public: return false; } + zuramatDead = false; return true; } @@ -557,6 +574,7 @@ public: SetData(DATA_MAIN_DOOR, GO_STATE_ACTIVE); SetData(DATA_WAVE_COUNT, 0); uiMainEventPhase = NOT_STARTED; + uiActivationTimer = 5000; for (int i = 0; i < 4; ++i) if (GameObject* crystal = instance->GetGameObject(uiActivationCrystal[i])) diff --git a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp index 8bcc80b5a84..b05da4b994c 100644 --- a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp +++ b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp @@ -28,6 +28,7 @@ #define GOSSIP_START_EVENT "Get your people to safety, we'll keep the Blue Dragonflight's forces at bay." #define GOSSIP_ITEM_1 "Activate the crystals when we get in trouble, right" #define GOSSIP_I_WANT_IN "I'm not fighting, so send me in now!" +#define SAY_EVENT_LOCK "I'm locking the door. Good luck, and thank you for doing this." #define SPAWN_TIME 20000 enum PortalCreatures @@ -59,7 +60,7 @@ enum AzureSellbreakerSpells SPELL_ARCANE_BLAST = 58462, SPELL_SLOW = 25603, SPELL_CHAINS_OF_ICE = 58464, - SPELL_CONE_OF_COLD = 58463 + SPELL_CONE_OF_COLD = 58463, }; enum AzureBinderSpells @@ -67,7 +68,7 @@ enum AzureBinderSpells SPELL_ARCANE_BARRAGE = 58456, SPELL_ARCANE_EXPLOSION = 58455, SPELL_FROST_NOVA = 58458, - SPELL_FROSTBOLT = 58457 + SPELL_FROSTBOLT = 58457, }; enum AzureMageSlayerSpells @@ -85,7 +86,7 @@ enum AzureCaptainSpells enum AzureSorcerorSpells { SPELL_ARCANE_STREAM = 60181, - SPELL_MANA_DETONATION = 60182 + SPELL_MANA_DETONATION = 60182, }; enum AzureRaiderSpells @@ -114,7 +115,7 @@ enum TrashDoorSpell enum Spells { SPELL_PORTAL_CHANNEL = 58012, - SPELL_CRYSTAL_ACTIVATION = 57804, + SPELL_CRYSTAL_ACTIVATION = 57804, // visual effect SPELL_ARCANE_SPHERE_PASSIVE = 44263 }; @@ -242,9 +243,21 @@ const float SaboteurFinalPos6[5][3] = {1931.063354f, 848.468445f, 47.190434f} }; -const Position MovePosition = {1806.955566f, 803.851807f, 44.363323f, 0.0f}; -const Position playerTeleportPosition = {1830.531006f, 803.939758f, 44.340508f, 6.281611f}; -const Position sinclariOutsidePosition = {1817.315674f, 804.060608f, 44.363998f, 0.0f}; +const Position PortalLocation[] = +{ + { 1877.51f, 850.104f, 44.6599f, 4.7822f }, // WP 1 + { 1936.07f, 803.198f, 53.3749f, 3.12414f }, // WP 3 + { 1890.64f, 753.471f, 48.7224f, 1.71042f }, // WP 5 +}; + +#define MAX_PRE_EVENT_PORTAL 3 + +ObjectGuid preEventPortalGUID[MAX_PRE_EVENT_PORTAL] = { ObjectGuid::Empty }; + +const Position MovePosition = { 1806.955566f, 803.851807f, 44.363323f, 0.0f }; +const Position playerTeleportPosition = { 1830.531006f, 803.939758f, 44.340508f, 6.281611f }; +const Position sinclariOutsidePosition = { 1820.429810f, 804.066040f, 44.363998f, 0.0f }; +const Position sinclariCrystalPosition = { 1828.868286f, 798.468811f, 44.363998f, 3.890467f }; class npc_sinclari_vh : public CreatureScript { @@ -320,6 +333,9 @@ public: Initialize(); me->SetReactState(REACT_AGGRESSIVE); + for (uint8 i = 0; i < MAX_PRE_EVENT_PORTAL; i++) + if (TempSummon* summon = me->SummonCreature(NPC_TELEPORTATION_PORTAL, PortalLocation[i], TEMPSUMMON_MANUAL_DESPAWN)) + preEventPortalGUID[i] = summon->GetGUID(); std::list<Creature*> GuardList; me->GetCreatureListWithEntryInGrid(GuardList, NPC_VIOLET_HOLD_GUARD, 40.0f); @@ -347,25 +363,17 @@ public: switch (uiPhase) { case 1: - Talk(SAY_SINCLARI_1); - uiTimer = 4000; - uiPhase = 2; + me->SetWalk(true); + me->GetMotionMaster()->MovePoint(0, sinclariCrystalPosition); + uiTimer = 1000; + uiPhase = 6; break; case 2: { - std::list<Creature*> GuardList; - me->GetCreatureListWithEntryInGrid(GuardList, NPC_VIOLET_HOLD_GUARD, 40.0f); - if (!GuardList.empty()) - for (std::list<Creature*>::const_iterator itr = GuardList.begin(); itr != GuardList.end(); ++itr) - { - if (Creature* pGuard = *itr) - { - pGuard->SetWalk(false); - pGuard->GetMotionMaster()->MovePoint(0, MovePosition); - } - } - uiTimer = 6000; - uiPhase = 3; + me->SetFacingTo(me->GetOrientation() - 3.14f); + Talk(SAY_SINCLARI_1); + uiTimer = 1500; + uiPhase = 7; break; } case 3: @@ -378,7 +386,6 @@ public: if (Creature* pGuard = *itr) { pGuard->SetVisible(false); - pGuard->SetReactState(REACT_PASSIVE); } } uiTimer = 2000; @@ -391,11 +398,58 @@ public: uiPhase = 5; break; case 5: - instance->SetData(DATA_MAIN_EVENT_PHASE, IN_PROGRESS); + me->SetFacingTo(0.006673f); + me->Say(SAY_EVENT_LOCK, LANG_UNIVERSAL, me); // need to change to db say me->SetReactState(REACT_PASSIVE); + uiTimer = 3000; + uiPhase = 8; + break; + case 6: + me->GetMotionMaster()->MovementExpired(); + me->HandleEmoteCommand(EMOTE_STATE_USE_STANDING); + uiTimer = 2000; + uiPhase = 2; + break; + case 7: + { + std::list<Creature*> creatures; + GetCreatureListWithEntryInGrid(creatures, me, NPC_TELEPORTATION_PORTAL, 200.0f); + GetCreatureListWithEntryInGrid(creatures, me, NPC_AZURE_BINDER_1, 200.0f); + GetCreatureListWithEntryInGrid(creatures, me, NPC_AZURE_MAGE_SLAYER_1, 200.0f); + GetCreatureListWithEntryInGrid(creatures, me, NPC_AZURE_INVADER_1, 200.0f); + DoCast(SPELL_CRYSTAL_ACTIVATION); + if (!creatures.empty()) + { + for (std::list<Creature*>::iterator itr = creatures.begin(); itr != creatures.end(); ++itr) + (*itr)->DisappearAndDie(); + } + uiTimer = 500; + uiPhase = 9; + } + break; + case 8: + instance->SetData(DATA_MAIN_EVENT_PHASE, IN_PROGRESS); uiTimer = 0; uiPhase = 0; break; + case 9: + { + std::list<Creature*> GuardList; + me->GetCreatureListWithEntryInGrid(GuardList, NPC_VIOLET_HOLD_GUARD, 40.0f); + if (!GuardList.empty()) + for (std::list<Creature*>::const_iterator itr = GuardList.begin(); itr != GuardList.end(); ++itr) + { + if (Creature* pGuard = *itr) + { + pGuard->SetReactState(REACT_PASSIVE); + pGuard->SetWalk(false); + pGuard->GetMotionMaster()->MovePoint(0, MovePosition); + } + } + uiTimer = 4000; + uiPhase = 3; + } + break; } } else uiTimer -= uiDiff; @@ -548,6 +602,9 @@ public: Initialize(); instance = creature->GetInstanceScript(); uiTypeOfMobsPortal = urand(0, 1); // 0 - elite mobs 1 - portal guardian or portal keeper with regular mobs + + if (instance->GetData(DATA_MAIN_EVENT_PHASE) == NOT_STARTED) + uiTypeOfMobsPortal = 2; } void Initialize() @@ -575,10 +632,13 @@ public: void UpdateAI(uint32 diff) override { - if (instance->GetData(DATA_REMOVE_NPC) == 1) + if (instance->GetData(DATA_MAIN_EVENT_PHASE) == IN_PROGRESS) { - me->DespawnOrUnsummon(); - instance->SetData(DATA_REMOVE_NPC, 0); + if (instance->GetData(DATA_REMOVE_NPC) == 1) + { + me->DespawnOrUnsummon(); + instance->SetData(DATA_REMOVE_NPC, 0); + } } uint8 uiWaveCount = instance->GetData(DATA_WAVE_COUNT); @@ -642,24 +702,39 @@ public: me->RemoveCorpse(); } break; + case 2: // Pre-event + if (uiSpawnTimer <= diff) + { + uint32 entry = RAND(NPC_AZURE_INVADER_1, NPC_AZURE_MAGE_SLAYER_1, NPC_AZURE_BINDER_1); + DoSummon(entry, me, 2.0f, 20000, TEMPSUMMON_DEAD_DESPAWN); + uiSpawnTimer = SPAWN_TIME; + } else uiSpawnTimer -= diff; + break; } } void JustDied(Unit* /*killer*/) override { - instance->SetData(DATA_WAVE_COUNT, instance->GetData(DATA_WAVE_COUNT)+1); + if (instance->GetData(DATA_MAIN_EVENT_PHASE) == IN_PROGRESS) + instance->SetData(DATA_WAVE_COUNT, instance->GetData(DATA_WAVE_COUNT) + 1); } void JustSummoned(Creature* summoned) override { - listOfMobs.Summon(summoned); - instance->SetGuidData(DATA_ADD_TRASH_MOB, summoned->GetGUID()); + if (instance->GetData(DATA_MAIN_EVENT_PHASE) == IN_PROGRESS) + { + listOfMobs.Summon(summoned); + instance->SetGuidData(DATA_ADD_TRASH_MOB, summoned->GetGUID()); + } } void SummonedCreatureDies(Creature* summoned, Unit* /*killer*/) override { - listOfMobs.Despawn(summoned); - instance->SetGuidData(DATA_DEL_TRASH_MOB, summoned->GetGUID()); + if (instance->GetData(DATA_MAIN_EVENT_PHASE) == IN_PROGRESS) + { + listOfMobs.Despawn(summoned); + instance->SetGuidData(DATA_DEL_TRASH_MOB, summoned->GetGUID()); + } } }; @@ -675,8 +750,23 @@ struct violet_hold_trashAI : public npc_escortAI { instance = creature->GetInstanceScript(); bHasGotMovingPoints = false; - portalLocationID = instance->GetData(DATA_PORTAL_LOCATION); - secondPortalRouteID = 0; + + + if (instance->GetData(DATA_MAIN_EVENT_PHASE) == NOT_STARTED) + { + if (Creature* portal = me->FindNearestCreature(NPC_TELEPORTATION_PORTAL, 10.0f)) + { + ObjectGuid portalGUID = portal->GetGUID(); + for (uint8 i = 0; i < MAX_PRE_EVENT_PORTAL; i++) + if (portalGUID == preEventPortalGUID[i]) + portalLocationID = i * 2; + } + } + else + { + portalLocationID = instance->GetData(DATA_PORTAL_LOCATION); + Reset(); + } } public: @@ -691,7 +781,7 @@ struct violet_hold_trashAI : public npc_escortAI { case 0: if (waypointId == 5) - CreatureStartAttackDoor(); + CreatureStartAttackDoor(); break; case 1: if ((waypointId == 8 && secondPortalRouteID == 0) || (waypointId == 7 && secondPortalRouteID == 1)) @@ -699,7 +789,7 @@ struct violet_hold_trashAI : public npc_escortAI break; case 2: if (waypointId == 7) - CreatureStartAttackDoor(); + CreatureStartAttackDoor(); break; case 3: if (waypointId == 8) @@ -1203,7 +1293,7 @@ public: if (uiConeOfColdTimer <= diff) { - DoCast(SPELL_CONE_OF_COLD); + DoCast(SPELL_CONE_OF_COLD); uiConeOfColdTimer = 5000; } else uiConeOfColdTimer -= diff; } @@ -1334,7 +1424,6 @@ public: } }; - class npc_violet_hold_arcane_sphere : public CreatureScript { public: @@ -1391,6 +1480,33 @@ public: } }; +class spell_crystal_activation : public SpellScriptLoader +{ +public: + spell_crystal_activation() : SpellScriptLoader("spell_crystal_activation") { } + + class spell_crystal_activation_SpellScript : public SpellScript + { + PrepareSpellScript(spell_crystal_activation_SpellScript); + + void HandleSendEvent(SpellEffIndex effIndex) + { + if (GetHitUnit()->GetEntry() == NPC_VIOLET_HOLD_GUARD) + PreventHitDefaultEffect(effIndex); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_crystal_activation_SpellScript::HandleSendEvent, EFFECT_0, SPELL_EFFECT_SEND_EVENT); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_crystal_activation_SpellScript(); + } +}; + void AddSC_violet_hold() { new npc_sinclari_vh(); @@ -1406,4 +1522,5 @@ void AddSC_violet_hold() new npc_azure_saboteur(); new npc_violet_hold_arcane_sphere(); new go_activation_crystal(); + new spell_crystal_activation(); } diff --git a/src/server/scripts/Northrend/VioletHold/violet_hold.h b/src/server/scripts/Northrend/VioletHold/violet_hold.h index 275a7467d83..e8da9576c13 100644 --- a/src/server/scripts/Northrend/VioletHold/violet_hold.h +++ b/src/server/scripts/Northrend/VioletHold/violet_hold.h @@ -101,7 +101,9 @@ enum CreaturesIds NPC_SINCLARI = 30658, NPC_SABOTEOUR = 31079, NPC_VIOLET_HOLD_GUARD = 30659, - NPC_DEFENSE_SYSTEM = 30837 + NPC_DEFENSE_SYSTEM = 30837, + NPC_VOID_SENTRY = 29364, + NPC_VOID_SENTRY_BALL = 29365 }; enum GameObjectIds diff --git a/src/server/scripts/Northrend/isle_of_conquest.cpp b/src/server/scripts/Northrend/isle_of_conquest.cpp index ba21b60f11d..f5514cc51a5 100644 --- a/src/server/scripts/Northrend/isle_of_conquest.cpp +++ b/src/server/scripts/Northrend/isle_of_conquest.cpp @@ -161,19 +161,6 @@ class spell_ioc_gunship_portal : public SpellScriptLoader * Position: X: 7.305609 Y: -0.095246 Z: 34.51022 O: 0 */ caster->TeleportTo(GetHitCreature()->GetWorldLocation(), TELE_TO_NOT_LEAVE_TRANSPORT); - /* - * HACK: This aura should be added by 20212 and 20213 but can't find any SMSG_SPELL_GO. Could't find their position. - * ServerToClient: SMSG_AURA_UPDATE (0x0072) - * [0] CasterGUID: Full: xxxxx Type: Unit Entry: 20212 Low: xxx - * [0] Flags: None (0) - * [0] Caster Level: 60 - * [0] Spell ID: 66656 - * [0] Charges: 0 - * [0] Effect Mask: 1 - * [0] Slot: 37 - * Guid: Full: xxxxx Type: Player2 Low: xxxxx - */ - caster->AddAura(SPELL_PARACHUTE, caster); } void Register() override diff --git a/src/server/scripts/Spells/spell_holiday.cpp b/src/server/scripts/Spells/spell_holiday.cpp index 93e13667cb0..a1b218010aa 100644 --- a/src/server/scripts/Spells/spell_holiday.cpp +++ b/src/server/scripts/Spells/spell_holiday.cpp @@ -824,6 +824,60 @@ class spell_brewfest_barker_bunny : public SpellScriptLoader } }; +enum TorchSpells +{ + SPELL_TORCH_TOSSING_TRAINING = 45716, + SPELL_TORCH_TOSSING_PRACTICE = 46630, + SPELL_TORCH_TOSSING_TRAINING_SUCCESS_ALLIANCE = 45719, + SPELL_TORCH_TOSSING_TRAINING_SUCCESS_HORDE = 46651, + SPELL_BRAZIERS_HIT = 45724 +}; + +// 45724 - Braziers Hit! +class spell_midsummer_braziers_hit : public SpellScriptLoader +{ + public: + spell_midsummer_braziers_hit() : SpellScriptLoader("spell_midsummer_braziers_hit") { } + + class spell_midsummer_braziers_hit_AuraScript : public AuraScript + { + PrepareAuraScript(spell_midsummer_braziers_hit_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_TORCH_TOSSING_TRAINING) || !sSpellMgr->GetSpellInfo(SPELL_TORCH_TOSSING_PRACTICE)) + return false; + return true; + } + + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Player* player = GetTarget()->ToPlayer(); + if (!player) + return; + + if ((player->HasAura(SPELL_TORCH_TOSSING_TRAINING) && GetStackAmount() == 8) || (player->HasAura(SPELL_TORCH_TOSSING_PRACTICE) && GetStackAmount() == 20)) + { + if (player->GetTeam() == ALLIANCE) + player->CastSpell(player, SPELL_TORCH_TOSSING_TRAINING_SUCCESS_ALLIANCE, true); + else if (player->GetTeam() == HORDE) + player->CastSpell(player, SPELL_TORCH_TOSSING_TRAINING_SUCCESS_HORDE, true); + Remove(); + } + } + + void Register() override + { + AfterEffectApply += AuraEffectApplyFn(spell_midsummer_braziers_hit_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AuraEffectHandleModes(AURA_EFFECT_HANDLE_REAPPLY)); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_midsummer_braziers_hit_AuraScript(); + } +}; + void AddSC_holiday_spell_scripts() { // Love is in the Air @@ -850,4 +904,6 @@ void AddSC_holiday_spell_scripts() new spell_brewfest_relay_race_intro_force_player_to_throw(); new spell_brewfest_dismount_ram(); new spell_brewfest_barker_bunny(); + // Midsummer Fire Festival + new spell_midsummer_braziers_hit(); } diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp index 1ca01501d01..1efdb16804f 100644 --- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp @@ -68,13 +68,13 @@ void CharacterDatabaseConnection::DoPrepareStatements() "position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, " "resettalents_time, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, instance_mode_mask, " "arenaPoints, totalHonorPoints, todayHonorPoints, yesterdayHonorPoints, totalKills, todayKills, yesterdayKills, chosenTitle, knownCurrencies, watchedFaction, drunk, " - "health, power1, power2, power3, power4, power5, power6, power7, instance_id, speccount, activespec, exploredZones, equipmentCache, ammoId, knownTitles, actionBars, grantableLevels " + "health, power1, power2, power3, power4, power5, power6, power7, instance_id, talentGroupsCount, activeTalentGroup, exploredZones, equipmentCache, ammoId, knownTitles, actionBars, grantableLevels " "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_AURAS, "SELECT caster_guid, spell, effect_mask, recalculate_mask, stackcount, amount0, amount1, amount2, " - "base_amount0, base_amount1, base_amount2, maxduration, remaintime, remaincharges FROM character_aura 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); PrepareStatement(CHAR_SEL_CHARACTER_QUESTSTATUS, "SELECT quest, status, explored, timer, mobcount1, mobcount2, mobcount3, mobcount4, " "itemcount1, itemcount2, itemcount3, itemcount4, playercount FROM character_queststatus WHERE guid = ? AND status <> 0", CONNECTION_ASYNC); @@ -99,7 +99,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_SEL_CHARACTER_REPUTATION, "SELECT faction, standing, flags FROM character_reputation WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_INVENTORY, "SELECT creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, bag, slot, " "item, itemEntry FROM character_inventory ci JOIN item_instance ii ON ci.item = ii.guid WHERE ci.guid = ? ORDER BY bag, slot", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_CHARACTER_ACTIONS, "SELECT a.button, a.action, a.type FROM character_action as a, characters as c WHERE a.guid = c.guid AND a.spec = c.activespec AND a.guid = ? ORDER BY button", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_CHARACTER_ACTIONS, "SELECT a.button, a.action, a.type FROM character_action as a, characters as c WHERE a.guid = c.guid AND a.spec = c.activeTalentGroup AND a.guid = ? ORDER BY button", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_MAILCOUNT, "SELECT COUNT(id) FROM mail WHERE receiver = ? AND (checked & 1) = 0 AND deliver_time <= ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_MAILDATE, "SELECT MIN(deliver_time) FROM mail WHERE receiver = ? AND (checked & 1) = 0", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_MAIL_COUNT, "SELECT COUNT(*) FROM mail WHERE receiver = ?", CONNECTION_SYNCH); @@ -116,8 +116,8 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_SEL_CHARACTER_EQUIPMENTSETS, "SELECT setguid, setindex, name, iconname, ignore_mask, item0, item1, item2, item3, item4, item5, item6, item7, item8, " "item9, item10, item11, item12, item13, item14, item15, item16, item17, item18 FROM character_equipmentsets WHERE guid = ? ORDER BY setindex", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_BGDATA, "SELECT instanceId, team, joinX, joinY, joinZ, joinO, joinMapId, taxiStart, taxiEnd, mountSpell FROM character_battleground_data WHERE guid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_CHARACTER_GLYPHS, "SELECT spec, glyph1, glyph2, glyph3, glyph4, glyph5, glyph6 FROM character_glyphs WHERE guid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_CHARACTER_TALENTS, "SELECT spell, spec FROM character_talent WHERE guid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_CHARACTER_GLYPHS, "SELECT talentGroup, glyph1, glyph2, glyph3, glyph4, glyph5, glyph6 FROM character_glyphs WHERE guid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_CHARACTER_TALENTS, "SELECT spell, talentGroup FROM character_talent WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_SKILLS, "SELECT skill, value, max FROM character_skills WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_RANDOMBG, "SELECT guid FROM character_battleground_random WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_BANNED, "SELECT guid FROM character_banned WHERE guid = ? AND active = 1", CONNECTION_ASYNC); @@ -247,7 +247,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_EQUIP_SET, "DELETE FROM character_equipmentsets WHERE setguid=?", CONNECTION_ASYNC); // Auras - PrepareStatement(CHAR_INS_AURA, "INSERT INTO character_aura (guid, caster_guid, item_guid, spell, effect_mask, recalculate_mask, stackcount, amount0, amount1, amount2, base_amount0, base_amount1, base_amount2, maxduration, remaintime, remaincharges) " + PrepareStatement(CHAR_INS_AURA, "INSERT INTO character_aura (guid, casterGuid, itemGuid, spell, effectMask, recalculateMask, stackCount, amount0, amount1, amount2, base_amount0, base_amount1, base_amount2, maxDuration, remainTime, remainCharges) " "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); // Account data @@ -336,14 +336,14 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_GO_RESPAWN_BY_INSTANCE, "DELETE FROM gameobject_respawn WHERE mapId = ? AND instanceId = ?", CONNECTION_ASYNC); // GM Tickets - PrepareStatement(CHAR_SEL_GM_TICKETS, "SELECT ticketId, guid, name, message, createTime, mapId, posX, posY, posZ, lastModifiedTime, closedBy, assignedTo, comment, response, completed, escalated, viewed, haveTicket FROM gm_tickets", CONNECTION_SYNCH); - PrepareStatement(CHAR_REP_GM_TICKET, "REPLACE INTO gm_tickets (ticketId, guid, name, message, createTime, mapId, posX, posY, posZ, lastModifiedTime, closedBy, assignedTo, comment, response, completed, escalated, viewed, haveTicket) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); - PrepareStatement(CHAR_DEL_GM_TICKET, "DELETE FROM gm_tickets WHERE ticketId = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_DEL_PLAYER_GM_TICKETS, "DELETE FROM gm_tickets WHERE guid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_GM_TICKETS, "SELECT id, playerGuid, name, description, createTime, mapId, posX, posY, posZ, lastModifiedTime, closedBy, assignedTo, comment, response, completed, escalated, viewed, needMoreHelp FROM gm_ticket", CONNECTION_SYNCH); + PrepareStatement(CHAR_REP_GM_TICKET, "REPLACE INTO gm_ticket (id, playerGuid, name, description, createTime, mapId, posX, posY, posZ, lastModifiedTime, closedBy, assignedTo, comment, response, completed, escalated, viewed, needMoreHelp) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_DEL_GM_TICKET, "DELETE FROM gm_ticket WHERE id = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_DEL_PLAYER_GM_TICKETS, "DELETE FROM gm_ticket WHERE playerGuid = ?", CONNECTION_ASYNC); // GM Survey/subsurvey/lag report - PrepareStatement(CHAR_INS_GM_SURVEY, "INSERT INTO gm_surveys (guid, surveyId, mainSurvey, overallComment, createTime) VALUES (?, ?, ?, ?, UNIX_TIMESTAMP(NOW()))", CONNECTION_ASYNC); - PrepareStatement(CHAR_INS_GM_SUBSURVEY, "INSERT INTO gm_subsurveys (surveyId, subsurveyId, rank, comment) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_INS_GM_SURVEY, "INSERT INTO gm_survey (guid, surveyId, mainSurvey, comment, createTime) VALUES (?, ?, ?, ?, UNIX_TIMESTAMP(NOW()))", CONNECTION_ASYNC); + PrepareStatement(CHAR_INS_GM_SUBSURVEY, "INSERT INTO gm_subsurvey (surveyId, questionId, answer, answerComment) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_LAG_REPORT, "INSERT INTO lag_reports (guid, lagType, mapId, posX, posY, posZ, latency, createTime) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); // LFG Data @@ -358,13 +358,13 @@ void CharacterDatabaseConnection::DoPrepareStatements() "extra_flags, stable_slots, at_login, zone, " "death_expire_time, taxi_path, arenaPoints, totalHonorPoints, todayHonorPoints, yesterdayHonorPoints, totalKills, " "todayKills, yesterdayKills, chosenTitle, knownCurrencies, watchedFaction, drunk, health, power1, power2, power3, " - "power4, power5, power6, power7, latency, speccount, activespec, exploredZones, equipmentCache, ammoId, knownTitles, actionBars, grantableLevels) VALUES " + "power4, power5, power6, power7, latency, talentGroupsCount, activeTalentGroup, exploredZones, equipmentCache, ammoId, knownTitles, actionBars, grantableLevels) VALUES " "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_CHARACTER, "UPDATE characters SET name=?,race=?,class=?,gender=?,level=?,xp=?,money=?,playerBytes=?,playerBytes2=?,playerFlags=?," "map=?,instance_id=?,instance_mode_mask=?,position_x=?,position_y=?,position_z=?,orientation=?,trans_x=?,trans_y=?,trans_z=?,trans_o=?,transguid=?,taximask=?,cinematic=?,totaltime=?,leveltime=?,rest_bonus=?," "logout_time=?,is_logout_resting=?,resettalents_cost=?,resettalents_time=?,extra_flags=?,stable_slots=?,at_login=?,zone=?,death_expire_time=?,taxi_path=?," "arenaPoints=?,totalHonorPoints=?,todayHonorPoints=?,yesterdayHonorPoints=?,totalKills=?,todayKills=?,yesterdayKills=?,chosenTitle=?,knownCurrencies=?," - "watchedFaction=?,drunk=?,health=?,power1=?,power2=?,power3=?,power4=?,power5=?,power6=?,power7=?,latency=?,speccount=?,activespec=?,exploredZones=?," + "watchedFaction=?,drunk=?,health=?,power1=?,power2=?,power3=?,power4=?,power5=?,power6=?,power7=?,latency=?,talentGroupsCount=?,activeTalentGroup=?,exploredZones=?," "equipmentCache=?,ammoId=?,knownTitles=?,actionBars=?,grantableLevels=?,online=? WHERE guid=?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_ADD_AT_LOGIN_FLAG, "UPDATE characters SET at_login = at_login | ? WHERE guid = ?", CONNECTION_ASYNC); @@ -374,7 +374,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_UPD_PETITION_NAME, "UPDATE petition SET name = ? WHERE petitionguid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_PETITION_SIGNATURE, "INSERT INTO petition_sign (ownerguid, petitionguid, playerguid, player_account) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_ACCOUNT_ONLINE, "UPDATE characters SET online = 0 WHERE account = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_INS_GROUP, "INSERT INTO groups (guid, leaderGuid, lootMethod, looterGuid, lootThreshold, icon1, icon2, icon3, icon4, icon5, icon6, icon7, icon8, groupType, difficulty, raiddifficulty, masterLooterGuid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_INS_GROUP, "INSERT INTO groups (guid, leaderGuid, lootMethod, looterGuid, lootThreshold, icon1, icon2, icon3, icon4, icon5, icon6, icon7, icon8, groupType, difficulty, raidDifficulty, masterLooterGuid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_GROUP_MEMBER, "INSERT INTO group_member (guid, memberGuid, memberFlags, subgroup, roles) VALUES(?, ?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_GROUP_MEMBER, "DELETE FROM group_member WHERE memberGuid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_GROUP_INSTANCE_PERM_BINDING, "DELETE FROM group_instance WHERE guid = ? AND instance = ?", CONNECTION_ASYNC); @@ -384,7 +384,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_UPD_GROUP_MEMBER_FLAG, "UPDATE group_member SET memberFlags = ? WHERE memberGuid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_GROUP_DIFFICULTY, "UPDATE groups SET difficulty = ? WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_GROUP_RAID_DIFFICULTY, "UPDATE groups SET raiddifficulty = ? WHERE guid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_DEL_ALL_GM_TICKETS, "TRUNCATE TABLE gm_tickets", CONNECTION_ASYNC); + PrepareStatement(CHAR_DEL_ALL_GM_TICKETS, "TRUNCATE TABLE gm_ticket", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_INVALID_SPELL_TALENTS, "DELETE FROM character_talent WHERE spell = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_INVALID_SPELL_SPELLS, "DELETE FROM character_spell WHERE spell = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_DELETE_INFO, "UPDATE characters SET deleteInfos_Name = name, deleteInfos_Account = account, deleteDate = UNIX_TIMESTAMP(), name = '', account = 0 WHERE guid = ?", CONNECTION_ASYNC); @@ -415,7 +415,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_CHARACTER_SOCIAL, "DELETE FROM character_social WHERE guid = ? AND friend = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_CHARACTER_SOCIAL_NOTE, "UPDATE character_social SET note = ? WHERE guid = ? AND friend = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_CHARACTER_POSITION, "UPDATE characters SET position_x = ?, position_y = ?, position_z = ?, orientation = ?, map = ?, zone = ?, trans_x = 0, trans_y = 0, trans_z = 0, transguid = 0, taxi_path = '' WHERE guid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_CHARACTER_AURA_FROZEN, "SELECT characters.name, character_aura.remaintime FROM characters LEFT JOIN character_aura ON (characters.guid = character_aura.guid) WHERE character_aura.spell = 9454", CONNECTION_SYNCH); + PrepareStatement(CHAR_SEL_CHARACTER_AURA_FROZEN, "SELECT characters.name, character_aura.remainTime FROM characters LEFT JOIN character_aura ON (characters.guid = character_aura.guid) WHERE character_aura.spell = 9454", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_CHARACTER_ONLINE, "SELECT name, account, map, zone FROM characters WHERE online > 0", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_CHAR_DEL_INFO_BY_GUID, "SELECT guid, deleteInfos_Name, deleteInfos_Account, deleteDate FROM characters WHERE deleteDate IS NOT NULL AND guid = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_CHAR_DEL_INFO_BY_NAME, "SELECT guid, deleteInfos_Name, deleteInfos_Account, deleteDate FROM characters WHERE deleteDate IS NOT NULL AND deleteInfos_Name LIKE CONCAT('%%', ?, '%%')", CONNECTION_SYNCH); @@ -546,8 +546,8 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_PETITION_BY_OWNER_AND_TYPE, "DELETE FROM petition WHERE ownerguid = ? AND type = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_PETITION_SIGNATURE_BY_OWNER_AND_TYPE, "DELETE FROM petition_sign WHERE ownerguid = ? AND type = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_CHAR_GLYPHS, "INSERT INTO character_glyphs VALUES(?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); - PrepareStatement(CHAR_DEL_CHAR_TALENT_BY_SPELL_SPEC, "DELETE FROM character_talent WHERE guid = ? and spell = ? and spec = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_INS_CHAR_TALENT, "INSERT INTO character_talent (guid, spell, spec) VALUES (?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_DEL_CHAR_TALENT_BY_SPELL_SPEC, "DELETE FROM character_talent WHERE guid = ? AND spell = ? AND talentGroup = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_INS_CHAR_TALENT, "INSERT INTO character_talent (guid, spell, talentGroup) VALUES (?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_ACTION_EXCEPT_SPEC, "DELETE FROM character_action WHERE spec<>? AND guid = ?", CONNECTION_ASYNC); // Items that hold loot or money @@ -576,7 +576,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_CHAR_PET_DECLINEDNAME_BY_OWNER, "DELETE FROM character_pet_declinedname WHERE owner = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_PET_DECLINEDNAME, "DELETE FROM character_pet_declinedname WHERE id = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_CHAR_PET_DECLINEDNAME, "INSERT INTO character_pet_declinedname (id, owner, genitive, dative, accusative, instrumental, prepositional) VALUES (?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_PET_AURA, "SELECT caster_guid, spell, effect_mask, recalculate_mask, stackcount, amount0, amount1, amount2, base_amount0, base_amount1, base_amount2, maxduration, remaintime, remaincharges FROM pet_aura WHERE guid = ?", CONNECTION_SYNCH); + PrepareStatement(CHAR_SEL_PET_AURA, "SELECT casterGuid, spell, effectMask, recalculateMask, stackCount, amount0, amount1, amount2, base_amount0, base_amount1, base_amount2, maxDuration, remainTime, remainCharges FROM pet_aura WHERE guid = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_PET_SPELL, "SELECT spell, active FROM pet_spell WHERE guid = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_PET_SPELL_COOLDOWN, "SELECT spell, time FROM pet_spell_cooldown WHERE guid = ? AND time > UNIX_TIMESTAMP()", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_PET_DECLINED_NAME, "SELECT genitive, dative, accusative, instrumental, prepositional FROM character_pet_declinedname WHERE owner = ? AND id = ?", CONNECTION_SYNCH); @@ -586,8 +586,8 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_INS_PET_SPELL_COOLDOWN, "INSERT INTO pet_spell_cooldown (guid, spell, time) VALUES (?, ?, ?)", CONNECTION_BOTH); PrepareStatement(CHAR_DEL_PET_SPELL_BY_SPELL, "DELETE FROM pet_spell WHERE guid = ? and spell = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_PET_SPELL, "INSERT INTO pet_spell (guid, spell, active) VALUES (?, ?, ?)", CONNECTION_BOTH); - PrepareStatement(CHAR_INS_PET_AURA, "INSERT INTO pet_aura (guid, caster_guid, spell, effect_mask, recalculate_mask, stackcount, amount0, amount1, amount2, " - "base_amount0, base_amount1, base_amount2, maxduration, remaintime, remaincharges) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_BOTH); + PrepareStatement(CHAR_INS_PET_AURA, "INSERT INTO pet_aura (guid, casterGuid, spell, effectMask, recalculateMask, stackCount, amount0, amount1, amount2, " + "base_amount0, base_amount1, base_amount2, maxDuration, remainTime, remainCharges) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_BOTH); PrepareStatement(CHAR_SEL_CHAR_PET_BY_ENTRY, "SELECT id, entry, owner, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, curhappiness, abdata, savetime, CreatedBySpell, PetType FROM character_pet WHERE owner = ? AND id = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_CHAR_PET_BY_ENTRY_AND_SLOT_2, "SELECT id, entry, owner, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, curhappiness, abdata, savetime, CreatedBySpell, PetType FROM character_pet WHERE owner = ? AND entry = ? AND (slot = ? OR slot > ?)", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_CHAR_PET_BY_SLOT, "SELECT id, entry, owner, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, curhappiness, abdata, savetime, CreatedBySpell, PetType FROM character_pet WHERE owner = ? AND (slot = ? OR slot > ?) ", CONNECTION_SYNCH); diff --git a/src/server/shared/Threading/Callback.h b/src/server/shared/Threading/Callback.h index d0c80efb00a..1f4ffc97cfc 100644 --- a/src/server/shared/Threading/Callback.h +++ b/src/server/shared/Threading/Callback.h @@ -97,7 +97,7 @@ class QueryCallback //! Resets all underlying variables (param, result and stage) void Reset() { - SetParam(NULL); + SetParam(ParamType()); FreeResult(); ResetStage(); } diff --git a/src/tools/map_extractor/adt.h b/src/tools/map_extractor/adt.h index 9212784ab9e..cad773fbee4 100644 --- a/src/tools/map_extractor/adt.h +++ b/src/tools/map_extractor/adt.h @@ -67,8 +67,8 @@ class adt_MCLQ uint32 fcc; char fcc_txt[4]; }; - uint32 size; public: + uint32 size; float height1; float height2; struct liquid_data{ @@ -96,8 +96,8 @@ class adt_MCNK uint32 fcc; char fcc_txt[4]; }; - uint32 size; public: + uint32 size; uint32 flags; uint32 ix; uint32 iy; @@ -155,8 +155,8 @@ class adt_MCIN uint32 fcc; char fcc_txt[4]; }; - uint32 size; public: + uint32 size; struct adt_CELLS{ uint32 offsMCNK; uint32 size; @@ -271,6 +271,7 @@ class adt_MHDR uint32 fcc; char fcc_txt[4]; }; +public: uint32 size; uint32 pad; @@ -289,7 +290,6 @@ class adt_MHDR uint32 data3; uint32 data4; uint32 data5; -public: bool prepareLoadedData(); adt_MCIN *getMCIN(){ return (adt_MCIN *)((uint8 *)&pad+offsMCIN);} adt_MH2O *getMH2O(){ return offsMH2O ? (adt_MH2O *)((uint8 *)&pad+offsMH2O) : 0;} |