diff options
315 files changed, 9705 insertions, 6241 deletions
diff --git a/cmake/compiler/clang/settings.cmake b/cmake/compiler/clang/settings.cmake index 4dad4cb7820..261a55b285f 100644 --- a/cmake/compiler/clang/settings.cmake +++ b/cmake/compiler/clang/settings.cmake @@ -1,5 +1,5 @@ # Set build-directive (used in core to tell which buildtype we used) -add_definitions(-D_BUILD_DIRECTIVE='"$(CONFIGURATION)"') +add_definitions(-D_BUILD_DIRECTIVE='"${CMAKE_BUILD_TYPE}"') if(WITH_WARNINGS) set(WARNING_FLAGS "-W -Wall -Wextra -Winit-self -Wfatal-errors -Wno-mismatched-tags") diff --git a/cmake/macros/FindPCHSupport.cmake b/cmake/macros/FindPCHSupport.cmake index b068b69c26b..49d4be904d1 100644 --- a/cmake/macros/FindPCHSupport.cmake +++ b/cmake/macros/FindPCHSupport.cmake @@ -11,7 +11,7 @@ FUNCTION(GET_COMMON_PCH_PARAMS PCH_HEADER PCH_FE INCLUDE_PREFIX) SET(INCLUDE_FLAGS ${INCLUDE_FLAGS_LIST} PARENT_SCOPE) ENDFUNCTION(GET_COMMON_PCH_PARAMS) -FUNCTION(GENERATE_CXX_PCH_COMMAND TARGET_NAME INCLUDE_FLAGS IN PCH_SRC OUT) +FUNCTION(GENERATE_CXX_PCH_COMMAND TARGET_NAME_LIST INCLUDE_FLAGS IN PCH_SRC OUT) IF (CMAKE_BUILD_TYPE) STRING(TOUPPER _${CMAKE_BUILD_TYPE} CURRENT_BUILD_TYPE) ENDIF () @@ -55,50 +55,69 @@ FUNCTION(GENERATE_CXX_PCH_COMMAND TARGET_NAME INCLUDE_FLAGS IN PCH_SRC OUT) DEPENDS ${OUT} ) - ADD_DEPENDENCIES(${TARGET_NAME} generate_${PCH_SRC_N}) + FOREACH(TARGET_NAME ${TARGET_NAME_LIST}) + ADD_DEPENDENCIES(${TARGET_NAME} generate_${PCH_SRC_N}) + ENDFOREACH() + ENDFUNCTION(GENERATE_CXX_PCH_COMMAND) -FUNCTION(ADD_CXX_PCH_GCC TARGET_NAME PCH_HEADER PCH_SOURCE) +FUNCTION(ADD_CXX_PCH_GCC TARGET_NAME_LIST PCH_HEADER PCH_SOURCE) GET_COMMON_PCH_PARAMS(${PCH_HEADER} "gch" "-I") - GENERATE_CXX_PCH_COMMAND(${TARGET_NAME} "${INCLUDE_FLAGS}" ${PCH_HEADER} ${PCH_SOURCE} ${PCH_HEADER_OUT}) - SET_TARGET_PROPERTIES( - ${TARGET_NAME} PROPERTIES - COMPILE_FLAGS "-include ${CMAKE_CURRENT_BINARY_DIR}/${PCH_HEADER_NAME}" - ) + GENERATE_CXX_PCH_COMMAND("${TARGET_NAME_LIST}" "${INCLUDE_FLAGS}" ${PCH_HEADER} ${PCH_SOURCE} ${PCH_HEADER_OUT}) + + FOREACH(TARGET_NAME ${TARGET_NAME_LIST}) + SET_TARGET_PROPERTIES( + ${TARGET_NAME} PROPERTIES + COMPILE_FLAGS "-include ${CMAKE_CURRENT_BINARY_DIR}/${PCH_HEADER_NAME}" + ) + ENDFOREACH() ENDFUNCTION(ADD_CXX_PCH_GCC) -FUNCTION(ADD_CXX_PCH_CLANG TARGET_NAME PCH_HEADER PCH_SOURCE) +FUNCTION(ADD_CXX_PCH_CLANG TARGET_NAME_LIST PCH_HEADER PCH_SOURCE) GET_COMMON_PCH_PARAMS(${PCH_HEADER} "pch" "-I") - GENERATE_CXX_PCH_COMMAND(${TARGET_NAME} "${INCLUDE_FLAGS}" ${PCH_HEADER} ${PCH_SOURCE} ${PCH_HEADER_OUT}) - SET_TARGET_PROPERTIES( - ${TARGET_NAME} PROPERTIES - COMPILE_FLAGS "-include-pch ${PCH_HEADER_OUT}" - ) + GENERATE_CXX_PCH_COMMAND("${TARGET_NAME_LIST}" "${INCLUDE_FLAGS}" ${PCH_HEADER} ${PCH_SOURCE} ${PCH_HEADER_OUT}) + + FOREACH(TARGET_NAME ${TARGET_NAME_LIST}) + SET_TARGET_PROPERTIES( + ${TARGET_NAME} PROPERTIES + COMPILE_FLAGS "-include-pch ${PCH_HEADER_OUT}" + ) + ENDFOREACH() ENDFUNCTION(ADD_CXX_PCH_CLANG) -FUNCTION(ADD_CXX_PCH_MSVC TARGET_NAME PCH_HEADER PCH_SOURCE) +FUNCTION(ADD_CXX_PCH_MSVC TARGET_NAME_LIST PCH_HEADER PCH_SOURCE) GET_COMMON_PCH_PARAMS(${PCH_HEADER} "pch" "/I") - SET_TARGET_PROPERTIES( - ${TARGET_NAME} PROPERTIES - COMPILE_FLAGS "/FI${PCH_HEADER_NAME} /Yu${PCH_HEADER_NAME}" - ) + + FOREACH(TARGET_NAME ${TARGET_NAME_LIST}) + SET_TARGET_PROPERTIES( + ${TARGET_NAME} PROPERTIES + COMPILE_FLAGS "/FI${PCH_HEADER_NAME} /Yu${PCH_HEADER_NAME}" + ) + ENDFOREACH() + SET_SOURCE_FILES_PROPERTIES( ${PCH_SOURCE} PROPERTIES COMPILE_FLAGS "/Yc${PCH_HEADER_NAME}" ) ENDFUNCTION(ADD_CXX_PCH_MSVC) -FUNCTION(ADD_CXX_PCH TARGET_NAME PCH_HEADER PCH_SOURCE) - IF (MSVC) - ADD_CXX_PCH_MSVC(${TARGET_NAME} ${PCH_HEADER} ${PCH_SOURCE}) - ELSEIF ("${CMAKE_GENERATOR}" MATCHES "Xcode") - SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES +FUNCTION(ADD_CXX_PCH_XCODE TARGET_NAME_LIST PCH_HEADER PCH_SOURCE) + FOREACH(TARGET_NAME ${TARGET_NAME_LIST}) + SET_TARGET_PROPERTIES("${TARGET_NAME}" PROPERTIES XCODE_ATTRIBUTE_GCC_PRECOMPILE_PREFIX_HEADER YES XCODE_ATTRIBUTE_GCC_PREFIX_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/${PCH_HEADER}" ) + ENDFOREACH() +ENDFUNCTION(ADD_CXX_PCH_XCODE) + +FUNCTION(ADD_CXX_PCH TARGET_NAME_LIST PCH_HEADER PCH_SOURCE) + IF (MSVC) + ADD_CXX_PCH_MSVC("${TARGET_NAME_LIST}" ${PCH_HEADER} ${PCH_SOURCE}) + ELSEIF ("${CMAKE_GENERATOR}" MATCHES "Xcode") + ADD_CXX_PCH_XCODE("${TARGET_NAME_LIST}" ${PCH_HEADER} ${PCH_SOURCE}) ELSEIF ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") - ADD_CXX_PCH_CLANG(${TARGET_NAME} ${PCH_HEADER} ${PCH_SOURCE}) + ADD_CXX_PCH_CLANG("${TARGET_NAME_LIST}" ${PCH_HEADER} ${PCH_SOURCE}) ELSEIF ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU") - ADD_CXX_PCH_GCC(${TARGET_NAME} ${PCH_HEADER} ${PCH_SOURCE}) + ADD_CXX_PCH_GCC("${TARGET_NAME_LIST}" ${PCH_HEADER} ${PCH_SOURCE}) ENDIF () ENDFUNCTION(ADD_CXX_PCH) diff --git a/contrib/extractor.bat b/contrib/extractor.bat new file mode 100644 index 00000000000..eb7c99e5c0b --- /dev/null +++ b/contrib/extractor.bat @@ -0,0 +1,51 @@ +@ECHO OFF +CLS +:MENU +ECHO. +ECHO ............................................... +ECHO Trinitycore dbc/db2, maps, vmaps, mmaps extractor +ECHO ............................................... +ECHO PRESS 1, 2, 3 OR 4 to select your task, or 5 to EXIT. +ECHO ............................................... +ECHO. +ECHO 1 - Extract dbc/db2 and maps +ECHO 2 - Extract vmaps (needs maps to be extracted before you run this) +ECHO 3 - Extract mmaps (needs vmaps to be extracted before you run this, may take hours) +ECHO 4 - Extract all (may take hours) +ECHO 5 - EXIT +ECHO. +SET /P M=Type 1, 2, 3, 4 or 5 then press ENTER: +IF %M%==1 GOTO MAPS +IF %M%==2 GOTO VMAPS +IF %M%==3 GOTO MMAPS +IF %M%==4 GOTO ALL +IF %M%==5 GOTO EOF +:MAPS +start mapextractor.exe +pause +GOTO MENU +:VMAPS +start vmap4extractor.exe +md vmaps +start vmap4assembler.exe Buildings vmaps +pause +GOTO MENU +:MMAPS +md mmaps +start mmaps_generator.exe +pause +GOTO MENU +:ALL +start mapextractor.exe +ECHO wait before mapextractor.exe closes before continue +pause +start vmap4extractor.exe +md vmaps +start vmap4assembler.exe Buildings vmaps +rmdir Buildings /s /q +ECHO wait before vmap4assembler.exe closes before continue +pause +md mmaps +start mmaps_generator.exe +pause +GOTO MENU diff --git a/dep/PackageList.txt b/dep/PackageList.txt index e84fef8d3b2..6ff4badddf6 100644 --- a/dep/PackageList.txt +++ b/dep/PackageList.txt @@ -14,7 +14,7 @@ bzip2 (a freely available, patent free, high-quality data compressor) cppformat (type safe format library) https://github.com/cppformat/cppformat - Version: 5c76d107cbaf5e851bd66b6c563e4fc7c90be7ad + Version: 5174b8ca281426af604b85fdf53be8a748b33f56 G3D (a commercial-grade C++ 3D engine available as Open Source (BSD License) http://g3d.sourceforge.net/ diff --git a/dep/cppformat/CMakeLists.txt b/dep/cppformat/CMakeLists.txt index 3be3e5f6dbb..3f1bb4f6a9f 100644 --- a/dep/cppformat/CMakeLists.txt +++ b/dep/cppformat/CMakeLists.txt @@ -1,7 +1,7 @@ include(CheckCXXCompilerFlag) include(CheckSymbolExists) -set(FMT_SOURCES format.cc format.h) +set(FMT_SOURCES cppformat/format.cc cppformat/format.h) # Use variadic templates add_definitions(-DFMT_VARIADIC_TEMPLATES=1) @@ -20,12 +20,12 @@ endif () if (HAVE_OPEN) add_definitions(-DFMT_USE_FILE_DESCRIPTORS=1) - set(FMT_SOURCES ${FMT_SOURCES} posix.cc posix.h) + set(FMT_SOURCES ${FMT_SOURCES} cppformat/posix.cc cppformat/posix.h) endif () -add_library(format STATIC ${FMT_SOURCES}) +add_library(cppformat STATIC ${FMT_SOURCES}) if (CMAKE_COMPILER_IS_GNUCXX) - set_target_properties(format PROPERTIES COMPILE_FLAGS + set_target_properties(cppformat PROPERTIES COMPILE_FLAGS "-Wall -Wextra -Wshadow -pedantic") endif () diff --git a/dep/cppformat/README.rst b/dep/cppformat/README.rst index fb4399f0af4..e859f909466 100644 --- a/dep/cppformat/README.rst +++ b/dep/cppformat/README.rst @@ -28,9 +28,9 @@ Features * Format API with `format string syntax <http://cppformat.github.io/latest/syntax.html>`_ similar to the one used by `str.format - <http://docs.python.org/2/library/stdtypes.html#str.format>`_ in Python. + <https://docs.python.org/2/library/stdtypes.html#str.format>`_ in Python. * Safe `printf implementation - <http://cppformat.github.io/latest/reference.html#printf-formatting-functions>`_ + <http://cppformat.github.io/latest/api.html#printf-formatting-functions>`_ including the POSIX extension for positional arguments. * Support for user-defined types. * High speed: performance of the format API is close to that of @@ -103,10 +103,10 @@ An object of any user-defined type for which there is an overloaded // s == "The date is 2012-12-9" You can use the `FMT_VARIADIC -<http://cppformat.github.io/latest/reference.html#utilities>`_ +<http://cppformat.github.io/latest/api.html#utilities>`_ macro to create your own functions similar to `format -<http://cppformat.github.io/latest/reference.html#format>`_ and -`print <http://cppformat.github.io/latest/reference.html#print>`_ +<http://cppformat.github.io/latest/api.html#format>`_ and +`print <http://cppformat.github.io/latest/api.html#print>`_ which take arbitrary arguments: .. code:: c++ @@ -132,13 +132,17 @@ Projects using this library * `AMPL/MP <https://github.com/ampl/mp>`_: An open-source library for mathematical programming -* `HarpyWar/pvpgn <https://github.com/HarpyWar/pvpgn>`_: +* `HarpyWar/pvpgn <https://github.com/pvpgn/pvpgn-server>`_: Player vs Player Gaming Network with tweaks -* `KBEngine <http://www.kbengine.org/>`_: An open-source MMOG server engine +* `KBEngine <http://kbengine.org/>`_: An open-source MMOG server engine + +* `Keypirinha <http://keypirinha.com/>`_: A semantic launcher for Windows * `Lifeline <https://github.com/peter-clark/lifeline>`_: A 2D game +* `MongoDB Smasher <https://github.com/duckie/mongo_smasher>`_: A small tool to generate randomized datasets + * `PenUltima Online (POL) <http://www.polserver.com/>`_: An MMO server, compatible with most Ultima Online clients @@ -148,7 +152,7 @@ Projects using this library * `redis-cerberus <https://github.com/HunanTV/redis-cerberus>`_: A Redis cluster proxy -* `Saddy <https://code.google.com/p/saddy/>`_: +* `Saddy <https://github.com/mamontov-cpp/saddy-graphics-engine-2d>`_: Small crossplatform 2D graphic engine * `Salesforce Analytics Cloud <http://www.salesforce.com/analytics-cloud/overview/>`_: @@ -188,7 +192,7 @@ doesn't support user-defined types. Printf also has safety issues although they are mostly solved with `__attribute__ ((format (printf, ...)) <http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html>`_ in GCC. There is a POSIX extension that adds positional arguments required for -`i18n <http://en.wikipedia.org/wiki/Internationalization_and_localization>`_ +`i18n <https://en.wikipedia.org/wiki/Internationalization_and_localization>`_ to printf but it is not a part of C99 and may not be available on some platforms. @@ -376,18 +380,13 @@ C++ Format is distributed under the BSD `license The `Format String Syntax <http://cppformat.github.io/latest/syntax.html>`_ section in the documentation is based on the one from Python `string module -documentation <http://docs.python.org/3/library/string.html#module-string>`_ +documentation <https://docs.python.org/3/library/string.html#module-string>`_ adapted for the current library. For this reason the documentation is distributed under the Python Software Foundation license available in `doc/python-license.txt <https://raw.github.com/cppformat/cppformat/master/doc/python-license.txt>`_. It only applies if you distribute the documentation of C++ Format. -Links ------ - -`API changes/compatibility report <http://upstream-tracker.org/versions/cppformat.html>`_ - Acknowledgments --------------- diff --git a/dep/cppformat/format.cc b/dep/cppformat/cppformat/format.cc index 1970d53c500..daccd68f1da 100644 --- a/dep/cppformat/format.cc +++ b/dep/cppformat/cppformat/format.cc @@ -207,10 +207,15 @@ void format_error_code(fmt::Writer &out, int error_code, out.clear(); static const char SEP[] = ": "; static const char ERROR_STR[] = "error "; - fmt::internal::IntTraits<int>::MainType ec_value = error_code; // Subtract 2 to account for terminating null characters in SEP and ERROR_STR. std::size_t error_code_size = sizeof(SEP) + sizeof(ERROR_STR) - 2; - error_code_size += fmt::internal::count_digits(ec_value); + typedef fmt::internal::IntTraits<int>::MainType MainType; + MainType abs_value = static_cast<MainType>(error_code); + if (internal::is_negative(error_code)) { + abs_value = 0 - abs_value; + ++error_code_size; + } + error_code_size += fmt::internal::count_digits(abs_value); if (message.size() <= fmt::internal::INLINE_BUFFER_SIZE - error_code_size) out << message << SEP; out << ERROR_STR << error_code; @@ -252,7 +257,7 @@ class WidthHandler : public fmt::internal::ArgVisitor<WidthHandler, unsigned> { template <typename T> unsigned visit_any_int(T value) { typedef typename fmt::internal::IntTraits<T>::MainType UnsignedType; - UnsignedType width = value; + UnsignedType width = static_cast<UnsignedType>(value); if (fmt::internal::is_negative(value)) { spec_.align_ = fmt::ALIGN_LEFT; width = 0 - width; @@ -278,8 +283,21 @@ class PrecisionHandler : } }; -// Converts an integer argument to an integral type T for printf. +template <typename T, typename U> +struct is_same { + enum { value = 0 }; +}; + template <typename T> +struct is_same<T, T> { + enum { value = 1 }; +}; + +// An argument visitor that converts an integer argument to T for printf, +// if T is an integral type. If T is void, the argument is converted to +// corresponding signed or unsigned type depending on the type specifier: +// 'd' and 'i' - signed, other - unsigned) +template <typename T = void> class ArgConverter : public fmt::internal::ArgVisitor<ArgConverter<T>, void> { private: fmt::internal::Arg &arg_; @@ -300,21 +318,25 @@ class ArgConverter : public fmt::internal::ArgVisitor<ArgConverter<T>, void> { void visit_any_int(U value) { bool is_signed = type_ == 'd' || type_ == 'i'; using fmt::internal::Arg; - if (sizeof(T) <= sizeof(int)) { + typedef typename fmt::internal::Conditional< + is_same<T, void>::value, U, T>::type TargetType; + if (sizeof(TargetType) <= sizeof(int)) { // Extra casts are used to silence warnings. if (is_signed) { arg_.type = Arg::INT; - arg_.int_value = static_cast<int>(static_cast<T>(value)); + arg_.int_value = static_cast<int>(static_cast<TargetType>(value)); } else { arg_.type = Arg::UINT; - arg_.uint_value = static_cast<unsigned>( - static_cast<typename fmt::internal::MakeUnsigned<T>::Type>(value)); + typedef typename fmt::internal::MakeUnsigned<TargetType>::Type Unsigned; + arg_.uint_value = static_cast<unsigned>(static_cast<Unsigned>(value)); } } else { if (is_signed) { arg_.type = Arg::LONG_LONG; - arg_.long_long_value = - static_cast<typename fmt::internal::MakeUnsigned<U>::Type>(value); + // glibc's printf doesn't sign extend arguments of smaller types: + // std::printf("%lld", -42); // prints "4294967254" + // but we don't have to do the same because it's a UB. + arg_.long_long_value = static_cast<fmt::LongLong>(value); } else { arg_.type = Arg::ULONG_LONG; arg_.ulong_long_value = @@ -340,6 +362,21 @@ class CharConverter : public fmt::internal::ArgVisitor<CharConverter, void> { arg_.int_value = static_cast<char>(value); } }; + +// Write the content of w to os. +void write(std::ostream &os, fmt::Writer &w) { + const char *data = w.data(); + typedef internal::MakeUnsigned<std::streamsize>::Type UnsignedStreamSize; + UnsignedStreamSize size = w.size(); + UnsignedStreamSize max_size = + internal::to_unsigned((std::numeric_limits<std::streamsize>::max)()); + do { + UnsignedStreamSize n = size <= max_size ? size : max_size; + os.write(data, static_cast<std::streamsize>(n)); + data += n; + size -= n; + } while (size != 0); +} } // namespace namespace internal { @@ -551,27 +588,25 @@ FMT_FUNC void fmt::WindowsError::init( FMT_FUNC void fmt::internal::format_windows_error( fmt::Writer &out, int error_code, fmt::StringRef message) FMT_NOEXCEPT { - class String { - private: - LPWSTR str_; - - public: - String() : str_() {} - ~String() { LocalFree(str_); } - LPWSTR *ptr() { return &str_; } - LPCWSTR c_str() const { return str_; } - }; FMT_TRY { - String system_message; - if (FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 0, - error_code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - reinterpret_cast<LPWSTR>(system_message.ptr()), 0, 0)) { - UTF16ToUTF8 utf8_message; - if (utf8_message.convert(system_message.c_str()) == ERROR_SUCCESS) { - out << message << ": " << utf8_message; - return; + MemoryBuffer<wchar_t, INLINE_BUFFER_SIZE> buffer; + buffer.resize(INLINE_BUFFER_SIZE); + for (;;) { + wchar_t *system_message = &buffer[0]; + int result = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + 0, error_code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + system_message, static_cast<uint32_t>(buffer.size()), 0); + if (result != 0) { + UTF16ToUTF8 utf8_message; + if (utf8_message.convert(system_message) == ERROR_SUCCESS) { + out << message << ": " << utf8_message; + return; + } + break; } + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) + break; // Can't get error message, report error code instead. + buffer.resize(buffer.size() * 2); } } FMT_CATCH(...) {} fmt::format_error_code(out, error_code, message); // 'fmt::' is for bcc32. @@ -616,7 +651,7 @@ void fmt::internal::ArgMap<Char>::init(const ArgList &args) { return; case internal::Arg::NAMED_ARG: named_arg = static_cast<const NamedArg*>(args.values_[i].pointer); - map_.insert(Pair(named_arg->name, *named_arg)); + map_.push_back(Pair(named_arg->name, *named_arg)); break; default: /*nothing*/; @@ -628,7 +663,7 @@ void fmt::internal::ArgMap<Char>::init(const ArgList &args) { internal::Arg::Type arg_type = args.type(i); if (arg_type == internal::Arg::NAMED_ARG) { named_arg = static_cast<const NamedArg*>(args.args_[i].pointer); - map_.insert(Pair(named_arg->name, *named_arg)); + map_.push_back(Pair(named_arg->name, *named_arg)); } } for (unsigned i = ArgList::MAX_PACKED_ARGS;/*nothing*/; ++i) { @@ -637,7 +672,7 @@ void fmt::internal::ArgMap<Char>::init(const ArgList &args) { return; case internal::Arg::NAMED_ARG: named_arg = static_cast<const NamedArg*>(args.args_[i].pointer); - map_.insert(Pair(named_arg->name, *named_arg)); + map_.push_back(Pair(named_arg->name, *named_arg)); break; default: /*nothing*/; @@ -659,6 +694,7 @@ FMT_FUNC Arg fmt::internal::FormatterBase::do_get_arg( break; case Arg::NAMED_ARG: arg = *static_cast<const internal::Arg*>(arg.pointer); + break; default: /*nothing*/; } @@ -763,7 +799,7 @@ void fmt::internal::PrintfFormatter<Char>::format( if (*s == '.') { ++s; if ('0' <= *s && *s <= '9') { - spec.precision_ = parse_nonnegative_int(s); + spec.precision_ = static_cast<int>(parse_nonnegative_int(s)); } else if (*s == '*') { ++s; spec.precision_ = PrecisionHandler().visit(get_arg(s)); @@ -772,7 +808,7 @@ void fmt::internal::PrintfFormatter<Char>::format( Arg arg = get_arg(s, arg_index); if (spec.flag(HASH_FLAG) && IsZeroInt().visit(arg)) - spec.flags_ &= ~HASH_FLAG; + spec.flags_ &= ~to_unsigned<int>(HASH_FLAG); if (spec.fill_ == '0') { if (arg.type <= Arg::LAST_NUMERIC_TYPE) spec.align_ = ALIGN_NUMERIC; @@ -809,7 +845,7 @@ void fmt::internal::PrintfFormatter<Char>::format( break; default: --s; - ArgConverter<int>(arg, *s).visit(arg); + ArgConverter<void>(arg, *s).visit(arg); } // Parse type. @@ -861,10 +897,11 @@ FMT_FUNC void fmt::print(CStringRef format_str, ArgList args) { print(stdout, format_str, args); } -FMT_FUNC void fmt::print(std::ostream &os, CStringRef format_str, ArgList args) { +FMT_FUNC void fmt::print(std::ostream &os, CStringRef format_str, + ArgList args) { MemoryWriter w; w.write(format_str, args); - os.write(w.data(), w.size()); + write(os, w); } FMT_FUNC void fmt::print_colored(Color c, CStringRef format, ArgList args) { @@ -882,6 +919,13 @@ FMT_FUNC int fmt::fprintf(std::FILE *f, CStringRef format, ArgList args) { return std::fwrite(w.data(), 1, size, f) < size ? -1 : static_cast<int>(size); } +FMT_FUNC int fmt::fprintf(std::ostream &os, CStringRef format, ArgList args) { + MemoryWriter w; + printf(w, format, args); + write(os, w); + return static_cast<int>(w.size()); +} + #ifndef FMT_HEADER_ONLY template struct fmt::internal::BasicData<void>; diff --git a/dep/cppformat/format.h b/dep/cppformat/cppformat/format.h index a98a166091b..08bb9b5d9e8 100644 --- a/dep/cppformat/format.h +++ b/dep/cppformat/cppformat/format.h @@ -28,14 +28,6 @@ #ifndef FMT_FORMAT_H_ #define FMT_FORMAT_H_ -#if defined _MSC_VER && _MSC_VER <= 1500 -typedef unsigned int uint32_t; -typedef unsigned long long uint64_t; -typedef long long intmax_t; -#else -#include <stdint.h> -#endif - #include <cassert> #include <cmath> #include <cstdio> @@ -44,7 +36,8 @@ typedef long long intmax_t; #include <memory> #include <stdexcept> #include <string> -#include <map> +#include <vector> +#include <utility> #ifndef FMT_USE_IOSTREAMS # define FMT_USE_IOSTREAMS 1 @@ -64,40 +57,23 @@ typedef long long intmax_t; # include <iterator> #endif -#ifdef _MSC_VER -# include <intrin.h> // _BitScanReverse, _BitScanReverse64 - -namespace fmt { -namespace internal { -# pragma intrinsic(_BitScanReverse) -inline uint32_t clz(uint32_t x) { - unsigned long r = 0; - _BitScanReverse(&r, x); - return 31 - r; -} -# define FMT_BUILTIN_CLZ(n) fmt::internal::clz(n) - -# ifdef _WIN64 -# pragma intrinsic(_BitScanReverse64) -# endif - -inline uint32_t clzll(uint64_t x) { - unsigned long r = 0; -# ifdef _WIN64 - _BitScanReverse64(&r, x); -# else - // Scan the high 32 bits. - if (_BitScanReverse(&r, static_cast<uint32_t>(x >> 32))) - return 63 - (r + 32); +#if defined(_MSC_VER) && _MSC_VER <= 1500 +typedef unsigned __int32 uint32_t; +typedef unsigned __int64 uint64_t; +typedef __int64 intmax_t; +#else +#include <stdint.h> +#endif - // Scan the low 32 bits. - _BitScanReverse(&r, static_cast<uint32_t>(x)); +#if !defined(FMT_HEADER_ONLY) && defined(_WIN32) +# ifdef FMT_EXPORT +# define FMT_API __declspec(dllexport) +# elif defined(FMT_SHARED) +# define FMT_API __declspec(dllimport) # endif - return 63 - r; -} -# define FMT_BUILTIN_CLZLL(n) fmt::internal::clzll(n) -} -} +#endif +#ifndef FMT_API +# define FMT_API #endif #ifdef __GNUC__ @@ -174,21 +150,6 @@ inline uint32_t clzll(uint64_t x) { # include <utility> // for std::move #endif -// Define FMT_USE_NOEXCEPT to make C++ Format use noexcept (C++11 feature). -#ifndef FMT_USE_NOEXCEPT -# define FMT_USE_NOEXCEPT 0 -#endif - -#ifndef FMT_NOEXCEPT -# if FMT_USE_NOEXCEPT || FMT_HAS_FEATURE(cxx_noexcept) || \ - (FMT_GCC_VERSION >= 408 && FMT_HAS_GXX_CXX11) || \ - _MSC_VER >= 1900 -# define FMT_NOEXCEPT noexcept -# else -# define FMT_NOEXCEPT throw() -# endif -#endif - // Check if exceptions are disabled. #if defined(__GNUC__) && !defined(__EXCEPTIONS) # define FMT_EXCEPTIONS 0 @@ -208,6 +169,25 @@ inline uint32_t clzll(uint64_t x) { # endif #endif +// Define FMT_USE_NOEXCEPT to make C++ Format use noexcept (C++11 feature). +#ifndef FMT_USE_NOEXCEPT +# define FMT_USE_NOEXCEPT 0 +#endif + +#ifndef FMT_NOEXCEPT +# if FMT_EXCEPTIONS +# if FMT_USE_NOEXCEPT || FMT_HAS_FEATURE(cxx_noexcept) || \ + (FMT_GCC_VERSION >= 408 && FMT_HAS_GXX_CXX11) || \ + _MSC_VER >= 1900 +# define FMT_NOEXCEPT noexcept +# else +# define FMT_NOEXCEPT throw() +# endif +# else +# define FMT_NOEXCEPT +# endif +#endif + // A macro to disallow the copy constructor and operator= functions // This should be used in the private: declarations for a class #ifndef FMT_USE_DELETED_FUNCTIONS @@ -241,6 +221,67 @@ inline uint32_t clzll(uint64_t x) { # define FMT_ASSERT(condition, message) assert((condition) && message) #endif + +#if FMT_GCC_VERSION >= 400 || FMT_HAS_BUILTIN(__builtin_clz) +# define FMT_BUILTIN_CLZ(n) __builtin_clz(n) +#endif + +#if FMT_GCC_VERSION >= 400 || FMT_HAS_BUILTIN(__builtin_clzll) +# define FMT_BUILTIN_CLZLL(n) __builtin_clzll(n) +#endif + +// Some compilers masquerade as both MSVC and GCC-likes or +// otherwise support __builtin_clz and __builtin_clzll, so +// only define FMT_BUILTIN_CLZ using the MSVC intrinsics +// if the clz and clzll builtins are not available. +#if defined(_MSC_VER) && !defined(FMT_BUILTIN_CLZLL) +# include <intrin.h> // _BitScanReverse, _BitScanReverse64 + +namespace fmt { +namespace internal { +# pragma intrinsic(_BitScanReverse) +inline uint32_t clz(uint32_t x) { + unsigned long r = 0; + _BitScanReverse(&r, x); + + assert(x != 0); + // Static analysis complains about using uninitialized data + // "r", but the only way that can happen is if "x" is 0, + // which the callers guarantee to not happen. +# pragma warning(suppress: 6102) + return 31 - r; +} +# define FMT_BUILTIN_CLZ(n) fmt::internal::clz(n) + +# ifdef _WIN64 +# pragma intrinsic(_BitScanReverse64) +# endif + +inline uint32_t clzll(uint64_t x) { + unsigned long r = 0; +# ifdef _WIN64 + _BitScanReverse64(&r, x); +# else + // Scan the high 32 bits. + if (_BitScanReverse(&r, static_cast<uint32_t>(x >> 32))) + return 63 - (r + 32); + + // Scan the low 32 bits. + _BitScanReverse(&r, static_cast<uint32_t>(x)); +# endif + + assert(x != 0); + // Static analysis complains about using uninitialized data + // "r", but the only way that can happen is if "x" is 0, + // which the callers guarantee to not happen. +# pragma warning(suppress: 6102) + return 63 - r; +} +# define FMT_BUILTIN_CLZLL(n) fmt::internal::clzll(n) +} +} +#endif + namespace fmt { namespace internal { struct DummyInt { @@ -396,7 +437,7 @@ class BasicStringRef { return std::basic_string<Char>(data_, size_); } - /** Returns the pointer to a C string. */ + /** Returns a pointer to the string data. */ const Char *data() const { return data_; } /** Returns the string size. */ @@ -492,6 +533,29 @@ class FormatError : public std::runtime_error { }; namespace internal { + +// MakeUnsigned<T>::Type gives an unsigned type corresponding to integer type T. +template <typename T> +struct MakeUnsigned { typedef T Type; }; + +#define FMT_SPECIALIZE_MAKE_UNSIGNED(T, U) \ + template <> \ + struct MakeUnsigned<T> { typedef U Type; } + +FMT_SPECIALIZE_MAKE_UNSIGNED(char, unsigned char); +FMT_SPECIALIZE_MAKE_UNSIGNED(signed char, unsigned char); +FMT_SPECIALIZE_MAKE_UNSIGNED(short, unsigned short); +FMT_SPECIALIZE_MAKE_UNSIGNED(int, unsigned); +FMT_SPECIALIZE_MAKE_UNSIGNED(long, unsigned long); +FMT_SPECIALIZE_MAKE_UNSIGNED(LongLong, ULongLong); + +// Casts nonnegative integer to unsigned. +template <typename Int> +inline typename MakeUnsigned<Int>::Type to_unsigned(Int value) { + FMT_ASSERT(value >= 0, "negative value"); + return static_cast<typename MakeUnsigned<Int>::Type>(value); +} + // The number of characters to store in the MemoryBuffer object itself // to avoid dynamic memory allocation. enum { INLINE_BUFFER_SIZE = 500 }; @@ -581,8 +645,7 @@ class Buffer { template <typename T> template <typename U> void Buffer<T>::append(const U *begin, const U *end) { - assert(begin <= end); - std::size_t new_size = size_ + (end - begin); + std::size_t new_size = size_ + internal::to_unsigned(end - begin); if (new_size > capacity_) grow(new_size); std::uninitialized_copy(begin, end, @@ -592,8 +655,8 @@ void Buffer<T>::append(const U *begin, const U *end) { namespace internal { -// A memory buffer for POD types with the first SIZE elements stored in -// the object itself. +// A memory buffer for trivially copyable/constructible types with the first SIZE +// elements stored in the object itself. template <typename T, std::size_t SIZE, typename Allocator = std::allocator<T> > class MemoryBuffer : private Allocator, public Buffer<T> { private: @@ -676,7 +739,7 @@ class FixedBuffer : public fmt::Buffer<Char> { FixedBuffer(Char *array, std::size_t size) : fmt::Buffer<Char>(array, size) {} protected: - void grow(std::size_t size); + FMT_API void grow(std::size_t size); }; template <typename Char> @@ -704,7 +767,7 @@ class CharTraits<char> : public BasicCharTraits<char> { // Formats a floating-point number. template <typename T> - static int format_float(char *buffer, std::size_t size, + FMT_API static int format_float(char *buffer, std::size_t size, const char *format, unsigned width, int precision, T value); }; @@ -715,7 +778,7 @@ class CharTraits<wchar_t> : public BasicCharTraits<wchar_t> { static wchar_t convert(wchar_t value) { return value; } template <typename T> - static int format_float(wchar_t *buffer, std::size_t size, + FMT_API static int format_float(wchar_t *buffer, std::size_t size, const wchar_t *format, unsigned width, int precision, T value); }; @@ -754,27 +817,12 @@ struct IntTraits { TypeSelector<std::numeric_limits<T>::digits <= 32>::Type MainType; }; -// MakeUnsigned<T>::Type gives an unsigned type corresponding to integer type T. -template <typename T> -struct MakeUnsigned { typedef T Type; }; - -#define FMT_SPECIALIZE_MAKE_UNSIGNED(T, U) \ - template <> \ - struct MakeUnsigned<T> { typedef U Type; } - -FMT_SPECIALIZE_MAKE_UNSIGNED(char, unsigned char); -FMT_SPECIALIZE_MAKE_UNSIGNED(signed char, unsigned char); -FMT_SPECIALIZE_MAKE_UNSIGNED(short, unsigned short); -FMT_SPECIALIZE_MAKE_UNSIGNED(int, unsigned); -FMT_SPECIALIZE_MAKE_UNSIGNED(long, unsigned long); -FMT_SPECIALIZE_MAKE_UNSIGNED(LongLong, ULongLong); - -void report_unknown_type(char code, const char *type); +FMT_API void report_unknown_type(char code, const char *type); // Static data is placed in this class template to allow header-only // configuration. template <typename T = void> -struct BasicData { +struct FMT_API BasicData { static const uint32_t POWERS_OF_10_32[]; static const uint64_t POWERS_OF_10_64[]; static const char DIGITS[]; @@ -782,22 +830,14 @@ struct BasicData { typedef BasicData<> Data; -#if FMT_GCC_VERSION >= 400 || FMT_HAS_BUILTIN(__builtin_clz) -# define FMT_BUILTIN_CLZ(n) __builtin_clz(n) -#endif - -#if FMT_GCC_VERSION >= 400 || FMT_HAS_BUILTIN(__builtin_clzll) -# define FMT_BUILTIN_CLZLL(n) __builtin_clzll(n) -#endif - #ifdef FMT_BUILTIN_CLZLL // Returns the number of decimal digits in n. Leading zeros are not counted // except for n == 0 in which case count_digits returns 1. inline unsigned count_digits(uint64_t n) { // Based on http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog10 // and the benchmark https://github.com/localvoid/cxx-benchmark-count-digits. - unsigned t = (64 - FMT_BUILTIN_CLZLL(n | 1)) * 1233 >> 12; - return t - (n < Data::POWERS_OF_10_64[t]) + 1; + int t = (64 - FMT_BUILTIN_CLZLL(n | 1)) * 1233 >> 12; + return to_unsigned(t) - (n < Data::POWERS_OF_10_64[t]) + 1; } #else // Fallback version of count_digits used when __builtin_clz is not available. @@ -820,8 +860,8 @@ inline unsigned count_digits(uint64_t n) { #ifdef FMT_BUILTIN_CLZ // Optional version of count_digits for better performance on 32-bit platforms. inline unsigned count_digits(uint32_t n) { - uint32_t t = (32 - FMT_BUILTIN_CLZ(n | 1)) * 1233 >> 12; - return t - (n < Data::POWERS_OF_10_32[t]) + 1; + int t = (32 - FMT_BUILTIN_CLZ(n | 1)) * 1233 >> 12; + return to_unsigned(t) - (n < Data::POWERS_OF_10_32[t]) + 1; } #endif @@ -863,7 +903,7 @@ class UTF8ToUTF16 { MemoryBuffer<wchar_t, INLINE_BUFFER_SIZE> buffer_; public: - explicit UTF8ToUTF16(StringRef s); + FMT_API explicit UTF8ToUTF16(StringRef s); operator WStringRef() const { return WStringRef(&buffer_[0], size()); } size_t size() const { return buffer_.size() - 1; } const wchar_t *c_str() const { return &buffer_[0]; } @@ -878,7 +918,7 @@ class UTF16ToUTF8 { public: UTF16ToUTF8() {} - explicit UTF16ToUTF8(WStringRef s); + FMT_API explicit UTF16ToUTF8(WStringRef s); operator StringRef() const { return StringRef(&buffer_[0], size()); } size_t size() const { return buffer_.size() - 1; } const char *c_str() const { return &buffer_[0]; } @@ -887,15 +927,15 @@ class UTF16ToUTF8 { // Performs conversion returning a system error code instead of // throwing exception on conversion error. This method may still throw // in case of memory allocation error. - int convert(WStringRef s); + FMT_API int convert(WStringRef s); }; -void format_windows_error(fmt::Writer &out, int error_code, - fmt::StringRef message) FMT_NOEXCEPT; +FMT_API void format_windows_error(fmt::Writer &out, int error_code, + fmt::StringRef message) FMT_NOEXCEPT; #endif -void format_system_error(fmt::Writer &out, int error_code, - fmt::StringRef message) FMT_NOEXCEPT; +FMT_API void format_system_error(fmt::Writer &out, int error_code, + fmt::StringRef message) FMT_NOEXCEPT; // A formatting argument value. struct Value { @@ -938,8 +978,8 @@ struct Value { }; }; -// A formatting argument. It is a POD type to allow storage in -// internal::MemoryBuffer. +// A formatting argument. It is a trivially copyable/constructible type to +// allow storage in internal::MemoryBuffer. struct Arg : Value { Type type; }; @@ -976,6 +1016,7 @@ template <typename T> T &get(); struct DummyStream : std::ostream { + DummyStream(); // Suppress a bogus warning in MSVC. // Hide all operator<< overloads from std::ostream. void operator<<(Null<>); }; @@ -1199,17 +1240,27 @@ class MakeValue : public Arg { static uint64_t type(const NamedArg<Char_> &) { return Arg::NAMED_ARG; } }; +template <typename Formatter> +class MakeArg : public Arg { +public: + MakeArg() { + type = Arg::NONE; + } + + template <typename T> + MakeArg(const T &value) + : Arg(MakeValue<Formatter>(value)) { + type = static_cast<Arg::Type>(MakeValue<Formatter>::type(value)); + } +}; + template <typename Char> struct NamedArg : Arg { BasicStringRef<Char> name; - typedef internal::MakeValue< BasicFormatter<Char> > MakeValue; - template <typename T> NamedArg(BasicStringRef<Char> argname, const T &value) - : Arg(MakeValue(value)), name(argname) { - type = static_cast<Arg::Type>(MakeValue::type(value)); - } + : Arg(MakeArg< BasicFormatter<Char> >(value)), name(argname) {} }; #define FMT_DISPATCH(call) static_cast<Impl*>(this)->call @@ -1631,17 +1682,22 @@ namespace internal { template <typename Char> class ArgMap { private: - typedef std::map<fmt::BasicStringRef<Char>, internal::Arg> MapType; + typedef std::vector<std::pair<fmt::BasicStringRef<Char>, internal::Arg> > MapType; typedef typename MapType::value_type Pair; MapType map_; public: - void init(const ArgList &args); + FMT_API void init(const ArgList &args); const internal::Arg* find(const fmt::BasicStringRef<Char> &name) const { - typename MapType::const_iterator it = map_.find(name); - return it != map_.end() ? &it->second : 0; + // The list is unsorted, so just return the first matching name. + for (typename MapType::const_iterator it = map_.begin(), end = map_.end(); + it != end; ++it) { + if (it->first == name) + return &it->second; + } + return 0; } }; @@ -1767,7 +1823,7 @@ class FormatterBase { int next_arg_index_; // Returns the argument with specified index. - Arg do_get_arg(unsigned arg_index, const char *&error); + FMT_API Arg do_get_arg(unsigned arg_index, const char *&error); protected: const ArgList &args() const { return args_; } @@ -1780,7 +1836,7 @@ class FormatterBase { // Returns the next argument. Arg next_arg(const char *&error) { if (next_arg_index_ >= 0) - return do_get_arg(next_arg_index_++, error); + return do_get_arg(internal::to_unsigned(next_arg_index_++), error); error = "cannot switch from manual to automatic argument indexing"; return Arg(); } @@ -1803,7 +1859,7 @@ class FormatterBase { template <typename Char> void write(BasicWriter<Char> &w, const Char *start, const Char *end) { if (start != end) - w << BasicStringRef<Char>(start, end - start); + w << BasicStringRef<Char>(start, internal::to_unsigned(end - start)); } }; @@ -1823,14 +1879,16 @@ class PrintfFormatter : private FormatterBase { public: explicit PrintfFormatter(const ArgList &args) : FormatterBase(args) {} - void format(BasicWriter<Char> &writer, BasicCStringRef<Char> format_str); + FMT_API void format(BasicWriter<Char> &writer, + BasicCStringRef<Char> format_str); }; } // namespace internal -// A formatter. +/** This template formats data and writes the output to a writer. */ template <typename CharType> class BasicFormatter : private internal::FormatterBase { public: + /** The character type for the output. */ typedef CharType Char; private: @@ -1852,13 +1910,23 @@ class BasicFormatter : private internal::FormatterBase { internal::Arg parse_arg_name(const Char *&s); public: + /** + \rst + Constructs a ``BasicFormatter`` object. References to the arguments and + the writer are stored in the formatter object so make sure they have + appropriate lifetimes. + \endrst + */ BasicFormatter(const ArgList &args, BasicWriter<Char> &w) : internal::FormatterBase(args), writer_(w) {} + /** Returns a reference to the writer associated with this formatter. */ BasicWriter<Char> &writer() { return writer_; } + /** Formats stored arguments and writes the output to the writer. */ void format(BasicCStringRef<Char> format_str); + // Formats a single argument and advances format_str, a format string pointer. const Char *format(const Char *&format_str, const internal::Arg &arg); }; @@ -1889,16 +1957,29 @@ inline uint64_t make_type(const T &arg) { return MakeValue< BasicFormatter<char> >::type(arg); } +template <unsigned N, bool/*IsPacked*/= (N < ArgList::MAX_PACKED_ARGS)> +struct ArgArray; + +template <unsigned N> +struct ArgArray<N, true/*IsPacked*/> { + typedef Value Type[N > 0 ? N : 1]; + + template <typename Formatter, typename T> + static Value make(const T &value) { + Value result = MakeValue<Formatter>(value); + // Workaround a bug in Apple LLVM version 4.2 (clang-425.0.28) of clang: + // https://github.com/cppformat/cppformat/issues/276 + (void)result.custom.format; + return result; + } +}; + template <unsigned N> -struct ArgArray { - // Computes the argument array size by adding 1 to N, which is the number of - // arguments, if N is zero, because array of zero size is invalid, or if N - // is greater than ArgList::MAX_PACKED_ARGS to accommodate for an extra - // argument that marks the end of the list. - enum { SIZE = N + (N == 0 || N >= ArgList::MAX_PACKED_ARGS ? 1 : 0) }; - - typedef typename Conditional< - (N < ArgList::MAX_PACKED_ARGS), Value, Arg>::type Type[SIZE]; +struct ArgArray<N, false/*IsPacked*/> { + typedef Arg Type[N + 1]; // +1 for the list end Arg::NONE + + template <typename Formatter, typename T> + static Arg make(const T &value) { return MakeArg<Formatter>(value); } }; #if FMT_USE_VARIADIC_TEMPLATES @@ -1907,47 +1988,6 @@ inline uint64_t make_type(const Arg &first, const Args & ... tail) { return make_type(first) | (make_type(tail...) << 4); } -inline void do_set_types(Arg *) {} - -template <typename T, typename... Args> -inline void do_set_types(Arg *args, const T &arg, const Args & ... tail) { - args->type = static_cast<Arg::Type>( - MakeValue< BasicFormatter<char> >::type(arg)); - do_set_types(args + 1, tail...); -} - -template <typename... Args> -inline void set_types(Arg *array, const Args & ... args) { - if (check(sizeof...(Args) > ArgList::MAX_PACKED_ARGS)) - do_set_types(array, args...); - array[sizeof...(Args)].type = Arg::NONE; -} - -template <typename... Args> -inline void set_types(Value *, const Args & ...) { - // Do nothing as types are passed separately from values. -} - -template <typename Formatter, typename Value> -inline void store_args(Value *) {} - -template <typename Formatter, typename Arg, typename T, typename... Args> -inline void store_args(Arg *args, const T &arg, const Args & ... tail) { - // Assign only the Value subobject of Arg and don't overwrite type (if any) - // that is assigned by set_types. - Value &value = *args; - value = MakeValue<Formatter>(arg); - store_args<Formatter>(args + 1, tail...); -} - -template <typename Formatter, typename... Args> -ArgList make_arg_list(typename ArgArray<sizeof...(Args)>::Type array, - const Args & ... args) { - if (check(sizeof...(Args) >= ArgList::MAX_PACKED_ARGS)) - set_types(array, args...); - store_args<Formatter>(array, args...); - return ArgList(make_type(args...), array); -} #else struct ArgType { @@ -1985,7 +2025,7 @@ class FormatBuf : public std::basic_streambuf<Char> { int_type overflow(int_type ch = traits_type::eof()) { if (!traits_type::eq_int_type(ch, traits_type::eof())) { - size_t size = this->pptr() - start_; + size_t size = this->size(); buffer_.resize(size); buffer_.reserve(size * 2); @@ -1997,7 +2037,7 @@ class FormatBuf : public std::basic_streambuf<Char> { } size_t size() const { - return this->pptr() - start_; + return to_unsigned(this->pptr() - start_); } }; } // namespace internal @@ -2015,18 +2055,20 @@ class FormatBuf : public std::basic_streambuf<Char> { # define FMT_VARIADIC_VOID(func, arg_type) \ template <typename... Args> \ void func(arg_type arg0, const Args & ... args) { \ - typename fmt::internal::ArgArray<sizeof...(Args)>::Type array; \ - func(arg0, fmt::internal::make_arg_list< \ - fmt::BasicFormatter<Char> >(array, args...)); \ + typedef fmt::internal::ArgArray<sizeof...(Args)> ArgArray; \ + typename ArgArray::Type array{ \ + ArgArray::template make<fmt::BasicFormatter<Char> >(args)...}; \ + func(arg0, fmt::ArgList(fmt::internal::make_type(args...), array)); \ } // Defines a variadic constructor. # define FMT_VARIADIC_CTOR(ctor, func, arg0_type, arg1_type) \ template <typename... Args> \ ctor(arg0_type arg0, arg1_type arg1, const Args & ... args) { \ - typename fmt::internal::ArgArray<sizeof...(Args)>::Type array; \ - func(arg0, arg1, fmt::internal::make_arg_list< \ - fmt::BasicFormatter<Char> >(array, args...)); \ + typedef fmt::internal::ArgArray<sizeof...(Args)> ArgArray; \ + typename ArgArray::Type array{ \ + ArgArray::template make<fmt::BasicFormatter<Char> >(args)...}; \ + func(arg0, arg1, fmt::ArgList(fmt::internal::make_type(args...), array)); \ } #else @@ -2207,7 +2249,8 @@ class BasicWriter { // Writes a decimal integer. template <typename Int> void write_decimal(Int value) { - typename internal::IntTraits<Int>::MainType abs_value = value; + typedef typename internal::IntTraits<Int>::MainType MainType; + MainType abs_value = static_cast<MainType>(value); if (internal::is_negative(value)) { abs_value = 0 - abs_value; *write_unsigned_decimal(abs_value, 1) = '-'; @@ -2474,9 +2517,9 @@ void BasicWriter<Char>::write_str( return; } } - std::size_t precision = spec.precision_; + std::size_t precision = static_cast<std::size_t>(spec.precision_); if (spec.precision_ >= 0 && precision < str_size) - str_size = spec.precision_; + str_size = precision; write_str(str_value, str_size, spec); } @@ -2510,7 +2553,8 @@ typename BasicWriter<Char>::CharPtr // is specified. if (prefix_size > 0 && prefix[prefix_size - 1] == '0') --prefix_size; - unsigned number_size = prefix_size + spec.precision(); + unsigned number_size = + prefix_size + internal::to_unsigned(spec.precision()); AlignSpec subspec(number_size, '0', ALIGN_NUMERIC); if (number_size >= width) return prepare_int_buffer(num_digits, subspec, prefix, prefix_size); @@ -2564,7 +2608,7 @@ template <typename T, typename Spec> void BasicWriter<Char>::write_int(T value, Spec spec) { unsigned prefix_size = 0; typedef typename internal::IntTraits<T>::MainType UnsignedType; - UnsignedType abs_value = value; + UnsignedType abs_value = static_cast<UnsignedType>(value); char prefix[4] = ""; if (internal::is_negative(value)) { prefix[0] = '-'; @@ -2643,8 +2687,7 @@ void BasicWriter<Char>::write_int(T value, Spec spec) { template <typename Char> template <typename T> -void BasicWriter<Char>::write_double( - T value, const FormatSpec &spec) { +void BasicWriter<Char>::write_double(T value, const FormatSpec &spec) { // Check type. char type = spec.type(); bool upper = false; @@ -2744,6 +2787,8 @@ void BasicWriter<Char>::write_double( // Format using snprintf. Char fill = internal::CharTraits<Char>::cast(spec.fill()); + unsigned n = 0; + Char *start = 0; for (;;) { std::size_t buffer_size = buffer_.capacity() - offset; #ifdef _MSC_VER @@ -2755,41 +2800,44 @@ void BasicWriter<Char>::write_double( buffer_size = buffer_.capacity() - offset; } #endif - Char *start = &buffer_[offset]; - int n = internal::CharTraits<Char>::format_float( + start = &buffer_[offset]; + int result = internal::CharTraits<Char>::format_float( start, buffer_size, format, width_for_sprintf, spec.precision(), value); - if (n >= 0 && offset + n < buffer_.capacity()) { - if (sign) { - if ((spec.align() != ALIGN_RIGHT && spec.align() != ALIGN_DEFAULT) || - *start != ' ') { - *(start - 1) = sign; - sign = 0; - } else { - *(start - 1) = fill; - } - ++n; - } - if (spec.align() == ALIGN_CENTER && - spec.width() > static_cast<unsigned>(n)) { - width = spec.width(); - CharPtr p = grow_buffer(width); - std::memmove(get(p) + (width - n) / 2, get(p), n * sizeof(Char)); - fill_padding(p, spec.width(), n, fill); - return; - } - if (spec.fill() != ' ' || sign) { - while (*start == ' ') - *start++ = fill; - if (sign) - *(start - 1) = sign; - } - grow_buffer(n); - return; + if (result >= 0) { + n = internal::to_unsigned(result); + if (offset + n < buffer_.capacity()) + break; // The buffer is large enough - continue with formatting. + buffer_.reserve(offset + n + 1); + } else { + // If result is negative we ask to increase the capacity by at least 1, + // but as std::vector, the buffer grows exponentially. + buffer_.reserve(buffer_.capacity() + 1); } - // If n is negative we ask to increase the capacity by at least 1, - // but as std::vector, the buffer grows exponentially. - buffer_.reserve(n >= 0 ? offset + n + 1 : buffer_.capacity() + 1); } + if (sign) { + if ((spec.align() != ALIGN_RIGHT && spec.align() != ALIGN_DEFAULT) || + *start != ' ') { + *(start - 1) = sign; + sign = 0; + } else { + *(start - 1) = fill; + } + ++n; + } + if (spec.align() == ALIGN_CENTER && spec.width() > n) { + width = spec.width(); + CharPtr p = grow_buffer(width); + std::memmove(get(p) + (width - n) / 2, get(p), n * sizeof(Char)); + fill_padding(p, spec.width(), n, fill); + return; + } + if (spec.fill() != ' ' || sign) { + while (*start == ' ') + *start++ = fill; + if (sign) + *(start - 1) = sign; + } + grow_buffer(n); } /** @@ -2920,22 +2968,21 @@ void format(BasicFormatter<Char> &f, const Char *&format_str, const T &value) { output << value; BasicStringRef<Char> str(&buffer[0], format_buf.size()); - typedef internal::MakeValue< BasicFormatter<Char> > MakeValue; - internal::Arg arg = MakeValue(str); - arg.type = static_cast<internal::Arg::Type>(MakeValue::type(str)); - format_str = f.format(format_str, arg); + typedef internal::MakeArg< BasicFormatter<Char> > MakeArg; + format_str = f.format(format_str, MakeArg(str)); } // Reports a system error without throwing an exception. // Can be used to report errors from destructors. -void report_system_error(int error_code, StringRef message) FMT_NOEXCEPT; +FMT_API void report_system_error(int error_code, + StringRef message) FMT_NOEXCEPT; #if FMT_USE_WINDOWS_H /** A Windows error. */ class WindowsError : public SystemError { private: - void init(int error_code, CStringRef format_str, ArgList args); + FMT_API void init(int error_code, CStringRef format_str, ArgList args); public: /** @@ -2974,7 +3021,8 @@ class WindowsError : public SystemError { // Reports a Windows error without throwing an exception. // Can be used to report errors from destructors. -void report_windows_error(int error_code, StringRef message) FMT_NOEXCEPT; +FMT_API void report_windows_error(int error_code, + StringRef message) FMT_NOEXCEPT; #endif @@ -2986,7 +3034,7 @@ enum Color { BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE }; Example: print_colored(fmt::RED, "Elapsed time: {0:.2f} seconds", 1.23); */ -void print_colored(Color c, CStringRef format, ArgList args); +FMT_API void print_colored(Color c, CStringRef format, ArgList args); /** \rst @@ -3018,7 +3066,7 @@ inline std::wstring format(WCStringRef format_str, ArgList args) { print(stderr, "Don't {}!", "panic"); \endrst */ -void print(std::FILE *f, CStringRef format_str, ArgList args); +FMT_API void print(std::FILE *f, CStringRef format_str, ArgList args); /** \rst @@ -3029,7 +3077,7 @@ void print(std::FILE *f, CStringRef format_str, ArgList args); print("Elapsed time: {0:.2f} seconds", 1.23); \endrst */ -void print(CStringRef format_str, ArgList args); +FMT_API void print(CStringRef format_str, ArgList args); template <typename Char> void printf(BasicWriter<Char> &w, BasicCStringRef<Char> format, ArgList args) { @@ -3066,7 +3114,7 @@ inline std::wstring sprintf(WCStringRef format, ArgList args) { fmt::fprintf(stderr, "Don't %s!", "panic"); \endrst */ -int fprintf(std::FILE *f, CStringRef format, ArgList args); +FMT_API int fprintf(std::FILE *f, CStringRef format, ArgList args); /** \rst @@ -3132,10 +3180,10 @@ class FormatInt { explicit FormatInt(unsigned long value) : str_(format_decimal(value)) {} explicit FormatInt(ULongLong value) : str_(format_decimal(value)) {} - /** - Returns the number of characters written to the output buffer. - */ - std::size_t size() const { return buffer_ - str_ + BUFFER_SIZE - 1; } + /** Returns the number of characters written to the output buffer. */ + std::size_t size() const { + return internal::to_unsigned(buffer_ - str_ + BUFFER_SIZE - 1); + } /** Returns a pointer to the output buffer content. No terminating null @@ -3165,7 +3213,8 @@ class FormatInt { // write a terminating null character. template <typename T> inline void format_decimal(char *&buffer, T value) { - typename internal::IntTraits<T>::MainType abs_value = value; + typedef typename internal::IntTraits<T>::MainType MainType; + MainType abs_value = static_cast<MainType>(value); if (internal::is_negative(value)) { *buffer++ = '-'; abs_value = 0 - abs_value; @@ -3245,10 +3294,11 @@ void arg(WStringRef, const internal::NamedArg<Char>&) FMT_DELETED_OR_UNDEFINED; template <typename... Args> \ ReturnType func(FMT_FOR_EACH(FMT_ADD_ARG_NAME, __VA_ARGS__), \ const Args & ... args) { \ - typename fmt::internal::ArgArray<sizeof...(Args)>::Type array; \ + typedef fmt::internal::ArgArray<sizeof...(Args)> ArgArray; \ + typename ArgArray::Type array{ \ + ArgArray::template make<fmt::BasicFormatter<Char> >(args)...}; \ call(FMT_FOR_EACH(FMT_GET_ARG_NAME, __VA_ARGS__), \ - fmt::internal::make_arg_list< \ - fmt::BasicFormatter<Char> >(array, args...)); \ + fmt::ArgList(fmt::internal::make_type(args...), array)); \ } #else // Defines a wrapper for a function taking __VA_ARGS__ arguments @@ -3361,8 +3411,20 @@ FMT_VARIADIC(int, fprintf, std::FILE *, CStringRef) print(cerr, "Don't {}!", "panic"); \endrst */ -void print(std::ostream &os, CStringRef format_str, ArgList args); +FMT_API void print(std::ostream &os, CStringRef format_str, ArgList args); FMT_VARIADIC(void, print, std::ostream &, CStringRef) + +/** + \rst + Prints formatted data to the stream *os*. + + **Example**:: + + fprintf(cerr, "Don't %s!", "panic"); + \endrst + */ +FMT_API int fprintf(std::ostream &os, CStringRef format_str, ArgList args); +FMT_VARIADIC(int, fprintf, std::ostream &, CStringRef) #endif namespace internal { @@ -3374,7 +3436,7 @@ inline bool is_name_start(Char c) { // Parses an unsigned integer advancing s to the end of the parsed input. // This function assumes that the first character of s is a digit. template <typename Char> -int parse_nonnegative_int(const Char *&s) { +unsigned parse_nonnegative_int(const Char *&s) { assert('0' <= *s && *s <= '9'); unsigned value = 0; do { @@ -3453,7 +3515,6 @@ inline internal::Arg BasicFormatter<Char>::parse_arg_name(const Char *&s) { return arg; } -// Should be after FormatSpec template <typename Char> const Char *BasicFormatter<Char>::format( const Char *&format_str, const internal::Arg &arg) { diff --git a/dep/cppformat/posix.cc b/dep/cppformat/cppformat/posix.cc index 756281a0ebd..c6c2ae2c413 100644 --- a/dep/cppformat/posix.cc +++ b/dep/cppformat/cppformat/posix.cc @@ -173,7 +173,7 @@ std::size_t fmt::File::read(void *buffer, std::size_t count) { FMT_RETRY(result, FMT_POSIX_CALL(read(fd_, buffer, convert_rwcount(count)))); if (result < 0) throw SystemError(errno, "cannot read from file"); - return result; + return internal::to_unsigned(result); } std::size_t fmt::File::write(const void *buffer, std::size_t count) { @@ -181,7 +181,7 @@ std::size_t fmt::File::write(const void *buffer, std::size_t count) { FMT_RETRY(result, FMT_POSIX_CALL(write(fd_, buffer, convert_rwcount(count)))); if (result < 0) throw SystemError(errno, "cannot write to file"); - return result; + return internal::to_unsigned(result); } fmt::File fmt::File::dup(int fd) { diff --git a/dep/cppformat/posix.h b/dep/cppformat/cppformat/posix.h index 88bcb4f557b..bfbd3851838 100644 --- a/dep/cppformat/posix.h +++ b/dep/cppformat/cppformat/posix.h @@ -34,11 +34,17 @@ #endif #include <errno.h> -#include <fcntl.h> // for O_RDONLY +#include <fcntl.h> // for O_RDONLY +#include <locale.h> // for locale_t #include <stdio.h> +#include <stdlib.h> // for strtod_l #include <cstddef> +#ifdef __APPLE__ +# include <xlocale.h> // for LC_NUMERIC_MASK on OS X +#endif + #include "format.h" #ifndef FMT_POSIX @@ -299,7 +305,8 @@ class File { // Closes the file. void close(); - // Returns the file size. + // Returns the file size. The size has signed type for consistency with + // stat::st_size. LongLong size() const; // Attempts to read count bytes from the file into the specified buffer. @@ -331,6 +338,58 @@ class File { // Returns the memory page size. long getpagesize(); + +#if defined(LC_NUMERIC_MASK) || defined(_MSC_VER) +# define FMT_LOCALE +#endif + +#ifdef FMT_LOCALE +// A "C" numeric locale. +class Locale { + private: +# ifdef _MSC_VER + typedef _locale_t locale_t; + + enum { LC_NUMERIC_MASK = LC_NUMERIC }; + + static locale_t newlocale(int category_mask, const char *locale, locale_t) { + return _create_locale(category_mask, locale); + } + + static void freelocale(locale_t locale) { + _free_locale(locale); + } + + static double strtod_l(const char *nptr, char **endptr, _locale_t locale) { + return _strtod_l(nptr, endptr, locale); + } +# endif + + locale_t locale_; + + FMT_DISALLOW_COPY_AND_ASSIGN(Locale); + + public: + typedef locale_t Type; + + Locale() : locale_(newlocale(LC_NUMERIC_MASK, "C", NULL)) { + if (!locale_) + throw fmt::SystemError(errno, "cannot create locale"); + } + ~Locale() { freelocale(locale_); } + + Type get() const { return locale_; } + + // Converts string to floating-point number and advances str past the end + // of the parsed input. + double strtod(const char *&str) const { + char *end = 0; + double result = strtod_l(str, &end, locale_); + str = end; + return result; + } +}; +#endif // FMT_LOCALE } // namespace fmt #if !FMT_USE_RVALUE_REFERENCES diff --git a/revision_data.h.in.cmake b/revision_data.h.in.cmake index 64c754c700b..9273bbb53d6 100644 --- a/revision_data.h.in.cmake +++ b/revision_data.h.in.cmake @@ -3,8 +3,10 @@ #define _HASH "@rev_hash@" #define _DATE "@rev_date@" #define _BRANCH "@rev_branch@" - #define _SOURCE_DIRECTORY "@CMAKE_SOURCE_DIR@" - #define _MYSQL_EXECUTABLE "@MYSQL_EXECUTABLE@" + #define _CMAKE_COMMAND "@CMAKE_COMMAND@" + #define _SOURCE_DIRECTORY R"(@CMAKE_SOURCE_DIR@)" + #define _BUILD_DIRECTORY R"(@BUILDDIR@)" + #define _MYSQL_EXECUTABLE R"(@MYSQL_EXECUTABLE@)" #define _FULL_DATABASE "TDB_full_world_335.60_2015_11_07.sql" #define VER_COMPANYNAME_STR "TrinityCore Developers" #define VER_LEGALCOPYRIGHT_STR "(c)2008-2016 TrinityCore" @@ -12,6 +14,4 @@ #define VER_FILEVERSION_STR "@rev_hash@ @rev_date@ (@rev_branch@ branch)" #define VER_PRODUCTVERSION VER_FILEVERSION #define VER_PRODUCTVERSION_STR VER_FILEVERSION_STR - #define COMPILER_C_FLAGS "@CMAKE_C_FLAGS@" - #define COMPILER_CXX_FLAGS "@CMAKE_CXX_FLAGS@" #endif // __REVISION_DATA_H__ diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql index 02061aaf976..94841144017 100644 --- a/sql/base/characters_database.sql +++ b/sql/base/characters_database.sql @@ -1272,8 +1272,13 @@ CREATE TABLE `characters` ( `level` tinyint(3) unsigned NOT NULL DEFAULT '0', `xp` int(10) unsigned NOT NULL DEFAULT '0', `money` int(10) unsigned NOT NULL DEFAULT '0', - `playerBytes` int(10) unsigned NOT NULL DEFAULT '0', - `playerBytes2` int(10) unsigned NOT NULL DEFAULT '0', + `skin` tinyint(3) unsigned NOT NULL DEFAULT '0', + `face` tinyint(3) unsigned NOT NULL DEFAULT '0', + `hairStyle` tinyint(3) unsigned NOT NULL DEFAULT '0', + `hairColor` tinyint(3) unsigned NOT NULL DEFAULT '0', + `facialStyle` tinyint(3) unsigned NOT NULL DEFAULT '0', + `bankSlots` tinyint(3) unsigned NOT NULL DEFAULT '0', + `restState` tinyint(3) unsigned NOT NULL DEFAULT '0', `playerFlags` int(10) unsigned NOT NULL DEFAULT '0', `position_x` float NOT NULL DEFAULT '0', `position_y` float NOT NULL DEFAULT '0', @@ -2540,7 +2545,7 @@ CREATE TABLE `updates` ( LOCK TABLES `updates` WRITE; /*!40000 ALTER TABLE `updates` DISABLE KEYS */; -INSERT INTO `updates` VALUES ('2015_03_20_00_characters.sql','B761760804EA73BD297F296C5C1919687DF7191C','ARCHIVED','2015-03-21 21:44:15',0),('2015_03_20_01_characters.sql','894F08B70449A5481FFAF394EE5571D7FC4D8A3A','ARCHIVED','2015-03-21 21:44:15',0),('2015_03_20_02_characters.sql','97D7BE0CAADC79F3F11B9FD296B8C6CD40FE593B','ARCHIVED','2015-03-21 21:44:51',0),('2015_06_26_00_characters_335.sql','C2CC6E50AFA1ACCBEBF77CC519AAEB09F3BBAEBC','ARCHIVED','2015-07-13 23:49:22',0),('2015_09_28_00_characters_335.sql','F8682A431D50E54BDC4AC0E7DBED21AE8AAB6AD4','ARCHIVED','2015-09-28 21:00:00',0),('2015_08_26_00_characters_335.sql','C7D6A3A00FECA3EBFF1E71744CA40D3076582374','ARCHIVED','2015-08-26 21:00:00',0),('2015_10_06_00_characters.sql','16842FDD7E8547F2260D3312F53EFF8761EFAB35','ARCHIVED','2015-10-06 16:06:38',0),('2015_10_07_00_characters.sql','E15AB463CEBE321001D7BFDEA4B662FF618728FD','ARCHIVED','2015-10-07 23:32:00',0),('2015_10_12_00_characters.sql','D6F9927BDED72AD0A81D6EC2C6500CBC34A39FA2','ARCHIVED','2015-10-12 15:35:47',0),('2015_10_28_00_characters.sql','622A9CA8FCE690429EBE23BA071A37C7A007BF8B','ARCHIVED','2015-10-19 14:32:22',0),('2015_10_29_00_characters_335.sql','4555A7F35C107E54C13D74D20F141039ED42943E','ARCHIVED','2015-10-29 17:05:43',0),('2015_11_03_00_characters.sql','CC045717B8FDD9733351E52A5302560CD08AAD57','ARCHIVED','2015-10-12 15:23:33',0),('2015_11_07_00_characters.sql','BAF9F6B8F97A30D04BDBBA8127A62A1720F9B904','RELEASED','2015-11-07 15:40:47',0),('2016_02_10_00_characters.sql','F1B4DA202819CABC7319A4470A2D224A34609E97','RELEASED','2016-02-10 00:00:00',0); +INSERT INTO `updates` VALUES ('2015_03_20_00_characters.sql','B761760804EA73BD297F296C5C1919687DF7191C','ARCHIVED','2015-03-21 21:44:15',0),('2015_03_20_01_characters.sql','894F08B70449A5481FFAF394EE5571D7FC4D8A3A','ARCHIVED','2015-03-21 21:44:15',0),('2015_03_20_02_characters.sql','97D7BE0CAADC79F3F11B9FD296B8C6CD40FE593B','ARCHIVED','2015-03-21 21:44:51',0),('2015_06_26_00_characters_335.sql','C2CC6E50AFA1ACCBEBF77CC519AAEB09F3BBAEBC','ARCHIVED','2015-07-13 23:49:22',0),('2015_09_28_00_characters_335.sql','F8682A431D50E54BDC4AC0E7DBED21AE8AAB6AD4','ARCHIVED','2015-09-28 21:00:00',0),('2015_08_26_00_characters_335.sql','C7D6A3A00FECA3EBFF1E71744CA40D3076582374','ARCHIVED','2015-08-26 21:00:00',0),('2015_10_06_00_characters.sql','16842FDD7E8547F2260D3312F53EFF8761EFAB35','ARCHIVED','2015-10-06 16:06:38',0),('2015_10_07_00_characters.sql','E15AB463CEBE321001D7BFDEA4B662FF618728FD','ARCHIVED','2015-10-07 23:32:00',0),('2015_10_12_00_characters.sql','D6F9927BDED72AD0A81D6EC2C6500CBC34A39FA2','ARCHIVED','2015-10-12 15:35:47',0),('2015_10_28_00_characters.sql','622A9CA8FCE690429EBE23BA071A37C7A007BF8B','ARCHIVED','2015-10-19 14:32:22',0),('2015_10_29_00_characters_335.sql','4555A7F35C107E54C13D74D20F141039ED42943E','ARCHIVED','2015-10-29 17:05:43',0),('2015_11_03_00_characters.sql','CC045717B8FDD9733351E52A5302560CD08AAD57','ARCHIVED','2015-10-12 15:23:33',0),('2015_11_07_00_characters.sql','BAF9F6B8F97A30D04BDBBA8127A62A1720F9B904','RELEASED','2015-11-07 15:40:47',0),('2016_02_10_00_characters.sql','F1B4DA202819CABC7319A4470A2D224A34609E97','RELEASED','2016-02-10 00:00:00',0),('2016_03_13_2016_01_05_00_characters.sql','0EAD24977F40DE2476B4567DA2B477867CC0DA1A','RELEASED','2016-03-13 20:03:56',0); /*!40000 ALTER TABLE `updates` ENABLE KEYS */; UNLOCK TABLES; diff --git a/sql/updates/characters/2016_03_13_2016_01_05_00_characters.sql b/sql/updates/characters/2016_03_13_2016_01_05_00_characters.sql new file mode 100644 index 00000000000..11850067be9 --- /dev/null +++ b/sql/updates/characters/2016_03_13_2016_01_05_00_characters.sql @@ -0,0 +1,19 @@ +ALTER TABLE `characters` + ADD `skin` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `money`, + ADD `face` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `skin`, + ADD `hairStyle` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `face`, + ADD `hairColor` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `hairStyle`, + ADD `facialStyle` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `hairColor`, + ADD `bankSlots` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `facialStyle`, + ADD `restState` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `bankSlots`; + +UPDATE `characters` SET + `skin`=`playerBytes`&0xFF, + `face`=(`playerBytes`>>8)&0xFF, + `hairStyle`=(`playerBytes`>>16)&0xFF, + `hairColor`=(`playerBytes`>>24)&0xFF, + `facialStyle`=`playerBytes2`&0xFF, + `bankSlots`=(`playerBytes2`>>16)&0xFF, + `restState`=(`playerBytes2`>>24)&0xFF; + +ALTER TABLE `characters` DROP `playerBytes`, DROP `playerBytes2`; diff --git a/sql/updates/world/2016_02_19_01_world_335.sql b/sql/updates/world/2016_02_19_01_world_335.sql new file mode 100644 index 00000000000..f7fee657170 --- /dev/null +++ b/sql/updates/world/2016_02_19_01_world_335.sql @@ -0,0 +1,8 @@ +-- +DELETE FROM `spell_proc_event` WHERE `entry`= 56841; +INSERT INTO `spell_proc_event` (`entry`, `SchoolMask`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `procFlags`, `procEx`, `ppmRate`, `CustomChance`, `Cooldown`) VALUES +(56841, 0, 9, 0x800, 0x800, 0x800, 0x100, 0, 0, 0, 0); + +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_hun_glyph_of_arcane_shot'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(56841,'spell_hun_glyph_of_arcane_shot'); diff --git a/sql/updates/world/2016_02_22_00_world.sql b/sql/updates/world/2016_02_22_00_world.sql new file mode 100644 index 00000000000..d92ea91681a --- /dev/null +++ b/sql/updates/world/2016_02_22_00_world.sql @@ -0,0 +1,2 @@ +-- baron geddon & ragnaros do pure fire elemental damage with melee attacks +UPDATE `creature_template` SET `dmgschool`=2 WHERE `entry` in (12056,11502); diff --git a/sql/updates/world/2016_02_22_01_world.sql b/sql/updates/world/2016_02_22_01_world.sql new file mode 100644 index 00000000000..b1345bb1aab --- /dev/null +++ b/sql/updates/world/2016_02_22_01_world.sql @@ -0,0 +1,26 @@ +UPDATE`spell_dbc` SET `Effect1`=28, `EffectMiscValueB1`=64 WHERE `Id`IN(38953,38955,38956,38957,38958,38978); +UPDATE `creature_template` SET `AIName`='SmartAI', `ScriptName`='' WHERE `entry` =22355; +DELETE FROM `smart_scripts` WHERE `entryorguid` =22355 AND `source_type`=0; +DELETE FROM `smart_scripts` WHERE `source_type`=9 AND `entryorguid` BETWEEN 2235500 AND 2235505; + +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(22355, 0, 0, 1, 11, 0, 100, 1, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - On Respawn - Disable Combat Movement (No Repeat)'), +(22355, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 18, 2097152, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - On Respawn - Set Flag Disarmed (No Repeat)'), +(22355, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 42, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - On Respawn - Set Invincibility HP'), +(22355, 0, 3, 0, 4, 0, 100, 0, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - On Agro - Store Target List (No Repeat)'), +(22355, 0, 4, 5, 2, 0, 100, 1, 0, 0, 0, 0, 11, 38949, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - On 1% HP - Cast Terokkar Free Webbed Creature (No Repeat)'), +(22355, 0, 5, 6,61, 0, 100, 1, 0, 0, 0, 0, 11, 38950, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - On 1% HP - Cast Terokkar Free Webbed Creature ON QUEST (No Repeat)'), +(22355, 0, 6, 0,61, 0, 100, 1, 0, 0, 0, 0, 87, 2233500, 2233501, 2233502, 2233503, 2233504, 2233505, 1, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - On 1% HP - Run Random Script (No Repeat)'), +(2235500, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 38953, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - Script 1 - Cast Terokkar Free Webbed Creature '), +(2235500, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - Script 1 - Die'), +(2235501, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 38955, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - Script 2 - Cast Terokkar Free Webbed Creature '), +(2235501, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - Script 2 - Die'), +(2235502, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 38956, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - Script 3 - Cast Terokkar Free Webbed Creature '), +(2235502, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - Script 3 - Die'), +(2235503, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 38957, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - Script 4 - Cast Terokkar Free Webbed Creature '), +(2235503, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - Script 4 - Die'), +(2235504, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 38958, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - Script 5 - Cast Terokkar Free Webbed Creature '), +(2235504, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - Script 5 - Die'), +(2235505, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 33, 22459, 2, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - Script 6 - Kill Credit'), +(2235505, 9, 1, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 38978, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - Script 6 - Cast Terokkar Free Webbed Creature '), +(2235505, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Netherweb Victim - Script 6 - Die'); diff --git a/sql/updates/world/2016_02_22_02_world.sql b/sql/updates/world/2016_02_22_02_world.sql new file mode 100644 index 00000000000..dd62e6dce29 --- /dev/null +++ b/sql/updates/world/2016_02_22_02_world.sql @@ -0,0 +1,34 @@ +SET @OGUID := 74901; + +UPDATE `gameobject` SET `spawntimesecs`=120 WHERE `id`=188441; +DELETE FROM `gameobject` WHERE `id`=188441 AND `guid` BETWEEN @OGUID+0 AND @OGUID+28; +INSERT INTO `gameobject` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`) VALUES +(@OGUID+0 , 188441, 571, 1, 1, 4599.037, 285.0833, 95.23787, 0.4188786, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+1 , 188441, 571, 1, 1, 4556.1, 231.2934, 96.77894, 0.4537851, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+2 , 188441, 571, 1, 1, 4499.447, 108.0523, 89.83501, 3.996807, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+3 , 188441, 571, 1, 1, 4481.178, 127.8052, 88.98753, 5.044002, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+4 , 188441, 571, 1, 1, 4518.543, 226.8698, 90.04359, 4.97419, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+5 , 188441, 571, 1, 1, 4476.379, 92.48655, 88.96384, 2.321287, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+6 , 188441, 571, 1, 1, 4599.19, 760.0677, 93.87521, 5.654869, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+7, 188441, 571, 1, 1, 4593.348, 741.4844, 95.79951, 3.735006, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+8, 188441, 571, 1, 1, 4751.073, 453.6788, 126.705, 0.6806767, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+9, 188441, 571, 1, 1, 4682.298, 401.2016, 113.0896, 0.9075702, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+10, 188441, 571, 1, 1, 4751.073, 453.6788, 126.705, 0.6806767, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+11, 188441, 571, 1, 1, 4682.298, 401.2016, 113.0896, 0.9075702, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+12, 188441, 571, 1, 1, 4607.061, 650.2381, 99.33231, 0.3141584, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+13, 188441, 571, 1, 1, 4617.78, 647.2289, 100.198, 6.161013, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+14, 188441, 571, 1, 1, 4603.35, 646.6047, 99.39375, 3.281239, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+15, 188441, 571, 1, 1, 4599.037, 285.0833, 95.23787, 0.4188786, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+16, 188441, 571, 1, 1, 4601.033, 262.5729, 94.59935, 3.595379, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+17, 188441, 571, 1, 1, 4578.877, 274.382, 94.57744, 1.256636, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+18, 188441, 571, 1, 1, 4516.654, 214.9381, 90.17368, 4.76475, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+19, 188441, 571, 1, 1, 4570.082, 246.2316, 90.96891, 4.869471, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+20, 188441, 571, 1, 1, 4553.599, 249.401, 91.1224, 3.857183, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+21, 188441, 571, 1, 1, 4532.682, 221.2274, 92.86555, 5.340709, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+22, 188441, 571, 1, 1, 4481.178, 127.8052, 88.98753, 5.044002, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+23, 188441, 571, 1, 1, 4499.447, 108.0523, 89.83501, 3.996807, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+24, 188441, 571, 1, 1, 4505.154, 59.0905, 86.1317, 5.078908, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+25, 188441, 571, 1, 1, 4458.161, 127.8561, 89.45293, 5.881761, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+26, 188441, 571, 1, 1, 4556.1, 231.2934, 96.77894, 0.4537851, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+27, 188441, 571, 1, 1, 4556.1, 231.2934, 96.77894, 0.4537851, 0, 0, 0, 1, 120, 255, 1), -- 188441 (Area: 65) +(@OGUID+28, 188441, 571, 1, 1, 4583.655, 232.1632, 95.92954, 4.729844, 0, 0, 0, 1, 120, 255, 1); -- 188441 (Area: 65) diff --git a/sql/updates/world/2016_02_23_00_world.sql b/sql/updates/world/2016_02_23_00_world.sql new file mode 100644 index 00000000000..871ce608f1c --- /dev/null +++ b/sql/updates/world/2016_02_23_00_world.sql @@ -0,0 +1 @@ +UPDATE `smart_scripts` SET `action_param1`=2235500, `action_param2`=2235501, `action_param3`=2235502, `action_param4`=2235503, `action_param5`=2235504, `action_param6`=2235505 WHERE `entryorguid`=22355 AND `source_type`=0 AND `id`=6 AND `link`=0; diff --git a/sql/updates/world/2016_02_23_01_world.sql b/sql/updates/world/2016_02_23_01_world.sql new file mode 100644 index 00000000000..0773487dbc7 --- /dev/null +++ b/sql/updates/world/2016_02_23_01_world.sql @@ -0,0 +1,119 @@ +SET @OGUID:=82948; +SET @CGUID:=85532; +SET @Event:=7; + +-- Add missing lunar objects +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+89; +INSERT INTO `gameobject` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`) VALUES +(@OGUID+0 , 180879, 530, 1, 1, -4021.671, -11847.32, 0.006294, 1.902409, 0, 0, 0, 1, 120, 255, 1), -- 180879 (Area: 0) -- exodar +(@OGUID+1 , 180777, 530, 1, 1, -4016.04, -11831.66, 0.122772, 1.605702, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 0) +(@OGUID+2 , 180777, 530, 1, 1, -4019.716, -11831.79, 0.095343, 4.694937, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 0) +(@OGUID+3 , 180880, 530, 1, 1, -4021.575, -11847.88, 1.865077, 3.42085, 0, 0, 0, 1, 120, 255, 1), -- 180880 (Area: 0) +(@OGUID+4 , 180881, 530, 1, 1, -4021.983, -11847.42, 1.806305, 4.799657, 0, 0, 0, 1, 120, 255, 1), -- 180881 (Area: 0) +(@OGUID+5 , 180882, 530, 1, 1, -4021.177, -11847.73, 1.821342, 3.769912, 0, 0, 0, 1, 120, 255, 1), -- 180882 (Area: 0) +(@OGUID+6 , 180883, 530, 1, 1, -4021.107, -11847.26, 1.800923, 5.811947, 0, 0, 0, 1, 120, 255, 1), -- 180883 (Area: 0) +(@OGUID+7 , 180883, 530, 1, 1, -4021.65, -11846.95, 1.829355, 5.445428, 0, 0, 0, 1, 120, 255, 1), -- 180883 (Area: 0) +(@OGUID+8 , 180869, 530, 1, 1, -4023.456, -11837.75, 0.015313, 4.747296, 0, 0, 0, 1, 120, 255, 1), -- 180869 (Area: 0) +(@OGUID+9 , 180869, 530, 1, 1, -4011.058, -11837.71, 0.147322, 4.694937, 0, 0, 0, 1, 120, 255, 1), -- 180869 (Area: 0) +(@OGUID+10, 180766, 530, 1, 1, -4012.713, -11842.4, 0.117445, 0.802851, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 0) +(@OGUID+11, 180766, 530, 1, 1, -4020.125, -11847.21, 0.023653, 4.642576, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 0) +(@OGUID+12, 180766, 530, 1, 1, -4014.778, -11847.44, 0.082153, 1.623156, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 0) +(@OGUID+13, 180766, 530, 1, 1, -4022.487, -11842.52, 0.009148, 5.305802, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 0) +(@OGUID+14, 180766, 530, 1, 1, -4008.917, -11837.83, 0.170679, 1.361356, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 0) +(@OGUID+15, 180766, 530, 1, 1, -4012.804, -11831.57, 0.146643, 2.146753, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 0) +(@OGUID+16, 180766, 530, 1, 1, -4025.327, -11837.02, 0.008528, 4.677484, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 0) +(@OGUID+17, 180766, 530, 1, 1, -4023.502, -11831.39, 0.072735, 4.06662, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 0) +(@OGUID+18, 180878, 530, 1, 1, -4022.725, -11846.54, -0.003436, 4.502952, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 0) +(@OGUID+19, 180878, 530, 1, 1, -4023.054, -11847.33, -0.00903, 3.543024, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 0) +(@OGUID+20, 180878, 530, 1, 1, -4022.056, -11846.02, 0.005262, 2.687807, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 0) +(@OGUID+21, 180878, 530, 1, 1, -4021.267, -11845.9, 0.014263, 5.567601, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 0) +(@OGUID+22, 180878, 530, 1, 1, -4021.343, -11848.85, 0.009881, 4.869471, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 0) +(@OGUID+23, 180878, 530, 1, 1, -4022.729, -11848.02, -0.005639, 2.129301, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 0) +(@OGUID+24, 180878, 530, 1, 1, -4022.064, -11848.56, 0.00076, 5.585054, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 0) +(@OGUID+25, 180766, 1, 1, 1, 10147.02, 2574.3, 1320.719, 1.186823, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 1659) -- darnassus +(@OGUID+26, 180766, 1, 1, 1, 10149.6, 2592.33, 1330.62, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 1659) +(@OGUID+27, 180766, 1, 1, 1, 10154.62, 2593.352, 1330.546, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 1659) +(@OGUID+28, 180766, 1, 1, 1, 10148.55, 2610.374, 1330.823, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 1658) +(@OGUID+29, 180766, 1, 1, 1, 10159.98, 2604.604, 1330.823, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 1658) +(@OGUID+30, 180766, 1, 1, 1, 10141.72, 2600.144, 1330.823, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180766 (Area: 1658) +(@OGUID+31, 180765, 1, 1, 1, 10040.4, 2478.42, 1353.98, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 0) +(@OGUID+32, 180765, 1, 1, 1, 10050.7, 2510.37, 1353.98, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 0) +(@OGUID+33, 180765, 1, 1, 1, 10170.16, 2554.241, 1344.727, 5.846854, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 1659) +(@OGUID+34, 180765, 1, 1, 1, 10088.98, 2580.349, 1341.743, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 1659) +(@OGUID+35, 180765, 1, 1, 1, 10170.96, 2556.492, 1366.235, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 1659) +(@OGUID+36, 180765, 1, 1, 1, 10163.1, 2568.72, 1353.59, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 1659) +(@OGUID+37, 180765, 1, 1, 1, 10156.62, 2582.27, 1345.43, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 1659) +(@OGUID+38, 180765, 1, 1, 1, 10107.72, 2590.667, 1341.86, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 1659) +(@OGUID+39, 180765, 1, 1, 1, 10106.9, 2600.88, 1340.55, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 1659) +(@OGUID+40, 180765, 1, 1, 1, 10080.89, 2586.866, 1340.509, 5.201083, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 1659) +(@OGUID+41, 180765, 1, 1, 1, 10185.6, 2561.11, 1366.71, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 1659) +(@OGUID+42, 180765, 1, 1, 1, 10165.39, 2580.426, 1361.882, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 1659) +(@OGUID+43, 180765, 1, 1, 1, 10162.87, 2569.218, 1366.497, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 1659) +(@OGUID+44, 180765, 1, 1, 1, 10180.73, 2583.701, 1364.723, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 1658) +(@OGUID+45, 180765, 1, 1, 1, 10185.8, 2575.52, 1366.34, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 180765 (Area: 1658) +(@OGUID+46, 180878, 1, 1, 1, 10147.58, 2574.047, 1320.637, 2.129301, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 1659) +(@OGUID+47, 180878, 1, 1, 1, 10145.04, 2573.837, 1321.027, 5.567601, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 1659) +(@OGUID+48, 180878, 1, 1, 1, 10146.93, 2572.094, 1320.741, 3.543024, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 1659) +(@OGUID+49, 180878, 1, 1, 1, 10147.89, 2574.833, 1320.575, 5.585054, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 1659) +(@OGUID+50, 180878, 1, 1, 1, 10145.3, 2572.096, 1320.981, 4.502952, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 1659) +(@OGUID+51, 180878, 1, 1, 1, 10144.76, 2572.774, 1321.074, 2.687807, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 1659) +(@OGUID+52, 180878, 1, 1, 1, 10148.35, 2574.187, 1320.516, 4.869471, 0, 0, 0, 1, 120, 255, 1), -- 180878 (Area: 1659) +(@OGUID+53, 180879, 1, 1, 1, 10146.29, 2573.105, 1320.675, 5.864307, 0, 0, 0, 1, 120, 255, 1), -- 180879 (Area: 1659) +(@OGUID+54, 180777, 1, 1, 1, 10155.51, 2571.573, 1320.54, 4.031712, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 1659) +(@OGUID+55, 180777, 1, 1, 1, 10146.33, 2574.491, 1320.823, 1.169369, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 1659) +(@OGUID+56, 180777, 1, 1, 1, 10148.78, 2592.293, 1330.527, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 1659) +(@OGUID+57, 180777, 1, 1, 1, 10155.43, 2593.67, 1330.43, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 1659) +(@OGUID+58, 180881, 1, 1, 1, 10146.31, 2573.473, 1322.492, 4.799657, 0, 0, 0, 1, 120, 255, 1), -- 180881 (Area: 1659) +(@OGUID+59, 180882, 1, 1, 1, 10146.49, 2573.022, 1322.495, 4.450591, 0, 0, 0, 1, 120, 255, 1), -- 180882 (Area: 1659) +(@OGUID+60, 180883, 1, 1, 1, 10145.72, 2573.401, 1322.479, 5.445428, 0, 0, 0, 1, 120, 255, 1), -- 180883 (Area: 1659) +(@OGUID+61, 180883, 1, 1, 1, 10145.87, 2572.747, 1322.489, 5.811947, 0, 0, 0, 1, 120, 255, 1), -- 180883 (Area: 1659) +(@OGUID+62, 180868, 1, 1, 1, 10148.56, 2596.947, 1330.823, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 1659) +(@OGUID+63, 180868, 1, 1, 1, 10154.36, 2598.172, 1330.823, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 1658) +(@OGUID+64, 180868, 1, 1, 1, 10152.6, 2607.9, 1330.82, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 1658) +(@OGUID+65, 180868, 1, 1, 1, 10145.24, 2600.956, 1330.823, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 1658) +(@OGUID+66, 180868, 1, 1, 1, 10146.67, 2607.012, 1330.823, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 1658) +(@OGUID+67, 180868, 1, 1, 1, 10156.24, 2603.661, 1330.823, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 1658) +(@OGUID+68, 180869, 1, 1, 1, 10147.5, 2600.15, 1330.82, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 180869 (Area: 1658) +(@OGUID+69, 180869, 1, 1, 1, 10153.85, 2601.112, 1330.823, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 180869 (Area: 1658) +(@OGUID+70, 180884, 0, 1, 1, -4643.956, -952.7753, 501.6609, 1.675514, 0, 0, 0, 1, 120, 255, 1), -- 180884 (Area: 4679) -- ironforge +(@OGUID+71, 180777, 0, 1, 1, -4657.851, -970.8358, 502.1435, 1.780234, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 4679) +(@OGUID+72, 180777, 0, 1, 1, -4647.056, -954.0901, 502.1464, 3.246347, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 4679) +(@OGUID+73, 180777, 0, 1, 1, -4657.756, -940.899, 502.1457, 1.291542, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 4679) +(@OGUID+74, 180777, 0, 1, 1, -4676.447, -948.0982, 502.145, 5.689774, 0, 0, 0, 1, 120, 255, 1), -- 180777 (Area: 4679) +(@OGUID+75, 180880, 0, 1, 1, -4643.901, -952.4222, 502.6053, 1.675514, 0, 0, 0, 1, 120, 255, 1), -- 180880 (Area: 4679) +(@OGUID+76, 180880, 0, 1, 1, -4644.116, -952.0615, 502.6122, 6.021387, 0, 0, 0, 1, 120, 255, 1), -- 180880 (Area: 4679) +(@OGUID+77, 180881, 0, 1, 1, -4644.559, -952.6501, 502.5913, 0.1047193, 0, 0, 0, 1, 120, 255, 1), -- 180881 (Area: 4679) +(@OGUID+78, 180881, 0, 1, 1, -4644.697, -951.6542, 502.5873, 4.01426, 0, 0, 0, 1, 120, 255, 1), -- 180881 (Area: 4679) +(@OGUID+79, 180882, 0, 1, 1, -4643.973, -951.5918, 502.5915, 5.061456, 0, 0, 0, 1, 120, 255, 1), -- 180882 (Area: 4679) +(@OGUID+80, 180882, 0, 1, 1, -4643.597, -952.0538, 502.5845, 3.926996, 0, 0, 0, 1, 120, 255, 1), -- 180882 (Area: 4679) +(@OGUID+81, 180883, 0, 1, 1, -4643.862, -952.8162, 502.5914, 0.1047193, 0, 0, 0, 1, 120, 255, 1), -- 180883 (Area: 4679) +(@OGUID+82, 180883, 0, 1, 1, -4644.573, -952.2311, 502.5913, 0.1047193, 0, 0, 0, 1, 120, 255, 1), -- 180883 (Area: 4679) +(@OGUID+83, 180868, 530, 1, 1, -4014.642, -11845.6, 0.088204, 4.694937, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 0) -- more exodar +(@OGUID+84, 180868, 530, 1, 1, -4020.391, -11845.43, 0.025103, 4.747296, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 0) +(@OGUID+85, 180868, 530, 1, 1, -4014.579, -11842.59, 0.096342, 4.694937, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 0) +(@OGUID+86, 180868, 530, 1, 1, -4014.198, -11835.3, 0.118586, 4.694937, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 0) +(@OGUID+87, 180868, 530, 1, 1, -4021.152, -11835.28, 0.0539, 4.747296, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 0) +(@OGUID+88, 180868, 530, 1, 1, -4020.445, -11842.34, 0.032153, 4.747296, 0, 0, 0, 1, 120, 255, 1), -- 180868 (Area: 0) +(@OGUID+89, 180868, 530, 1, 1, -4017.739, -11832.38, 0.104225, 4.729844, 0, 0, 0, 1, 120, 255, 1); -- 180868 (Area: 0) + +DELETE FROM `game_event_gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+89 AND `eventEntry`=@Event; +INSERT INTO `game_event_gameobject` SELECT @Event, gameobject.guid FROM `gameobject` WHERE gameobject.guid BETWEEN @OGUID+0 AND @OGUID+89; + +-- Add missing lunar spawns +DELETE FROM `creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+11; +INSERT INTO `creature` (`guid`, `id`, `map`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `curhealth`) VALUES +(@CGUID+0, 15892, 530, -4014.533, -11839.5, 0.1878313, 2.617994, 120, 0), -- 15892 (Area: 0) +(@CGUID+1, 15892, 530, -4017.631, -11834.3, 0.1710953, 4.747295, 120, 0), -- 15892 (Area: 0) +(@CGUID+2, 15892, 530, -4020.615, -11839.4, 0.1208633, 0.4712389, 120, 0), -- 15892 (Area: 0) +(@CGUID+3, 15892, 1, 10146.8, 2603.15, 1330.903, 6.021386, 120, 0), -- 15892 (Area: 1658) +(@CGUID+4, 15892, 1, 10151.3, 2598.93, 1330.903, 1.780236, 120, 0), -- 15892 (Area: 1658) +(@CGUID+5, 15892, 1, 10153.2, 2604.51, 1330.903, 3.961897, 120, 0), -- 15892 (Area: 1658) +(@CGUID+6, 15898, 530, -4020.056, -11848.42, 0.1050933, 4.677482, 120, 0), -- 15898 (Area: 0) (Auras: ) +(@CGUID+7, 15898, 1, 10148.03, 2572.627, 1320.697, 4.18879, 120, 0), -- 15898 (Area: 1659) (Auras: ) +(@CGUID+8, 15895, 530, -4014.714, -11848.54, 0.1634673, 4.799655, 120, 0), -- 15895 (Area: 0) (Auras: ) +(@CGUID+9, 15895, 1, 10153.6, 2593.45, 1330.843, 4.799655, 120, 0), -- 15895 (Area: 1659) (Auras: ) +(@CGUID+10, 15897, 530, -4017.511, -11837.73, 0.1593063, 4.39823, 120, 0), -- 15897 (Area: 0) (Auras: 25824 - 25824) +(@CGUID+11, 15897, 1, 10150.53, 2602.14, 1330.906, 1.570796, 120, 0); -- 15897 (Area: 1658) (Auras: 25824 - 25824) + +DELETE FROM `game_event_creature` WHERE `guid` BETWEEN @CGUID+0 AND @CGUID+11 AND `eventEntry`=@Event; +INSERT INTO `game_event_creature` SELECT @Event, creature.guid FROM `creature` WHERE creature.guid BETWEEN @CGUID+0 AND @CGUID+11; diff --git a/sql/updates/world/2016_02_23_02_world.sql b/sql/updates/world/2016_02_23_02_world.sql new file mode 100644 index 00000000000..9e2c550dd65 --- /dev/null +++ b/sql/updates/world/2016_02_23_02_world.sql @@ -0,0 +1,6 @@ +DELETE FROM `creature_text` WHERE `entry` IN(37671,38065) AND `id`>0; +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(37671, 0, 1, 'Time is money, friend. Go go go!', 12, 0, 100, 1, 0, 0, 38022, 0, 'Crown Supply Guard'), +(38065, 0, 1, 'Time is money, friend. Go go go!', 12, 0, 100, 1, 0, 0, 38022, 0, 'Crown Supply Guard'), +(37671, 0, 2, 'The Lovely Merchant is waiting for that. Hurry it up!', 12, 0, 100, 1, 0, 0, 38023, 0, 'Crown Supply Guard'), +(38065, 0, 2, 'The Lovely Merchant is waiting for that. Hurry it up!', 12, 0, 100, 1, 0, 0, 38023, 0, 'Crown Supply Guard'); diff --git a/sql/updates/world/2016_02_24_00_world.sql b/sql/updates/world/2016_02_24_00_world.sql new file mode 100644 index 00000000000..06c7c29bd72 --- /dev/null +++ b/sql/updates/world/2016_02_24_00_world.sql @@ -0,0 +1,1966 @@ +SET @OGUID:=83038; +SET @Event:=8; + +-- Add missing love is in the air objects +DELETE FROM `gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+1941; +INSERT INTO `gameobject` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`) VALUES +(@OGUID+0 , 187575, 571, 1, 1, 5820.163, 557.1407, 653.0472, 1.919862, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4395) +(@OGUID+1 , 187575, 571, 1, 1, 5813.242, 555.0104, 653.1141, 1.832595, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4395) +(@OGUID+2 , 187575, 571, 1, 1, 5828.393, 518.7396, 659.42, 5.026549, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4395) +(@OGUID+3 , 187575, 571, 1, 1, 5619.527, 688.4839, 653.2624, 5.846854, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4568) +(@OGUID+4 , 187575, 571, 1, 1, 5622.715, 695.6467, 653.2054, 5.864307, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4568) +(@OGUID+5 , 187575, 571, 1, 1, 5625.892, 702.7949, 653.3616, 5.846854, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4568) +(@OGUID+6 , 187575, 571, 1, 1, 5982.965, 599.3807, 651.8081, 2.775069, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4618) +(@OGUID+7 , 187575, 571, 1, 1, 5988.552, 613.9961, 651.6794, 2.687807, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4618) +(@OGUID+8 , 187575, 571, 1, 1, 5985.754, 606.6982, 651.8865, 2.722713, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4618) +(@OGUID+9 , 187575, 571, 1, 1, 6193.209, -1053.005, 410.5604, 2.495818, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4419) +(@OGUID+10 , 187575, 571, 1, 1, 6111.217, -1074.599, 407.2788, 1.745327, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4419) +(@OGUID+11 , 187575, 571, 1, 1, 6122.76, -1081.095, 406.5847, 4.76475, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4419) +(@OGUID+12 , 187575, 571, 1, 1, 6139.989, -1079.811, 405.7787, 0.087266, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4419) +(@OGUID+13 , 187575, 571, 1, 1, 6122.866, -1073.905, 407.455, 1.640607, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4419) +(@OGUID+14 , 187575, 571, 1, 1, 6133.952, -1074.677, 406.6819, 1.483528, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4419) +(@OGUID+15 , 187575, 571, 1, 1, 6105.763, -1080.907, 407.3781, 3.228859, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4419) +(@OGUID+16 , 187575, 571, 1, 1, 6121.725, -1096.696, 406.5187, 1.396262, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4419) +(@OGUID+17 , 187575, 571, 1, 1, 5141.983, -2154.615, 244.3087, 0.05235888, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+18 , 187575, 571, 1, 1, 5179.932, -2192.024, 239.8268, 2.897245, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+19 , 187575, 571, 1, 1, 5193.838, -2203.542, 239.8356, 3.560473, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+20 , 187575, 571, 1, 1, 5111.679, -2201.835, 243.7792, 1.082103, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+21 , 187575, 571, 1, 1, 5196.897, -2215.816, 243.9398, 2.111848, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+22 , 187575, 571, 1, 1, 5526.034, -2669.764, 304.289, 3.124123, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4275) +(@OGUID+23 , 187575, 571, 1, 1, 5762.96, -3526.665, 391.1757, 3.979355, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4324) +(@OGUID+24 , 187575, 571, 1, 1, 5746.468, -3556.428, 390.0896, 6.056293, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4324) +(@OGUID+25 , 187575, 571, 1, 1, 5768.534, -3620.057, 389.5159, 3.42085, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4324) +(@OGUID+26 , 187575, 571, 1, 1, 5778.518, -3600.462, 387.3365, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4324) +(@OGUID+27 , 187575, 571, 1, 1, 4608.65, -4233.896, 181.3112, 3.054327, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+28 , 187575, 571, 1, 1, 4583.46, -4214.486, 178.712, 5.096362, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4159) +(@OGUID+29 , 187575, 571, 1, 1, 4588.769, -4259.397, 183.0127, 2.129301, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4159) +(@OGUID+30 , 187575, 571, 1, 1, 4545.505, -4198.653, 174.6676, 3.176533, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4159) +(@OGUID+31 , 187575, 571, 1, 1, 4516.881, -4237.698, 172.0961, 3.316144, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4159) +(@OGUID+32 , 187575, 571, 1, 1, 4525.026, -4220.745, 171.4343, 2.757613, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4159) +(@OGUID+33 , 187575, 571, 1, 1, 4524.598, -4165.28, 174.0965, 2.879789, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4159) +(@OGUID+34 , 187575, 571, 1, 1, 4530.678, -4141.924, 175.9093, 2.321287, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4159) +(@OGUID+35 , 187575, 571, 1, 1, 4456.922, -4314.456, 160.9202, 4.572764, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4159) +(@OGUID+36 , 187575, 571, 1, 1, 3876.39, -4523.813, 218.0925, 1.954769, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4205) +(@OGUID+37 , 187575, 571, 1, 1, 3454.602, -2802.049, 202.4846, 3.351047, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+38 , 187575, 571, 1, 1, 3259.021, -2267.587, 114.378, 2.007128, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4248) +(@OGUID+39 , 187575, 571, 1, 1, 3263.253, -2264.287, 115.0179, 2.670348, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4248) +(@OGUID+40 , 187575, 571, 1, 1, 1420.218, -3720.073, 139.7719, 3.752462, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+41 , 187575, 571, 1, 1, 737.0417, -2925.07, 7.038448, 5.969027, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3987) +(@OGUID+42 , 187575, 571, 1, 1, 737.8021, -2929.837, 6.96212, 0.5934101, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3987) +(@OGUID+43 , 187575, 571, 1, 1, 789.0579, -2887.322, 6.061472, 4.276057, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3988) +(@OGUID+44 , 187575, 571, 1, 1, 2491.536, -5071.006, 298.8146, 1.466076, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4003) +(@OGUID+45 , 187575, 571, 1, 1, 2472.029, -5066.281, 286.0714, 3.787367, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4003) +(@OGUID+46 , 187575, 571, 1, 1, 2472.168, -5058.874, 292.4872, 6.178466, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4003) +(@OGUID+47 , 187575, 571, 1, 1, 2474.881, -5069.709, 286.0041, 3.839725, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4003) +(@OGUID+48 , 187575, 571, 1, 1, 2499.964, -5059.02, 286.9637, 3.036838, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4003) +(@OGUID+49 , 187575, 571, 1, 1, 2653.467, -4398.361, 284.5294, 0.9250238, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+50 , 187575, 571, 1, 1, 2645.279, -4389.678, 283.9462, 0.1047193, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+51 , 187575, 571, 1, 1, 3644.348, -723.9233, 218.8718, 1.448622, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4177) +(@OGUID+52 , 187575, 571, 1, 1, 3647.875, -707.9075, 217.1875, 6.178466, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4177) +(@OGUID+53 , 187575, 571, 1, 1, 3658.615, -719.4378, 218.7648, 3.054327, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4177) +(@OGUID+54 , 187575, 571, 1, 1, 3713.571, -686.2274, 216.503, 4.450591, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4177) +(@OGUID+55 , 187575, 571, 1, 1, 3720.316, -705.8351, 216.0074, 2.495818, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4177) +(@OGUID+56 , 187575, 571, 1, 1, 3827.11, 1482.655, 95.12893, 1.431168, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4165) +(@OGUID+57 , 187575, 571, 1, 1, 3859.411, 1466.078, 94.9991, 1.692969, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4165) +(@OGUID+58 , 187575, 571, 1, 1, 3825.417, 1465.946, 95.10252, 1.745327, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4165) +(@OGUID+59 , 187575, 571, 1, 1, 3842.333, 1481.939, 97.79363, 1.640607, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4165) +(@OGUID+60 , 187575, 571, 1, 1, 3857.466, 1482.773, 96.1758, 1.623156, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4165) +(@OGUID+61 , 187575, 571, 1, 1, 3827.736, 1496.177, 95.10645, 6.213374, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4165) +(@OGUID+62 , 187575, 571, 1, 1, 3857.144, 1496.144, 95.12449, 3.141593, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4165) +(@OGUID+63 , 187575, 571, 1, 1, 3770.23, 1602.427, 95.77409, 5.044002, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4165) +(@OGUID+64 , 187575, 571, 1, 1, 3781.036, 1623.459, 95.58131, 0.4363316, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4165) +(@OGUID+65 , 187575, 571, 1, 1, 3553.18, 1827.47, 81.077, 4.310966, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+66 , 187575, 571, 1, 1, 3643.384, 1884.3, 80.81538, 2.740162, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+67 , 187575, 571, 1, 1, 2756.815, 926.7635, 23.2116, 2.984498, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4152) +(@OGUID+68 , 187575, 571, 1, 1, 2792.32, 944.9219, 23.26566, 1.151916, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4152) +(@OGUID+69 , 187575, 571, 1, 1, 2798.089, 941.0677, 24.67208, 0.3141584, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4152) +(@OGUID+70 , 187575, 571, 1, 1, 2756.885, 920.0313, 24.40833, 3.33359, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4152) +(@OGUID+71 , 187575, 571, 1, 1, 2791.102, 904.5616, 23.04511, 1.256636, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4152) +(@OGUID+72 , 187575, 571, 1, 1, 2787.111, 910.8663, 32.01936, 5.270896, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4152) +(@OGUID+73 , 187575, 571, 1, 1, 2742.9, 887.7947, 6.358366, 2.426008, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4152) +(@OGUID+74 , 187575, 571, 1, 1, 2732.103, 881.1441, 6.379679, 1.186823, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4152) +(@OGUID+75 , 187575, 571, 1, 1, 2713.987, 894.1632, 16.31461, 2.059488, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4152) +(@OGUID+76 , 187575, 571, 1, 1, 4971.71, 1267.167, 228.3888, 5.096362, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4170) +(@OGUID+77 , 187575, 571, 1, 1, 4967.139, 1265.599, 227.7066, 4.869471, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4170) +(@OGUID+78 , 187575, 571, 1, 1, 4942.589, 1170.193, 239.8133, 4.97419, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4170) +(@OGUID+79 , 187575, 571, 1, 1, 4951.857, 1167.702, 240.1477, 4.206246, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4170) +(@OGUID+80 , 187575, 571, 1, 1, 4937.846, 1158.604, 240.5038, 0.6632232, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4170) +(@OGUID+81 , 187575, 571, 1, 1, 5009.385, 1205.95, 231.4591, 2.565632, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4170) +(@OGUID+82 , 187575, 571, 1, 1, 3449.408, 4085.986, 17.83682, 1.815142, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4042) +(@OGUID+83 , 187575, 571, 1, 1, 2980.379, 4053.99, 28.38085, 3.089183, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4113) +(@OGUID+84 , 187575, 571, 1, 1, 3007.164, 4071.765, 35.89487, 1.553341, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4113) +(@OGUID+85 , 187575, 571, 1, 1, 3026.245, 4045.878, 28.50895, 5.829401, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4113) +(@OGUID+86 , 187575, 571, 1, 1, 2279.208, 5188.578, 16.22224, 1.134463, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+87 , 187575, 571, 1, 1, 2288.109, 5196.549, 14.44638, 1.169369, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+88 , 187575, 571, 1, 1, 2924.559, 6242.063, 209.8437, 2.687807, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4129) +(@OGUID+89 , 187575, 571, 1, 1, 2924.903, 6244.5, 210.3616, 3.42085, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4129) +(@OGUID+90 , 187575, 571, 1, 1, 4111.603, 5303.919, 31.3832, 2.391098, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+91 , 187575, 571, 1, 1, 4475.266, 5707.764, 82.36211, 1.466076, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+92 , 187575, 571, 1, 1, 4470.285, 5710.635, 82.27143, 0.9948372, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+93 , 187575, 571, 1, 1, 5482.611, 4728.695, -191.6311, 1.221729, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4290) +(@OGUID+94 , 187575, 571, 1, 1, 8473.581, -342.7954, 906.4036, 2.286379, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4436) +(@OGUID+95 , 187575, 571, 1, 1, 8418.453, -349.0424, 909.3304, 5.602507, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4436) +(@OGUID+96 , 187575, 571, 1, 1, 8433.876, -362.944, 908.5649, 2.373644, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 4436) +(@OGUID+97 , 187575, 571, 1, 1, 7856.078, -735.8157, 1178.389, 0.122173, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+98 , 187575, 530, 1, 1, -2564.838, 4432.062, 39.61848, 3.909541, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3683) +(@OGUID+99 , 187575, 530, 1, 1, -2560.156, 4422.9, 40.24272, 3.368496, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3683) +(@OGUID+100 , 187575, 530, 1, 1, -2621.607, 4461.632, 39.31939, 2.949595, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3683) +(@OGUID+101 , 187575, 530, 1, 1, -2618.607, 4461.301, 39.33173, 6.108654, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3683) +(@OGUID+102 , 187575, 530, 1, 1, -2619.96, 4462.996, 39.3169, 1.448622, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3683) +(@OGUID+103 , 187575, 530, 1, 1, -2620.309, 4459.896, 39.31923, 4.607672, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3683) +(@OGUID+104 , 187575, 530, 1, 1, -3009.571, 3998.962, 5.706537, 4.537859, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3684) +(@OGUID+105 , 187575, 530, 1, 1, -2991.61, 3988.035, 5.85871, 4.572764, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3684) +(@OGUID+106 , 187575, 530, 1, 1, -3002.449, 3997.882, 5.743727, 4.520406, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3684) +(@OGUID+107 , 187575, 530, 1, 1, -3026.769, 2565.998, 80.07526, 0.1396245, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3744) +(@OGUID+108 , 187575, 530, 1, 1, -3012.218, 2548.628, 79.43921, 1.500983, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3744) +(@OGUID+109 , 187575, 530, 1, 1, -2979.819, 2565.84, 79.82945, 5.829401, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3744) +(@OGUID+110 , 187575, 530, 1, 1, -2963.231, 2558.747, 80.31774, 2.617989, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3744) +(@OGUID+111 , 187575, 530, 1, 1, -3977.41, 2165.698, 106.9871, 2.460913, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3745) +(@OGUID+112 , 187575, 530, 1, 1, -4075.49, 2189.597, 111.462, 4.76475, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3745) +(@OGUID+113 , 187575, 530, 1, 1, -4069.704, 2183.112, 108.5346, 3.298687, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3745) +(@OGUID+114 , 187575, 530, 1, 1, -4064.588, 1124.245, 43.41816, 2.44346, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3929) +(@OGUID+115 , 187575, 530, 1, 1, -3061.328, 737.1945, -8.771701, 1.448622, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3754) +(@OGUID+116 , 187575, 530, 1, 1, -154.7856, 5523.646, 31.50904, 3.47321, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3565) +(@OGUID+117 , 187575, 530, 1, 1, -158.5099, 5535.154, 31.47245, 3.525572, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3565) +(@OGUID+118 , 187575, 530, 1, 1, 225.3918, 7813.881, 22.98265, 3.403396, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+119 , 187575, 530, 1, 1, 221.99, 7810.066, 23.68496, 2.234018, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+120 , 187575, 530, 1, 1, 332.2872, 7829.961, 39.40045, 6.213374, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3645) +(@OGUID+121 , 187575, 530, 1, 1, 241.3687, 7913.663, 27.14164, 5.044002, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3645) +(@OGUID+122 , 187575, 530, 1, 1, 342.1493, 7867.583, 45.30079, 3.944446, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3645) +(@OGUID+123 , 187575, 530, 1, 1, 233.8486, 7910.588, 27.21144, 5.218536, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3645) +(@OGUID+124 , 187575, 530, 1, 1, 1044.723, 7368.755, 43.1856, 0.5585039, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3766) +(@OGUID+125 , 187575, 530, 1, 1, 1052.611, 7359.699, 42.62963, 0.8726639, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3766) +(@OGUID+126 , 187575, 530, 1, 1, 1989.314, 6784.465, 167.9164, 4.537859, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3772) +(@OGUID+127 , 187575, 530, 1, 1, 2016.857, 6885.055, 182.8496, 4.223697, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3772) +(@OGUID+128 , 187575, 530, 1, 1, 2944.679, 5466.702, 150.6358, 0, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3951) +(@OGUID+129 , 187575, 530, 1, 1, 3013.267, 5429.971, 148.0764, 0.5759573, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3951) +(@OGUID+130 , 187575, 530, 1, 1, 2165.546, 4727.486, 159.5631, 2.268925, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3844) +(@OGUID+131 , 187575, 530, 1, 1, 2188.357, 4795.172, 158.674, 4.921829, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3844) +(@OGUID+132 , 187575, 530, 1, 1, 2181.066, 4706.845, 159.5976, 5.358162, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3844) +(@OGUID+133 , 187575, 530, 1, 1, 2045.43, 4686.257, 153.306, 1.029743, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3844) +(@OGUID+134 , 187575, 530, 1, 1, 2032.304, 4663.961, 153.4191, 4.171338, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3844) +(@OGUID+135 , 187575, 0, 1, 1, -4630.104, -928.945, 506.1224, 0.7330382, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 5344) +(@OGUID+136 , 187575, 530, 1, 1, -4227.08, -12484.05, 47.71632, 3.124123, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+137 , 187575, 530, 1, 1, -4231.724, -12498.08, 47.24671, 2.635444, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 0) +(@OGUID+138 , 187575, 530, 1, 1, -4207.997, -12557.59, 46.31153, 4.886924, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3576) +(@OGUID+139 , 187575, 530, 1, 1, -4183.172, -12564.08, 45.20827, 4.502952, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3576) +(@OGUID+140 , 187575, 530, 1, 1, -4107.671, -12483.03, 47.42568, 6.213374, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3576) +(@OGUID+141 , 187575, 530, 1, 1, -4105.227, -12501.2, 47.79556, 0.5759573, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3576) +(@OGUID+142 , 187575, 530, 1, 1, -4122.453, -12463.12, 48.0975, 3.842447, 0, 0, 0, 1, 120, 255, 1), -- 187575 (Area: 3576) +(@OGUID+143 , 187668, 571, 1, 1, 5855.43, 634.2999, 649.2884, 2.286379, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4395) +(@OGUID+144 , 187668, 571, 1, 1, 5858.512, 638.0903, 649.1016, 2.478367, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4395) +(@OGUID+145 , 187668, 571, 1, 1, 5838.521, 520.3542, 659.7874, 2.652894, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4395) +(@OGUID+146 , 187668, 571, 1, 1, 5819.291, 514.2288, 659.8239, 1.099556, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4395) +(@OGUID+147 , 187668, 571, 1, 1, 5855.882, 661.2175, 649.2011, 3.839725, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4395) +(@OGUID+148 , 187668, 571, 1, 1, 5852.286, 664.1205, 649.1534, 4.031712, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4395) +(@OGUID+149 , 187668, 571, 1, 1, 5726.839, 678.6988, 648.3967, 2.478367, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4739) +(@OGUID+150 , 187668, 571, 1, 1, 5730.19, 682.8389, 648.4232, 2.408554, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4739) +(@OGUID+151 , 187668, 571, 1, 1, 5769.932, 711.6566, 619.6014, 5.602507, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4739) +(@OGUID+152 , 187668, 571, 1, 1, 5766.1, 706.9418, 619.6938, 5.462882, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4739) +(@OGUID+153 , 187668, 571, 1, 1, 5863.507, 473.3883, 642.9924, 0.01745246, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4613) +(@OGUID+154 , 187668, 571, 1, 1, 5904.753, 489.8196, 643.4774, 3.455756, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4616) +(@OGUID+155 , 187668, 571, 1, 1, 5906.59, 480.6752, 643.4434, 3.38594, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4616) +(@OGUID+156 , 187668, 571, 1, 1, 5864.693, 467.3737, 643.1257, 0.122173, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4616) +(@OGUID+157 , 187668, 571, 1, 1, 6676.186, -199.1807, 956.5273, 3.368496, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4428) +(@OGUID+158 , 187668, 571, 1, 1, 6124.218, -1074.936, 405.0566, 1.692969, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4419) +(@OGUID+159 , 187668, 571, 1, 1, 6124.213, -1076.51, 404.6239, 4.625124, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4419) +(@OGUID+160 , 187668, 571, 1, 1, 6120.367, -1076.484, 404.6041, 4.886924, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4419) +(@OGUID+161 , 187668, 571, 1, 1, 6120.694, -1074.873, 405.0674, 1.413715, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4419) +(@OGUID+162 , 187668, 571, 1, 1, 5796.578, -3553.885, 388.331, 3.159062, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4323) +(@OGUID+163 , 187668, 571, 1, 1, 3416.354, -2799.535, 203.6574, 2.042035, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+164 , 187668, 571, 1, 1, 3404.744, -2783.643, 203.9436, 5.532695, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+165 , 187668, 571, 1, 1, 3421.742, -2795.542, 203.7708, 2.286379, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+166 , 187668, 571, 1, 1, 3410.07, -2779.702, 203.9763, 5.323256, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+167 , 187668, 571, 1, 1, 1454.493, -3273.58, 168.5273, 2.408554, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4071) +(@OGUID+168 , 187668, 571, 1, 1, 1427.002, -3268.351, 169.1821, 5.707228, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3998) +(@OGUID+169 , 187668, 571, 1, 1, 1431.483, -3274.533, 169.1915, 1.047198, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3998) +(@OGUID+170 , 187668, 571, 1, 1, 1438.028, -3267.566, 169.513, 5.637414, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3998) +(@OGUID+171 , 187668, 571, 1, 1, 1437.135, -3266.915, 169.5058, 2.391098, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3998) +(@OGUID+172 , 187668, 571, 1, 1, 1429.582, -3265.274, 169.2192, 5.462882, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3998) +(@OGUID+173 , 187668, 571, 1, 1, 1445.74, -3257.578, 169.2403, 4.01426, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3998) +(@OGUID+174 , 187668, 571, 1, 1, 440.0521, -4547.913, 248.6341, 3.839725, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3991) +(@OGUID+175 , 187668, 571, 1, 1, 441.8183, -4550.703, 248.5898, 3.57793, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3991) +(@OGUID+176 , 187668, 571, 1, 1, 455.1633, -4536.68, 247.5673, 3.857183, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3991) +(@OGUID+177 , 187668, 571, 1, 1, 458.6449, -4542.124, 247.7258, 3.612838, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3991) +(@OGUID+178 , 187668, 571, 1, 1, 587.3395, -4934.356, 20.82388, 0.1919852, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3981) +(@OGUID+179 , 187668, 571, 1, 1, 586.2632, -4934.662, 20.74441, 3.38594, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3981) +(@OGUID+180 , 187668, 571, 1, 1, 580.5126, -4939.842, 20.76777, 0.2094394, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3981) +(@OGUID+181 , 187668, 571, 1, 1, 581.4718, -4943.683, 20.63075, 0.383971, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3981) +(@OGUID+182 , 187668, 571, 1, 1, 1891.333, -6175.724, 26.62351, 0.9075702, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4000) +(@OGUID+183 , 187668, 571, 1, 1, 1894.171, -6177.047, 26.61499, 1.256636, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4000) +(@OGUID+184 , 187668, 571, 1, 1, 1890.348, -6204.115, 26.52463, 2.617989, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4000) +(@OGUID+185 , 187668, 571, 1, 1, 1872.679, -6195.768, 26.33468, 5.777041, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4000) +(@OGUID+186 , 187668, 571, 1, 1, 2425.66, -5166.585, 282.1942, 1.186823, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4003) +(@OGUID+187 , 187668, 571, 1, 1, 2482.925, -5077.249, 291.7695, 1.466076, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4003) +(@OGUID+188 , 187668, 571, 1, 1, 2472.532, -5054.136, 292.9761, 0, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4003) +(@OGUID+189 , 187668, 571, 1, 1, 2678.708, -4395.557, 285.5654, 0.8377575, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+190 , 187668, 571, 1, 1, 2681.623, -4397.512, 285.5597, 0.9599299, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+191 , 187668, 571, 1, 1, 2677.323, -4386.643, 290.0943, 5.689774, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+192 , 187668, 571, 1, 1, 3217.361, -685.8459, 169.8989, 1.047198, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4232) +(@OGUID+193 , 187668, 571, 1, 1, 3219.979, -680.9132, 169.6687, 4.136433, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4232) +(@OGUID+194 , 187668, 571, 1, 1, 3207.445, -675.2426, 170.4363, 5.67232, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4232) +(@OGUID+195 , 187668, 571, 1, 1, 3205.08, -679.9858, 170.4128, 6.03884, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4232) +(@OGUID+196 , 187668, 571, 1, 1, 3635.864, -710.7761, 215.8188, 4.869471, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+197 , 187668, 571, 1, 1, 3640.115, -711.2604, 215.9585, 4.398232, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+198 , 187668, 571, 1, 1, 3651.599, -711.7225, 216.8413, 4.747296, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4177) +(@OGUID+199 , 187668, 571, 1, 1, 3666.347, -703.8602, 217.6456, 6.230826, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4177) +(@OGUID+200 , 187668, 571, 1, 1, 3665.587, -710.9298, 217.4738, 6.161013, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4177) +(@OGUID+201 , 187668, 571, 1, 1, 3480.165, 1977.29, 70.61582, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4158) +(@OGUID+202 , 187668, 571, 1, 1, 3472.212, 1983.86, 69.00069, 0.5061446, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4158) +(@OGUID+203 , 187668, 571, 1, 1, 3476.039, 2008.531, 68.95277, 5.515242, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4158) +(@OGUID+204 , 187668, 571, 1, 1, 3484.333, 2013.51, 68.88947, 5.044002, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4158) +(@OGUID+205 , 187668, 571, 1, 1, 2770.71, 934.493, 25.70063, 5.67232, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4152) +(@OGUID+206 , 187668, 571, 1, 1, 2777.521, 938.1545, 25.58711, 4.34587, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4152) +(@OGUID+207 , 187668, 571, 1, 1, 2271.331, 5194.442, 14.39653, 5.93412, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+208 , 187668, 571, 1, 1, 2299.134, 5198.044, 13.93274, 2.722713, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+209 , 187668, 571, 1, 1, 2280.926, 5198.394, 14.63274, 4.188792, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+210 , 187668, 571, 1, 1, 2281.226, 5199.101, 14.57226, 1.221729, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+211 , 187668, 571, 1, 1, 2272.831, 5198.149, 14.36126, 5.829401, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+212 , 187668, 571, 1, 1, 2824.468, 6139.032, 88.58996, 5.742135, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4129) +(@OGUID+213 , 187668, 571, 1, 1, 2792.786, 6176.63, 88.45963, 0.2268925, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4129) +(@OGUID+214 , 187668, 571, 1, 1, 2824.102, 6142.47, 88.44103, 0.8552105, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4129) +(@OGUID+215 , 187668, 571, 1, 1, 2789.38, 6177.33, 88.61863, 2.111848, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4129) +(@OGUID+216 , 187668, 571, 1, 1, 4176.385, 5285.042, 28.29611, 5.131269, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4108) +(@OGUID+217 , 187668, 571, 1, 1, 4176.302, 5277.055, 28.09965, 1.117009, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4108) +(@OGUID+218 , 187668, 571, 1, 1, 4171.795, 5282.206, 41.54663, 0.03490625, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4108) +(@OGUID+219 , 187668, 571, 1, 1, 4178.876, 5273.907, 40.73148, 1.396262, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 4108) +(@OGUID+220 , 187668, 530, 1, 1, -2961.582, 2546.881, 79.93132, 1.692969, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3744) +(@OGUID+221 , 187668, 530, 1, 1, -2963.262, 2557.669, 96.95348, 3.403396, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3744) +(@OGUID+222 , 187668, 530, 1, 1, -2954.958, 2567.078, 81.00614, 3.822273, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3744) +(@OGUID+223 , 187668, 530, 1, 1, -2961.015, 2557.951, 93.87666, 6.213374, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3744) +(@OGUID+224 , 187668, 530, 1, 1, -4074.347, 2162.13, 111.4437, 1.53589, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3745) +(@OGUID+225 , 187668, 530, 1, 1, -4072.622, 2162.176, 111.4297, 1.658062, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3745) +(@OGUID+226 , 187668, 530, 1, 1, -4076.15, 2162.084, 111.4253, 1.605702, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3745) +(@OGUID+227 , 187668, 530, 1, 1, -2979.535, 851.0223, -5.23692, 1.658062, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3754) +(@OGUID+228 , 187668, 530, 1, 1, -2974.166, 852.9896, -5.184109, 1.884953, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3754) +(@OGUID+229 , 187668, 530, 1, 1, 289.163, 6085.788, 135.125, 4.747296, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3644) +(@OGUID+230 , 187668, 530, 1, 1, 276.0255, 6085.296, 135.0984, 4.886924, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3644) +(@OGUID+231 , 187668, 530, 1, 1, 270.995, 6092.489, 133.5649, 1.186823, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3644) +(@OGUID+232 , 187668, 530, 1, 1, 261.8294, 6096.237, 133.3653, 1.117009, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3644) +(@OGUID+233 , 187668, 530, 1, 1, 266.4354, 6094.357, 133.5182, 1.186823, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3644) +(@OGUID+234 , 187668, 530, 1, 1, 239.3766, 7930.089, 27.83519, 2.809975, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3645) +(@OGUID+235 , 187668, 530, 1, 1, 223.9831, 7923.57, 27.90063, 1.291542, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3645) +(@OGUID+236 , 187668, 530, 1, 1, 228.6397, 7945.422, 29.25893, 5.235988, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3645) +(@OGUID+237 , 187668, 530, 1, 1, 3057.197, 3694.741, 145.4213, 3.647741, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3712) +(@OGUID+238 , 187668, 530, 1, 1, 3060.614, 3691.763, 144.8515, 0.6457717, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3712) +(@OGUID+239 , 187668, 530, 1, 1, 3058.398, 3696.026, 144.8155, 0.1919852, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3712) +(@OGUID+240 , 187668, 530, 1, 1, 3058.831, 3691.601, 145.45, 3.508117, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3712) +(@OGUID+241 , 187668, 530, 1, 1, -4207.088, -12473.58, 46.58454, 4.694937, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+242 , 187668, 530, 1, 1, -4192.907, -12467.66, 46.6215, 5.794494, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+243 , 187668, 530, 1, 1, -4216.924, -12483.89, 48.3932, 6.230826, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+244 , 187668, 530, 1, 1, -4216.502, -12480.64, 48.98628, 6.213374, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+245 , 187668, 530, 1, 1, -4212.281, -12515.08, 50.44548, 0.3141584, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+246 , 187668, 530, 1, 1, -4212.782, -12506.34, 46.88014, 6.003934, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+247 , 187668, 530, 1, 1, -4208.398, -12519.56, 47.62306, 5.567601, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 0) +(@OGUID+248 , 187668, 530, 1, 1, -4149.234, -12485.86, 50.90091, 3.859896, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3576) +(@OGUID+249 , 187668, 530, 1, 1, -4164.37, -12536.8, 48.27224, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3576) +(@OGUID+250 , 187668, 530, 1, 1, -4160.896, -12457.07, 47.62824, 4.153885, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3576) +(@OGUID+251 , 187668, 530, 1, 1, -4167.781, -12537.14, 48.95461, 1.675514, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3576) +(@OGUID+252 , 187668, 530, 1, 1, -4144.596, -12490.33, 45.72705, 4.607672, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3576) +(@OGUID+253 , 187668, 530, 1, 1, -4152.799, -12480.7, 45.96771, 2.844883, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3576) +(@OGUID+254 , 187668, 530, 1, 1, -4163.363, -12455.46, 47.14916, 4.06662, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3576) +(@OGUID+255 , 187668, 530, 1, 1, -4153.813, -12532.33, 49.37784, 2.600535, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3576) +(@OGUID+256 , 187668, 530, 1, 1, -4150.61, -12525.97, 49.39287, 2.722713, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3576) +(@OGUID+257 , 187668, 530, 1, 1, -4173.694, -13729.01, 76.77699, 2.809975, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3526) +(@OGUID+258 , 187668, 530, 1, 1, -4050.141, -13778.29, 76.35183, 5.67232, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3527) +(@OGUID+259 , 187668, 530, 1, 1, -4047.493, -13771.29, 76.13934, 6.19592, 0, 0, 0, 1, 120, 255, 1), -- 187668 (Area: 3527) +(@OGUID+260 , 201940, 530, 1, 1, 9611.64, -7183.144, 14.28471, 1.745327, 0, 0, 0, 1, 120, 255, 1), -- 201940 (Area: 3487) +(@OGUID+261 , 201940, 0, 1, 1, -4918.394, -983.5625, 501.4531, 2.268925, 0, 0, 0, 1, 120, 255, 1), -- 201940 (Area: 5342) +(@OGUID+262 , 201940, 0, 1, 1, -8868.988, 637.1007, 95.78714, 0.8377575, 0, 0, 0, 1, 120, 255, 1), -- 201940 (Area: 5148) Valentine Arch (x2.00) +(@OGUID+263 , 201940, 1, 1, 1, 9870.75, 2493.63, 1315.87, 5.98648, 0, 0, 0, 1, 120, 255, 1), -- 201940 (Area: 0) +(@OGUID+264 , 201940, 530, 1, 1, -4005.649, -11844.58, 0.186079, 4.520406, 0, 0, 0, 1, 120, 255, 1), -- 201940 (Area: 0) +(@OGUID+265 , 181027, 571, 1, 1, 5768.591, 693.1081, 612.2136, 5.93412, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4739) +(@OGUID+266 , 181027, 571, 1, 1, 5740.348, 662.5662, 612.2136, 0.03490625, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4739) +(@OGUID+267 , 181027, 571, 1, 1, 5734.721, 656.9608, 612.2136, 5.166176, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4739) +(@OGUID+268 , 181027, 571, 1, 1, 5718.801, 654.3483, 612.2136, 0.8901166, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4739) +(@OGUID+269 , 181027, 571, 1, 1, 5753.042, 707.0385, 612.2136, 2.216565, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4739) +(@OGUID+270 , 181027, 571, 1, 1, 5787.936, 719.6158, 612.2136, 5.113817, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4739) +(@OGUID+271 , 181027, 571, 1, 1, 5792.599, 725.4569, 612.2136, 4.502952, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4739) +(@OGUID+272 , 181027, 571, 1, 1, 5720.552, 681.9709, 612.2136, 2.932139, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4739) +(@OGUID+273 , 181027, 571, 1, 1, 2620.68, -2024.098, 0, 5.881761, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4242) +(@OGUID+274 , 181027, 571, 1, 1, 2558.805, -1994.658, 0, 5.078908, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4242) +(@OGUID+275 , 181027, 571, 1, 1, 2530.056, -2001.654, 0, 3.508117, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4242) +(@OGUID+276 , 181027, 571, 1, 1, 2571.232, -1981.536, 0, 0.7504908, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4242) +(@OGUID+277 , 181027, 571, 1, 1, 2564.62, -1902.94, 0, 1.204277, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4242) +(@OGUID+278 , 181027, 571, 1, 1, 2578.922, -1926.984, 0, 4.729844, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4242) +(@OGUID+279 , 181027, 571, 1, 1, 2604.255, -1901.251, 0, 4.904376, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4242) +(@OGUID+280 , 181027, 571, 1, 1, 2600.202, -1864.442, 0, 0.5061446, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4242) +(@OGUID+281 , 181027, 571, 1, 1, 2600.614, -1814.094, 0, 0.03490625, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4242) +(@OGUID+282 , 181027, 571, 1, 1, 2604.877, -1833.523, 0, 1.099556, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4242) +(@OGUID+283 , 181027, 571, 1, 1, 2415.667, -1854.533, 0, 2.687807, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4242) +(@OGUID+284 , 181027, 571, 1, 1, 2407.166, -1845.278, 0, 2.268925, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4242) +(@OGUID+285 , 181027, 571, 1, 1, 2404.097, -1864.177, 0, 3.560473, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4242) +(@OGUID+286 , 181027, 571, 1, 1, 2414.991, -1875.148, 0, 4.258607, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4242) +(@OGUID+287 , 181027, 571, 1, 1, 754.5249, -2854.845, 0, 2.932139, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3988) +(@OGUID+288 , 181027, 571, 1, 1, 767.0814, -2846.513, 0, 5.358162, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3988) +(@OGUID+289 , 181027, 571, 1, 1, 793.7769, -2840.536, 0, 5.93412, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3988) +(@OGUID+290 , 181027, 571, 1, 1, 794.0623, -2848.875, 0, 1.378809, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3988) +(@OGUID+291 , 181027, 571, 1, 1, 796.1247, -2842.772, 0, 1.658062, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3988) +(@OGUID+292 , 181027, 571, 1, 1, 765.928, -2820.402, 0, 5.794494, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3988) +(@OGUID+293 , 181027, 571, 1, 1, 2455.453, -5133.994, 275.5138, 3.194002, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4003) +(@OGUID+294 , 181027, 571, 1, 1, 2459.948, -5130.551, 275.5138, 0.3141584, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4003) +(@OGUID+295 , 181027, 571, 1, 1, 2455.139, -5131.472, 275.5138, 3.769912, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4003) +(@OGUID+296 , 181027, 571, 1, 1, 2380.471, -5088.479, 248.5613, 2.617989, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4003) +(@OGUID+297 , 181027, 571, 1, 1, 2502.854, -5015.77, 275.4288, 0.5759573, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4003) +(@OGUID+298 , 181027, 571, 1, 1, 2485.411, -5004.169, 274.5456, 1.117009, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4003) +(@OGUID+299 , 181027, 571, 1, 1, 2485.646, -5000.984, 274.5577, 3.804818, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4003) +(@OGUID+300 , 181027, 571, 1, 1, 2369.498, -5004.655, 248.5613, 3.455756, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4003) +(@OGUID+301 , 181027, 571, 1, 1, 2375.392, -5002.363, 248.5613, 1.658062, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4003) +(@OGUID+302 , 181027, 571, 1, 1, 3496.388, 1977.59, 65.96105, 5.969027, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4158) +(@OGUID+303 , 181027, 571, 1, 1, 3495.364, 1981.665, 66.03764, 5.235988, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4158) +(@OGUID+304 , 181027, 571, 1, 1, 3490.632, 1980.51, 65.99807, 5.113817, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4158) +(@OGUID+305 , 181027, 571, 1, 1, 2702.725, 934.8021, 0, 1.780234, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4152) +(@OGUID+306 , 181027, 571, 1, 1, 2700.923, 919.1116, 0, 1.308995, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4152) +(@OGUID+307 , 181027, 571, 1, 1, 2717.166, 869.525, 0, 2.146753, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4152) +(@OGUID+308 , 181027, 571, 1, 1, 2717.919, 866.1157, 0, 2.251473, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4152) +(@OGUID+309 , 181027, 571, 1, 1, 2658.5, 918.8054, 0, 4.310966, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4152) +(@OGUID+310 , 181027, 571, 1, 1, 2670.15, 871.2205, 0, 1.274088, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4152) +(@OGUID+311 , 181027, 571, 1, 1, 2668.09, 872.3976, 0, 1.466076, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4152) +(@OGUID+312 , 181027, 571, 1, 1, 2666.374, 918.7291, 0, 2.513274, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4152) +(@OGUID+313 , 181027, 571, 1, 1, 2627.73, 887.0659, 0, 4.01426, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4152) +(@OGUID+314 , 181027, 571, 1, 1, 2626.058, 889.1933, 0, 3.351047, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4152) +(@OGUID+315 , 181027, 571, 1, 1, 2627.751, 895.2178, 0, 1.675514, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4152) +(@OGUID+316 , 181027, 571, 1, 1, 5500.563, 5787.042, -82.11499, 3.351047, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4285) +(@OGUID+317 , 181027, 571, 1, 1, 5509.842, 5766.954, -84.06371, 5.358162, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4285) +(@OGUID+318 , 181027, 571, 1, 1, 5513.78, 5795.364, -80.6015, 0.2792516, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4285) +(@OGUID+319 , 181027, 571, 1, 1, 5510.346, 5761.825, -84.18658, 2.426008, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4285) +(@OGUID+320 , 181027, 571, 1, 1, 5501.959, 5802.074, -79.23232, 0.5585039, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4285) +(@OGUID+321 , 181027, 571, 1, 1, 5513.074, 5766.733, -84.07557, 1.099556, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4285) +(@OGUID+322 , 181027, 571, 1, 1, 5567.791, 5826.353, -73.64291, 5.759588, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4285) +(@OGUID+323 , 181027, 571, 1, 1, 5562.381, 5829.076, -73.01419, 4.520406, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4285) +(@OGUID+324 , 181027, 571, 1, 1, 5469.105, 4760.201, -198.9201, 0.2443456, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4290) +(@OGUID+325 , 181027, 571, 1, 1, 5469.406, 4742.04, -198.9063, 4.97419, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4290) +(@OGUID+326 , 181027, 571, 1, 1, 5478.349, 4771.299, -198.9465, 3.892087, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4290) +(@OGUID+327 , 181027, 571, 1, 1, 5467.913, 4754.535, -198.9201, 4.34587, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4290) +(@OGUID+328 , 181027, 571, 1, 1, 5450.431, 4755.577, -198.9201, 0.9424766, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4290) +(@OGUID+329 , 181027, 571, 1, 1, 5445.94, 4761.356, -199.0263, 0.4537851, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 4290) +(@OGUID+330 , 181027, 530, 1, 1, 1961.764, 6885.375, 162.7591, 1.082103, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3771) +(@OGUID+331 , 181027, 530, 1, 1, 1965.24, 6884.419, 162.7591, 4.206246, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3772) +(@OGUID+332 , 181027, 530, 1, 1, 1964.663, 6887.743, 162.7591, 5.358162, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3772) +(@OGUID+333 , 181027, 530, 1, 1, 2097.025, 6825.342, 174.8524, 4.380776, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3772) +(@OGUID+334 , 181027, 530, 1, 1, 2095.012, 6821.211, 174.8731, 1.431168, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3772) +(@OGUID+335 , 181027, 530, 1, 1, 2092.416, 6825.399, 174.8686, 0.3316107, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3772) +(@OGUID+336 , 181027, 530, 1, 1, 2089.096, 6768.958, 164.8599, 4.049168, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3772) +(@OGUID+337 , 181027, 530, 1, 1, 2092.187, 6765.44, 164.8475, 4.293513, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3772) +(@OGUID+338 , 181027, 530, 1, 1, 2093.987, 6769.731, 164.8697, 1.308995, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3772) +(@OGUID+339 , 181027, 530, 1, 1, 2991.37, 5483.188, 144.6114, 0.4188786, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3951) +(@OGUID+340 , 181027, 530, 1, 1, 2986.906, 5481.471, 144.5909, 1.012289, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3951) +(@OGUID+341 , 181027, 530, 1, 1, 2991.238, 5478.47, 144.5909, 5.759588, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3951) +(@OGUID+342 , 181027, 530, 1, 1, 3030.463, 5492.013, 147.1473, 1.692969, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3951) +(@OGUID+343 , 181027, 530, 1, 1, 3034.872, 5490.722, 147.1473, 0.7155849, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3951) +(@OGUID+344 , 181027, 530, 1, 1, 3011.45, 5435.751, 147.5007, 1.919862, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3951) +(@OGUID+345 , 181027, 530, 1, 1, 3008.707, 5438.396, 147.5007, 6.0912, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3951) +(@OGUID+346 , 181027, 530, 1, 1, 3012.275, 5442.078, 147.5007, 4.415683, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 3951) +(@OGUID+347 , 181027, 1, 1, 1, 9880.624, 2653.088, 1313.663, 2.879789, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 0) +(@OGUID+348 , 181027, 1, 1, 1, 10019.46, 2649.182, 1313.663, 5.044002, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 0) +(@OGUID+349 , 181027, 1, 1, 1, 10017.74, 2611.615, 1313.663, 3.054327, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 0) +(@OGUID+350 , 181027, 1, 1, 1, 9854.155, 2651.854, 1313.663, 1.343901, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 0) +(@OGUID+351 , 181027, 1, 1, 1, 10020.17, 2520.957, 1313.663, 0.7155849, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 0) +(@OGUID+352 , 181027, 1, 1, 1, 9810.941, 2549.63, 1313.663, 4.642576, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 1661) +(@OGUID+353 , 181027, 1, 1, 1, 9849.217, 2418.983, 1313.663, 1.221729, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 1661) +(@OGUID+354 , 181027, 1, 1, 1, 9825.401, 2650.506, 1313.663, 4.590216, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 1661) +(@OGUID+355 , 181027, 1, 1, 1, 9784.707, 2649.149, 1313.663, 4.24115, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 1661) +(@OGUID+356 , 181027, 1, 1, 1, 9715.958, 2650.025, 1313.663, 4.450591, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 1661) +(@OGUID+357 , 181027, 1, 1, 1, 9891.688, 2416.095, 1313.663, 2.652894, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 1661) +(@OGUID+358 , 181027, 1, 1, 1, 9819.463, 2391.367, 1313.663, 3.979355, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 1662) +(@OGUID+359 , 181027, 1, 1, 1, 9928.718, 2391.573, 1313.663, 2.670348, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 0) +(@OGUID+360 , 181027, 1, 1, 1, 9949.143, 2370.309, 1313.663, 2.408554, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 0) +(@OGUID+361 , 181027, 1, 1, 1, 10056.48, 2424.052, 1313.663, 2.617989, 0, 0, 0, 1, 120, 255, 1), -- 181027 (Area: 1660) +(@OGUID+362 , 181025, 571, 1, 1, 5422.828, -2574.388, 314.5182, 4.729844, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4275) +(@OGUID+363 , 181025, 571, 1, 1, 5490.349, -2575.417, 313.0533, 4.729844, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4275) +(@OGUID+364 , 181025, 571, 1, 1, 4524.684, -4252.019, 177.0246, 2.687807, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4159) +(@OGUID+365 , 181025, 571, 1, 1, 4532.347, -4148.53, 182.7989, 3.106652, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4159) +(@OGUID+366 , 181025, 571, 1, 1, 3881.886, -4516.897, 223.7292, 3.211419, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4205) +(@OGUID+367 , 181025, 571, 1, 1, 3431.319, -2776.561, 215.7577, 0.6457717, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 0) +(@OGUID+368 , 181025, 571, 1, 1, 3300.602, -2378.899, 117.8947, 4.939284, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 0) +(@OGUID+369 , 181025, 571, 1, 1, 3282.833, -2368.123, 117.8988, 3.42085, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 0) +(@OGUID+370 , 181025, 571, 1, 1, 3293.471, -2350.238, 117.6907, 1.884953, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 0) +(@OGUID+371 , 181025, 571, 1, 1, 3311.093, -2361.425, 117.9167, 0.2268925, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 0) +(@OGUID+372 , 181025, 571, 1, 1, 3346.118, -2225.082, 119.375, 2.042035, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4206) +(@OGUID+373 , 181025, 571, 1, 1, 3336.534, -2207.365, 120.0341, 5.288348, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4206) +(@OGUID+374 , 181025, 571, 1, 1, 3193.161, -2253.913, 117.8538, 1.727875, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4206) +(@OGUID+375 , 181025, 571, 1, 1, 3191.496, -2233.637, 117.8115, 4.694937, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4206) +(@OGUID+376 , 181025, 571, 1, 1, 3187.294, -2198.184, 141.9457, 3.822273, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4206) +(@OGUID+377 , 181025, 571, 1, 1, 3207.165, -2204.585, 142.3003, 5.253442, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4206) +(@OGUID+378 , 181025, 571, 1, 1, 3193.716, -2178.347, 141.7413, 2.076939, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4206) +(@OGUID+379 , 181025, 571, 1, 1, 1390.88, -3366.663, 194.8545, 1.396262, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 3998) +(@OGUID+380 , 181025, 571, 1, 1, 1350.993, -3356.948, 196.8577, 1.343901, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 3998) +(@OGUID+381 , 181025, 571, 1, 1, 3232.417, -718.9236, 167.9964, 2.076939, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4232) +(@OGUID+382 , 181025, 571, 1, 1, 3557.501, -768.2603, 203.7256, 5.113817, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 0) +(@OGUID+383 , 181025, 571, 1, 1, 3599.903, -757.4666, 199.1967, 4.76475, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 0) +(@OGUID+384 , 181025, 571, 1, 1, 3628.027, -668.0167, 244.9439, 3.892087, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 0) +(@OGUID+385 , 181025, 571, 1, 1, 3647.813, -648.9062, 243.9453, 0.7679439, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+386 , 181025, 571, 1, 1, 3634.617, -644.8275, 244.1315, 1.797689, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+387 , 181025, 571, 1, 1, 3641.374, -671.6805, 245.1112, 4.939284, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+388 , 181025, 571, 1, 1, 3650.591, -754.5084, 201.8451, 4.555311, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+389 , 181025, 571, 1, 1, 3695.235, -765.3697, 202.1208, 4.415683, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+390 , 181025, 571, 1, 1, 3767.403, -747.8274, 211.6567, 4.34587, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+391 , 181025, 571, 1, 1, 3779.269, -809.5614, 209.6387, 0.802851, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+392 , 181025, 571, 1, 1, 3815.78, -754.2736, 213.8814, 4.81711, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+393 , 181025, 571, 1, 1, 3800.189, -817.2236, 208.8302, 3.455756, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+394 , 181025, 571, 1, 1, 3816.917, -800.0577, 208.6812, 1.308995, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+395 , 181025, 571, 1, 1, 3826.977, -809.4998, 208.5766, 0.2617982, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+396 , 181025, 571, 1, 1, 3809.892, -826.8338, 208.5438, 4.433136, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+397 , 181025, 571, 1, 1, 3893.759, -696.3032, 261.979, 3.909541, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+398 , 181025, 571, 1, 1, 3928.128, -732.9033, 262.2497, 3.909541, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+399 , 181025, 571, 1, 1, 3905.213, -659.3301, 257.8033, 5.602507, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+400 , 181025, 571, 1, 1, 3966.297, -733.6108, 257.4371, 1.745327, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+401 , 181025, 571, 1, 1, 3893.384, -829.6746, 205.0926, 5.218536, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+402 , 181025, 571, 1, 1, 3847.43, -835.5692, 200.8211, 5.096362, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+403 , 181025, 571, 1, 1, 3807.228, -855.2426, 203.9786, 5.201083, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+404 , 181025, 571, 1, 1, 3797.328, -852.065, 204.1598, 3.630291, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4177) +(@OGUID+405 , 181025, 571, 1, 1, 3465.233, 228.1736, 59.31886, 3.263772, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4161) +(@OGUID+406 , 181025, 571, 1, 1, 3635.294, 245.6354, 58.86659, 0.06981169, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4161) +(@OGUID+407 , 181025, 571, 1, 1, 3628.324, 318.184, 59.31886, 0.2617982, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4161) +(@OGUID+408 , 181025, 571, 1, 1, 3457.301, 300.75, 59.31886, 3.071766, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4161) +(@OGUID+409 , 181025, 571, 1, 1, 3665.188, 265.6042, -109.3723, 0.1745321, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4161) +(@OGUID+410 , 181025, 571, 1, 1, 3661.484, 303.9514, -109.4306, 6.265733, 0, 0, 0, 1, 120, 255, 1), -- 181025 (Area: 4161) +(@OGUID+411 , 181022, 530, 1, 1, -1982.277, 5110.882, 7.504348, 4.590216, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 0) +(@OGUID+412 , 181022, 530, 1, 1, -1964.9, 5104.314, 7.514653, 4.049168, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 0) +(@OGUID+413 , 181022, 530, 1, 1, -1873.795, 4977.795, -22.33295, 5.096362, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 0) +(@OGUID+414 , 181022, 530, 1, 1, -1857.198, 4976.8, -22.56705, 4.188792, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 0) +(@OGUID+415 , 181022, 530, 1, 1, -1546.829, 5108.851, -20.84263, 6.073746, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 0) +(@OGUID+416 , 181022, 0, 1, 1, -8430.985, 596.3506, 94.62032, 3.455756, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 5150) +(@OGUID+417 , 181022, 0, 1, 1, -8538.67, 470.2, 104.521, 2.757613, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 5150) +(@OGUID+418 , 181022, 0, 1, 1, -8554.11, 459.615, 104.693, 1.762782, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 5150) +(@OGUID+419 , 181022, 0, 1, 1, -8732.06, 393.212, 98.2072, 1.343901, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 5149) +(@OGUID+420 , 181022, 0, 1, 1, -8434.75, 987.1312, 96.96603, 2.303831, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 0) +(@OGUID+421 , 181022, 0, 1, 1, -8509.754, 1041.872, 59.36489, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 0) +(@OGUID+422 , 181022, 0, 1, 1, -8402.518, 1059.08, 31.63022, 2.076939, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 0) +(@OGUID+423 , 181022, 0, 1, 1, -8424.703, 1075.745, 19.67526, 2.111848, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 0) +(@OGUID+424 , 181022, 0, 1, 1, -8533.77, 1066.152, 18.98668, 1.658062, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 0) +(@OGUID+425 , 181022, 0, 1, 1, -8616.668, 1038.597, 97.02485, 5.724681, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 0) +(@OGUID+426 , 181022, 0, 1, 1, -8519.527, 1122.33, 18.91462, 1.466076, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 4411) +(@OGUID+427 , 181022, 0, 1, 1, -8466.509, 1156.274, 18.6443, 3.124123, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 0) +(@OGUID+428 , 181022, 0, 1, 1, -8307.936, 1071.653, 57.26217, 1.954769, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 4411) +(@OGUID+429 , 181022, 0, 1, 1, -8408.185, 1193.769, 5.698709, 1.780234, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 4411) +(@OGUID+430 , 181022, 0, 1, 1, -8373.63, 1192.8, 5.891318, 1.413715, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 4411) +(@OGUID+431 , 181022, 0, 1, 1, -8468.239, 1192.766, 6.125231, 1.640607, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 4411) +(@OGUID+432 , 181022, 0, 1, 1, -8518.73, 1207.85, 5.42902, 1.239183, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 4411) +(@OGUID+433 , 181022, 0, 1, 1, -8535.98, 1207.91, 5.46386, 1.850049, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 4411) +(@OGUID+434 , 181022, 0, 1, 1, -8562.929, 1194.916, 5.592021, 2.007128, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 4411) +(@OGUID+435 , 181022, 0, 1, 1, -8550.538, 1159.076, 18.65301, 1.500983, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 4411) +(@OGUID+436 , 181022, 0, 1, 1, -8605.79, 1213.77, 5.11101, 6.178466, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 4411) +(@OGUID+437 , 181022, 0, 1, 1, -8614.11, 1303.04, 5.750293, 3.543024, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 4411) +(@OGUID+438 , 181022, 0, 1, 1, -8641.774, 1288.231, 5.232253, 0.383971, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 4411) +(@OGUID+439 , 181022, 0, 1, 1, -8281.283, 1156.497, 18.09047, 2.042035, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 4411) +(@OGUID+440 , 181022, 0, 1, 1, -8306.66, 1301.68, 8.51337, 0.05235888, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 4411) +(@OGUID+441 , 181022, 0, 1, 1, -8219.573, 1191.089, 5.684546, 1.553341, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 4411) +(@OGUID+442 , 181022, 0, 1, 1, -8274.7, 1300.65, 8.51445, 3.106652, 0, 0, 0, 1, 120, 255, 1), -- 181022 (Area: 4411) +(@OGUID+443 , 181021, 1, 1, 1, 7889.62, -2516.01, 494.46, 4.81711, 0, 0, 0, 1, 120, 255, 1), -- 181021 (Area: 656) +(@OGUID+444 , 181020, 1, 1, 1, 7889.29, -2513.85, 492.001, 1.710422, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 656) +(@OGUID+445 , 181020, 1, 1, 1, 7902.82, -2485, 492.101, 4.677484, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 2361) +(@OGUID+446 , 181020, 1, 1, 1, 7870.19, -2488.41, 492.335, 4.921829, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 2361) +(@OGUID+447 , 181020, 571, 1, 1, 3281.508, -2289.553, 109.7592, 1.06465, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 4248) +(@OGUID+448 , 181020, 571, 1, 1, 3264.85, -2273.001, 109.3768, 4.799657, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 4248) +(@OGUID+449 , 181020, 571, 1, 1, 3194.855, -2292.016, 108.0624, 0.1745321, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 4248) +(@OGUID+450 , 181020, 571, 1, 1, 3272.445, -2284.55, 109.6323, 1.134463, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 4248) +(@OGUID+451 , 181020, 571, 1, 1, 2309.714, 5207.694, 20.94551, 1.117009, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 0) +(@OGUID+452 , 181020, 571, 1, 1, 2282.703, 5218.596, 20.9829, 1.221729, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 0) +(@OGUID+453 , 181020, 571, 1, 1, 2264.359, 5199.473, 21.16698, 2.792518, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 0) +(@OGUID+454 , 181020, 571, 1, 1, 2296.557, 5212.993, 20.75707, 1.169369, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 0) +(@OGUID+455 , 181020, 530, 1, 1, -4063.597, 2172.937, 112.3214, 0.1047193, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 3745) +(@OGUID+456 , 181020, 530, 1, 1, -3006.309, 859.5955, -5.977011, 3.612838, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 3754) +(@OGUID+457 , 181020, 530, 1, 1, 244.1061, 7939.502, 31.13577, 3.735006, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 3645) +(@OGUID+458 , 181020, 530, 1, 1, 237.0487, 7913.604, 30.74815, 1.97222, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 3645) +(@OGUID+459 , 181020, 530, 1, 1, 213.9386, 7927.577, 30.98103, 0.4188786, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 3645) +(@OGUID+460 , 181020, 0, 1, 1, -8408.65, 635.033, 101.409, 5.462882, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 5150) +(@OGUID+461 , 181020, 0, 1, 1, -8511.38, 527.79, 109.868, 0.6632232, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 5150) +(@OGUID+462 , 181020, 0, 1, 1, -8612.712, 504.6371, 115.3036, 0.5759573, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 5150) +(@OGUID+463 , 181020, 0, 1, 1, -8633.32, 421.481, 104.761, 2.216565, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 5390) +(@OGUID+464 , 181020, 0, 1, 1, -8640.89, 415.503, 104.791, 2.216565, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 5390) +(@OGUID+465 , 181020, 0, 1, 1, -8680.8, 461.089, 105.228, 5.375615, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 5390) +(@OGUID+466 , 181020, 0, 1, 1, -8719.567, 507.9125, 107.5373, 2.18166, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 5390) +(@OGUID+467 , 181020, 0, 1, 1, -8588.407, 706.8125, 108.9887, 2.18166, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 5390) +(@OGUID+468 , 181020, 0, 1, 1, -8665.82, 741.175, 108.709, 0.7330382, 0, 0, 0, 1, 120, 255, 1), -- 181020 (Area: 5390) +(@OGUID+469 , 181019, 571, 1, 1, 5177.153, -2180.084, 236.5424, 4.555311, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+470 , 181019, 571, 1, 1, 5192.435, -2209.911, 239.3982, 3.804818, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+471 , 181019, 571, 1, 1, 5157.259, -2201.744, 237.5309, 6.073746, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+472 , 181019, 571, 1, 1, 5137.096, -2201.546, 237.8019, 4.485497, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+473 , 181019, 571, 1, 1, 5157.712, -2215.265, 238.4418, 1.553341, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+474 , 181019, 571, 1, 1, 5141.539, -2211.604, 238.1585, 0.2967052, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+475 , 181019, 571, 1, 1, 3877.073, -4546.678, 210.972, 0.4537851, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+476 , 181019, 571, 1, 1, 3874.093, -4541.467, 210.1389, 3.33359, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+477 , 181019, 571, 1, 1, 3838.456, -4544.684, 209.2909, 2.530723, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+478 , 181019, 571, 1, 1, 3407.589, -2786.686, 202.9973, 5.637414, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+479 , 181019, 571, 1, 1, 3412.483, -2783.082, 202.9972, 3.57793, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+480 , 181019, 571, 1, 1, 3424.167, -2769.674, 201.4191, 0.9424766, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+481 , 181019, 571, 1, 1, 1432.413, -3253.822, 166.571, 5.288348, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 3998) +(@OGUID+482 , 181019, 571, 1, 1, 1425.667, -3261.837, 165.5927, 1.710422, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 3998) +(@OGUID+483 , 181019, 571, 1, 1, 1422.948, -3265.153, 165.6199, 4.32842, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 3998) +(@OGUID+484 , 181019, 571, 1, 1, 701.3621, -2933.383, -3.068485, 0.5235979, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 3987) +(@OGUID+485 , 181019, 571, 1, 1, 701.6729, -2935.085, -3.068489, 1.623156, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 3987) +(@OGUID+486 , 181019, 571, 1, 1, 3630.212, -709.9004, 215.4509, 4.66003, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+487 , 181019, 571, 1, 1, 3630.091, -711.7509, 215.451, 3.944446, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+488 , 181019, 571, 1, 1, 3629.777, -714.9827, 215.4509, 3.281239, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+489 , 181019, 571, 1, 1, 3629.591, -716.7711, 215.4509, 2.111848, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+490 , 181019, 571, 1, 1, 3658.893, -693.3231, 223.6275, 1.413715, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4177) +(@OGUID+491 , 181019, 571, 1, 1, 3660.452, -698.0406, 223.6275, 2.809975, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4177) +(@OGUID+492 , 181019, 571, 1, 1, 3653.071, -692.7104, 223.6275, 0.6457717, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4177) +(@OGUID+493 , 181019, 571, 1, 1, 3655.911, -710.7966, 227.4318, 3.525572, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4177) +(@OGUID+494 , 181019, 571, 1, 1, 3650.309, -697.8465, 223.6275, 3.194002, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4177) +(@OGUID+495 , 181019, 571, 1, 1, 3658.077, -721.1656, 216.2393, 5.358162, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4177) +(@OGUID+496 , 181019, 571, 1, 1, 3653.49, -720.2332, 216.2393, 2.809975, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4177) +(@OGUID+497 , 181019, 571, 1, 1, 3655.506, -720.5035, 216.2393, 1.448622, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4177) +(@OGUID+498 , 181019, 571, 1, 1, 3652.148, -720.3037, 216.2393, 0.03490625, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4177) +(@OGUID+499 , 181019, 571, 1, 1, 3560.058, 249.0957, 45.70548, 0.9773831, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4161) +(@OGUID+500 , 181019, 571, 1, 1, 3529.886, 252.3539, 45.7051, 3.316144, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4161) +(@OGUID+501 , 181019, 571, 1, 1, 3573.747, 275.6775, 45.70752, 5.061456, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4161) +(@OGUID+502 , 181019, 571, 1, 1, 3521.046, 280.9596, 45.70491, 0.5585039, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4161) +(@OGUID+503 , 181019, 571, 1, 1, 3555.038, 299.0926, 45.70468, 3.141593, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4161) +(@OGUID+504 , 181019, 571, 1, 1, 3497.954, 1962.59, 67.00489, 5.148723, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4158) +(@OGUID+505 , 181019, 571, 1, 1, 3489.518, 1973.308, 66.71261, 4.171338, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4158) +(@OGUID+506 , 181019, 571, 1, 1, 3515.049, 1995.76, 66.57986, 5.515242, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4158) +(@OGUID+507 , 181019, 571, 1, 1, 3498.045, 1985.921, 66.4942, 1.466076, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4158) +(@OGUID+508 , 181019, 571, 1, 1, 3472.785, 1978.688, 66.46651, 1.274088, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4158) +(@OGUID+509 , 181019, 571, 1, 1, 2292.771, 5195.491, 16.54581, 1.692969, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+510 , 181019, 571, 1, 1, 2295.146, 5194.604, 16.54581, 3.752462, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+511 , 181019, 571, 1, 1, 4502.473, 5716.374, 83.2963, 5.742135, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 0) +(@OGUID+512 , 181019, 571, 1, 1, 5546.444, 5741.974, -75.40535, 3.560473, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4285) +(@OGUID+513 , 181019, 571, 1, 1, 5565.401, 5770.03, -74.08703, 5.689774, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4285) +(@OGUID+514 , 181019, 571, 1, 1, 5558.145, 5760.761, -76.66797, 2.286379, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4285) +(@OGUID+515 , 181019, 571, 1, 1, 5543.533, 5732.819, -75.00607, 4.450591, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4285) +(@OGUID+516 , 181019, 571, 1, 1, 5564.951, 5763.742, -74.10497, 4.293513, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4285) +(@OGUID+517 , 181019, 571, 1, 1, 5592.455, 5748.157, -70.19862, 0.4537851, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 4284) +(@OGUID+518 , 181019, 530, 1, 1, -1746.561, 5164.543, -35.90803, 5.201083, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 3899) +(@OGUID+519 , 181019, 530, 1, 1, -1722.684, 5148.509, -34.71685, 5.98648, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 3899) +(@OGUID+520 , 181019, 530, 1, 1, -1719.891, 5141.935, -34.7064, 4.363324, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 3899) +(@OGUID+521 , 181019, 530, 1, 1, -1720.093, 5141.122, -34.81209, 5.166176, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 3899) +(@OGUID+522 , 181019, 530, 1, 1, -1721.997, 5148.342, -34.72364, 2.199115, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 3899) +(@OGUID+523 , 181019, 530, 1, 1, -1742.537, 5152.636, -35.90804, 2.164206, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 3899) +(@OGUID+524 , 181019, 530, 1, 1, -1750.601, 5150.047, -36.30908, 4.468043, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 3899) +(@OGUID+525 , 181019, 530, 1, 1, -1753.868, 5159.522, -36.26046, 1.134463, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 3899) +(@OGUID+526 , 181019, 530, 1, 1, -1759.773, 5151.993, -36.28824, 1.466076, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 3899) +(@OGUID+527 , 181019, 530, 1, 1, -1778.798, 5125.128, -34.73267, 4.188792, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 3899) +(@OGUID+528 , 181019, 530, 1, 1, -1779.195, 5124.315, -34.74682, 5.951575, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 3899) +(@OGUID+529 , 181019, 530, 1, 1, -1780.604, 5132.849, -34.73998, 1.832595, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 3899) +(@OGUID+530 , 181019, 530, 1, 1, -1781.082, 5132.91, -34.72391, 4.625124, 0, 0, 0, 1, 120, 255, 1), -- 181019 (Area: 3899) +(@OGUID+531 , 181018, 571, 1, 1, 5815.427, 553.2634, 653.1058, 0.1745321, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4395) +(@OGUID+532 , 181018, 571, 1, 1, 5823.227, 554.9146, 653.1237, 6.178466, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4395) +(@OGUID+533 , 181018, 571, 1, 1, 5812.321, 551.391, 653.0699, 3.979355, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4395) +(@OGUID+534 , 181018, 571, 1, 1, 5819.637, 554.3771, 653.1036, 3.438303, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4395) +(@OGUID+535 , 181018, 571, 1, 1, 5827.601, 553.8232, 653.1969, 3.019413, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4395) +(@OGUID+536 , 181018, 571, 1, 1, 5808.787, 548.7609, 653.1042, 1.029743, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4395) +(@OGUID+537 , 181018, 571, 1, 1, 5855.679, 631.2502, 649.3745, 5.619962, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4395) +(@OGUID+538 , 181018, 571, 1, 1, 5853.158, 644.6632, 660.192, 0.087266, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4395) +(@OGUID+539 , 181018, 571, 1, 1, 5861.551, 637.7972, 649.4493, 5.759588, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4395) +(@OGUID+540 , 181018, 571, 1, 1, 5852.249, 653.2101, 660.2052, 0.2268925, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4395) +(@OGUID+541 , 181018, 571, 1, 1, 5834.877, 510.3333, 659.3004, 3.57793, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4395) +(@OGUID+542 , 181018, 571, 1, 1, 5828.073, 508.0534, 659.3159, 0.2268925, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4395) +(@OGUID+543 , 181018, 571, 1, 1, 5852.142, 667.3889, 649.5994, 0.802851, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4395) +(@OGUID+544 , 181018, 571, 1, 1, 5859.842, 660.3542, 649.3377, 0.5759573, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4395) +(@OGUID+545 , 181018, 571, 1, 1, 5879.179, 527.6025, 643.5471, 1.780234, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4395) +(@OGUID+546 , 181018, 571, 1, 1, 5733.871, 670.8108, 646.9722, 5.67232, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4739) +(@OGUID+547 , 181018, 571, 1, 1, 5739.494, 677.6687, 646.9604, 5.619962, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4739) +(@OGUID+548 , 181018, 571, 1, 1, 5761.328, 717.7375, 642.4337, 4.206246, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4739) +(@OGUID+549 , 181018, 571, 1, 1, 5756.841, 712.12, 642.4337, 0.7853968, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4739) +(@OGUID+550 , 181018, 571, 1, 1, 5888.802, 529.829, 643.4706, 1.797689, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4613) +(@OGUID+551 , 181018, 571, 1, 1, 5910.6, 572.0917, 642.006, 4.34587, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4613) +(@OGUID+552 , 181018, 571, 1, 1, 5920.077, 557.5112, 641.9263, 2.757613, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4613) +(@OGUID+553 , 181018, 571, 1, 1, 5668.451, 683.9045, 655.4852, 5.881761, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4568) +(@OGUID+554 , 181018, 571, 1, 1, 5662.25, 669.692, 655.4854, 5.777041, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4568) +(@OGUID+555 , 181018, 571, 1, 1, 5944.854, 630.399, 654.0372, 2.792518, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4613) +(@OGUID+556 , 181018, 571, 1, 1, 5939.464, 615.9524, 654.1125, 2.670348, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4613) +(@OGUID+557 , 181018, 571, 1, 1, 6127.377, -1046.22, 405.7823, 3.124123, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4419) +(@OGUID+558 , 181018, 571, 1, 1, 6113.523, -1046.297, 406.5891, 0.05235888, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4419) +(@OGUID+559 , 181018, 571, 1, 1, 5745.579, -3534.724, 396.685, 5.026549, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 0) +(@OGUID+560 , 181018, 571, 1, 1, 5769.655, -3530.542, 396.8302, 4.904376, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4324) +(@OGUID+561 , 181018, 571, 1, 1, 3854.253, -4497.099, 208.4463, 2.635444, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4205) +(@OGUID+562 , 181018, 571, 1, 1, 3845.263, -4506.483, 208.0879, 2.33874, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 0) +(@OGUID+563 , 181018, 571, 1, 1, 3865.145, -4556.175, 211.0864, 3.159062, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 0) +(@OGUID+564 , 181018, 571, 1, 1, 3876.38, -4541.031, 209.7021, 4.520406, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 0) +(@OGUID+565 , 181018, 571, 1, 1, 3858.301, -4564.549, 210.1741, 1.396262, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 0) +(@OGUID+566 , 181018, 571, 1, 1, 1421.958, -3261.318, 175.9854, 2.478367, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 3998) +(@OGUID+567 , 181018, 571, 1, 1, 724.0819, -2929.729, 7.998729, 0.1396245, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 3987) +(@OGUID+568 , 181018, 571, 1, 1, 437.3842, -4539.971, 252.3735, 3.054327, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 3991) +(@OGUID+569 , 181018, 571, 1, 1, 438.4343, -4546.447, 249.3452, 3.001947, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 3991) +(@OGUID+570 , 181018, 571, 1, 1, 442.4383, -4552.802, 249.542, 4.415683, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 3991) +(@OGUID+571 , 181018, 571, 1, 1, 447.4662, -4556.945, 252.1781, 4.398232, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 3991) +(@OGUID+572 , 181018, 571, 1, 1, 481.2321, -4523.523, 260.9968, 3.700105, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 3991) +(@OGUID+573 , 181018, 571, 1, 1, 572.9479, -4943.799, 27.1676, 3.47321, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 3981) +(@OGUID+574 , 181018, 571, 1, 1, 585.9739, -4954.365, 22.9537, 4.310966, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 3981) +(@OGUID+575 , 181018, 571, 1, 1, 592.2986, -4952.793, 23.01477, 5.567601, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 3981) +(@OGUID+576 , 181018, 571, 1, 1, 1896.369, -6177.458, 28.25126, 0.2792516, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4000) +(@OGUID+577 , 181018, 571, 1, 1, 1886.857, -6181.003, 26.00835, 4.32842, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4000) +(@OGUID+578 , 181018, 571, 1, 1, 1883.005, -6173.481, 30.73777, 1.867502, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4000) +(@OGUID+579 , 181018, 571, 1, 1, 1889.537, -6174.26, 27.78375, 1.675514, 0, 0, 0, 1, 120, 255, 1), -- 181018 (Area: 4000) +(@OGUID+580 , 181017, 571, 1, 1, 5809.249, 576.0026, 657.8462, 4.799657, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4395) +(@OGUID+581 , 181017, 571, 1, 1, 5783.142, 561.5955, 655.6302, 0.9250238, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4395) +(@OGUID+582 , 181017, 571, 1, 1, 5843.796, 569.7678, 656.4412, 2.460913, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4395) +(@OGUID+583 , 181017, 571, 1, 1, 5753.474, 616.6545, 656.3826, 4.01426, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4395) +(@OGUID+584 , 181017, 571, 1, 1, 5755.206, 632.1685, 667.4127, 3.281239, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4395) +(@OGUID+585 , 181017, 571, 1, 1, 5859.036, 634.3795, 653.5594, 5.567601, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4395) +(@OGUID+586 , 181017, 571, 1, 1, 5730.578, 607.2695, 652.4564, 0.9075702, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4395) +(@OGUID+587 , 181017, 571, 1, 1, 5881.26, 611.1509, 654.602, 2.408554, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4395) +(@OGUID+588 , 181017, 571, 1, 1, 5750.088, 646.9669, 655.8947, 2.460913, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4395) +(@OGUID+589 , 181017, 571, 1, 1, 5886.485, 624.7205, 653.5937, 2.44346, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4395) +(@OGUID+590 , 181017, 571, 1, 1, 5855.724, 664.5695, 653.6199, 0.8726639, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4395) +(@OGUID+591 , 181017, 571, 1, 1, 5802.563, 689.8659, 664.4053, 1.675514, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4395) +(@OGUID+592 , 181017, 571, 1, 1, 5786.861, 691.6611, 652.8747, 2.408554, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4739) +(@OGUID+593 , 181017, 571, 1, 1, 5817.452, 694.9246, 652.8608, 0.8726639, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4739) +(@OGUID+594 , 181017, 571, 1, 1, 5733.013, 677.092, 652.2612, 5.585054, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4739) +(@OGUID+595 , 181017, 571, 1, 1, 5872.592, 687.6406, 650.2322, 3.979355, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4739) +(@OGUID+596 , 181017, 571, 1, 1, 5858.502, 699.9028, 647.2755, 4.01426, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4739) +(@OGUID+597 , 181017, 571, 1, 1, 5768.054, 709.3629, 623.4171, 5.602507, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4739) +(@OGUID+598 , 181017, 571, 1, 1, 5835.142, 720.0156, 646.1909, 3.996807, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4613) +(@OGUID+599 , 181017, 571, 1, 1, 5760.299, 713.8768, 652.3187, 5.67232, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4739) +(@OGUID+600 , 181017, 571, 1, 1, 5901.187, 684.3663, 647.5936, 2.391098, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4739) +(@OGUID+601 , 181017, 571, 1, 1, 5873.009, 725.3192, 647.5492, 1.797689, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4739) +(@OGUID+602 , 181017, 571, 1, 1, 5768.548, 732.4496, 646.0042, 5.759588, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4739) +(@OGUID+603 , 181017, 571, 1, 1, 5893.215, 706.2971, 646.8101, 0.9075702, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4739) +(@OGUID+604 , 181017, 571, 1, 1, 5864.956, 738.7273, 644.807, 5.078908, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4739) +(@OGUID+605 , 181017, 571, 1, 1, 5909.327, 661.7327, 649.2336, 3.944446, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4739) +(@OGUID+606 , 181017, 571, 1, 1, 5883.444, 741.7843, 644.4044, 4.921829, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4739) +(@OGUID+607 , 181017, 571, 1, 1, 5885.01, 524.2327, 648.1631, 1.850049, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4613) +(@OGUID+608 , 181017, 571, 1, 1, 5687.88, 620.0889, 652.0167, 0.5585039, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4613) +(@OGUID+609 , 181017, 571, 1, 1, 5675.364, 631.4016, 652.0096, 0.5235979, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4567) +(@OGUID+610 , 181017, 571, 1, 1, 5671.868, 646.4288, 651.8803, 0.2792516, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4613) +(@OGUID+611 , 181017, 571, 1, 1, 5668.864, 712.5075, 647.7338, 4.01426, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4568) +(@OGUID+612 , 181017, 571, 1, 1, 5679.624, 720.0261, 647.5791, 2.478367, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4568) +(@OGUID+613 , 181017, 571, 1, 1, 5679.613, 720.0153, 659.1891, 2.426008, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4568) +(@OGUID+614 , 181017, 571, 1, 1, 5665.726, 718.7106, 647.9514, 3.368496, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4568) +(@OGUID+615 , 181017, 571, 1, 1, 5670.651, 730.9137, 647.9866, 2.234018, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4568) +(@OGUID+616 , 181017, 571, 1, 1, 5677.255, 732.9352, 647.86, 1.623156, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4568) +(@OGUID+617 , 181017, 571, 1, 1, 5666.311, 725.6754, 647.9023, 2.687807, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4568) +(@OGUID+618 , 181017, 571, 1, 1, 5915.079, 710.2083, 646.6064, 3.036838, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4613) +(@OGUID+619 , 181017, 571, 1, 1, 5915.948, 728.4288, 646.2543, 3.071766, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4613) +(@OGUID+620 , 181017, 571, 1, 1, 5901.741, 746.0184, 645.2678, 4.468043, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4613) +(@OGUID+621 , 181017, 571, 1, 1, 6654.499, -190.9763, 956.8075, 0.4188786, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4428) +(@OGUID+622 , 181017, 571, 1, 1, 6676.616, -199.1265, 954.8306, 3.33359, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4428) +(@OGUID+623 , 181017, 571, 1, 1, 6653.604, -203.6228, 954.6893, 5.759588, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4428) +(@OGUID+624 , 181017, 571, 1, 1, 6663.807, -184.6699, 958.2155, 3.944446, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4428) +(@OGUID+625 , 181017, 571, 1, 1, 6685.919, -206.6383, 953.6956, 3.874631, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4428) +(@OGUID+626 , 181017, 571, 1, 1, 6122.517, -1074.911, 407.3852, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4419) +(@OGUID+627 , 181017, 571, 1, 1, 4596.626, -4237.616, 181.8922, 2.303831, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4159) +(@OGUID+628 , 181017, 571, 1, 1, 4551.28, -4238.457, 173.6895, 2.408554, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4159) +(@OGUID+629 , 181017, 571, 1, 1, 3403.195, -2797.129, 217.5549, 0.6806767, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+630 , 181017, 571, 1, 1, 3407.778, -2803.883, 205.8443, 4.520406, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+631 , 181017, 571, 1, 1, 3388.071, -2808.053, 207.0942, 3.717554, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+632 , 181017, 571, 1, 1, 3389.364, -2800.435, 207.4506, 2.18166, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+633 , 181017, 571, 1, 1, 3396.49, -2809.565, 207.4137, 5.323256, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+634 , 181017, 571, 1, 1, 3422.459, -2783.034, 207.0113, 3.804818, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+635 , 181017, 571, 1, 1, 3431.648, -2776.44, 207.109, 0.6108634, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+636 , 181017, 571, 1, 1, 3270.23, -2299.017, 105.3505, 1.047198, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+637 , 181017, 571, 1, 1, 3280.345, -2211.232, 127.4082, 2.705255, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4206) +(@OGUID+638 , 181017, 571, 1, 1, 3272.255, -2192.748, 127.4287, 4.293513, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4206) +(@OGUID+639 , 181017, 571, 1, 1, 3253.434, -2199.932, 127.3124, 5.93412, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4206) +(@OGUID+640 , 181017, 571, 1, 1, 2129.331, -2957.729, 155.2842, 0.3665176, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4070) +(@OGUID+641 , 181017, 571, 1, 1, 2122.887, -2959.943, 155.2807, 3.47321, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4070) +(@OGUID+642 , 181017, 571, 1, 1, 2127.25, -2962.019, 155.3076, 4.991644, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4070) +(@OGUID+643 , 181017, 571, 1, 1, 2124.927, -2955.563, 154.9684, 1.850049, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4070) +(@OGUID+644 , 181017, 571, 1, 1, 2128.509, -2993.269, 155.7663, 1.710422, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+645 , 181017, 571, 1, 1, 2129.307, -3000.026, 155.8247, 4.852017, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+646 , 181017, 571, 1, 1, 2125.529, -2997.12, 155.7463, 3.33359, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+647 , 181017, 571, 1, 1, 2132.394, -2996.245, 155.8432, 0.122173, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+648 , 181017, 571, 1, 1, 1474.518, -3279.563, 178.9401, 0.8203033, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4071) +(@OGUID+649 , 181017, 571, 1, 1, 1465.599, -3290.57, 178.7285, 3.961899, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4071) +(@OGUID+650 , 181017, 571, 1, 1, 1425.031, -3316.349, 173.5113, 2.094393, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4071) +(@OGUID+651 , 181017, 571, 1, 1, 1461.297, -3264.238, 183.4601, 0.8377575, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4071) +(@OGUID+652 , 181017, 571, 1, 1, 1428.773, -3274.498, 181.0417, 4.01426, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3998) +(@OGUID+653 , 181017, 571, 1, 1, 1426.495, -3265.443, 172.1592, 2.426008, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3998) +(@OGUID+654 , 181017, 571, 1, 1, 1431.548, -3252.894, 183.7873, 2.44346, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3998) +(@OGUID+655 , 181017, 571, 1, 1, 1449.89, -3254.639, 183.1299, 0.9075702, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3998) +(@OGUID+656 , 181017, 571, 1, 1, 713.499, -2931.399, 2.876178, 0.1396245, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3987) +(@OGUID+657 , 181017, 571, 1, 1, 454.9619, -4528.652, 251.8441, 5.270896, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3991) +(@OGUID+658 , 181017, 571, 1, 1, 463.7049, -4534.563, 254.9479, 3.717554, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3991) +(@OGUID+659 , 181017, 571, 1, 1, 465.882, -4545.663, 251.8806, 2.076939, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3991) +(@OGUID+660 , 181017, 571, 1, 1, 445.4201, -4640.561, 253.3178, 2.076939, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3991) +(@OGUID+661 , 181017, 571, 1, 1, 486.4948, -4520.141, 239.7659, 3.735006, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3991) +(@OGUID+662 , 181017, 571, 1, 1, 587.5087, -4945.893, 32.49911, 4.886924, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3981) +(@OGUID+663 , 181017, 571, 1, 1, 578.7986, -4942.297, 23.31465, 3.403396, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3981) +(@OGUID+664 , 181017, 571, 1, 1, 597.412, -5011.138, 9.712256, 6.003934, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3981) +(@OGUID+665 , 181017, 571, 1, 1, 548.7562, -5021.973, 17.47475, 1.745327, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3981) +(@OGUID+666 , 181017, 571, 1, 1, 639.2745, -5012.341, 11.1266, 3.38594, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3981) +(@OGUID+667 , 181017, 571, 1, 1, 1881.401, -6201.038, 33.84504, 1.169369, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4000) +(@OGUID+668 , 181017, 571, 1, 1, 1872.579, -6219.774, 42.40208, 1.099556, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4000) +(@OGUID+669 , 181017, 571, 1, 1, 1949.33, -6147.306, 31.00299, 2.862335, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4000) +(@OGUID+670 , 181017, 571, 1, 1, 1933.835, -6188.439, 30.40494, 1.710422, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4000) +(@OGUID+671 , 181017, 571, 1, 1, 1966.471, -6119.723, 41.52581, 4.06662, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4000) +(@OGUID+672 , 181017, 571, 1, 1, 1955.997, -6111.83, 41.53107, 4.084071, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4000) +(@OGUID+673 , 181017, 571, 1, 1, 1960.26, -6117.287, 41.52031, 3.996807, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4000) +(@OGUID+674 , 181017, 571, 1, 1, 1971.802, -6102.198, 73.7106, 0.9250238, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4000) +(@OGUID+675 , 181017, 571, 1, 1, 2469.7, -5056.41, 296.0691, 3.019413, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4003) +(@OGUID+676 , 181017, 571, 1, 1, 2496.864, -5066.933, 302.6931, 6.161013, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4003) +(@OGUID+677 , 181017, 571, 1, 1, 2477.306, -5073.561, 291.6375, 3.036838, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4003) +(@OGUID+678 , 181017, 571, 1, 1, 2475.982, -5063.151, 289.1608, 4.607672, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4003) +(@OGUID+679 , 181017, 571, 1, 1, 2483.536, -5065.366, 301.6975, 3.071766, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4003) +(@OGUID+680 , 181017, 571, 1, 1, 2501.505, -5059.525, 285.9003, 6.161013, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4003) +(@OGUID+681 , 181017, 571, 1, 1, 2485.302, -5048.401, 296.4124, 1.466076, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4003) +(@OGUID+682 , 181017, 571, 1, 1, 2673.549, -4383.29, 290.4919, 2.600535, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+683 , 181017, 571, 1, 1, 3243.007, -716.868, 174.0614, 1.151916, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4232) +(@OGUID+684 , 181017, 571, 1, 1, 3230.017, -756.3438, 174.0186, 5.288348, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4232) +(@OGUID+685 , 181017, 571, 1, 1, 3215.221, -748.2292, 173.9813, 3.106652, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4232) +(@OGUID+686 , 181017, 571, 1, 1, 3226.663, -687.4913, 176.1088, 5.794494, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4232) +(@OGUID+687 , 181017, 571, 1, 1, 3221.048, -666.5087, 175.2865, 0.9948372, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4232) +(@OGUID+688 , 181017, 571, 1, 1, 3212.471, -667.382, 175.2803, 2.617989, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4232) +(@OGUID+689 , 181017, 571, 1, 1, 3203.728, -675.9549, 175.5281, 2.635444, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4186) +(@OGUID+690 , 181017, 571, 1, 1, 3654.854, -700.4598, 228.6396, 1.396262, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4177) +(@OGUID+691 , 181017, 571, 1, 1, 3663.722, -720.0434, 224.0076, 6.230826, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4177) +(@OGUID+692 , 181017, 571, 1, 1, 3668.486, -717.066, 218.9095, 6.230826, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4177) +(@OGUID+693 , 181017, 571, 1, 1, 3667.354, -727.1337, 218.3601, 6.126106, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4177) +(@OGUID+694 , 181017, 571, 1, 1, 3668.153, -722.3611, 218.7, 6.108654, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4177) +(@OGUID+695 , 181017, 571, 1, 1, 3665.362, -707.243, 221.1085, 6.126106, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4177) +(@OGUID+696 , 181017, 571, 1, 1, 3521.09, 240.6755, 53.60065, 0.8901166, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4161) +(@OGUID+697 , 181017, 571, 1, 1, 3577.127, 249.5916, 53.55267, 2.460913, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4161) +(@OGUID+698 , 181017, 571, 1, 1, 3515.238, 299.4315, 53.53123, 5.585054, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4161) +(@OGUID+699 , 181017, 571, 1, 1, 3570.422, 301.9106, 53.45552, 4.031712, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4161) +(@OGUID+700 , 181017, 571, 1, 1, 4986.635, 1237.804, 232.5177, 4.293513, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4170) +(@OGUID+701 , 181017, 571, 1, 1, 5013.381, 1244.962, 238.3039, 5.969027, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4170) +(@OGUID+702 , 181017, 571, 1, 1, 5006.911, 1195.97, 235.5182, 2.44346, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4170) +(@OGUID+703 , 181017, 571, 1, 1, 5027.013, 1209.431, 233.9405, 0.9773831, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4170) +(@OGUID+704 , 181017, 571, 1, 1, 5027.053, 1209.406, 240.235, 1.082103, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4170) +(@OGUID+705 , 181017, 571, 1, 1, 3464.886, 4177.207, 24.38719, 4.642576, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4037) +(@OGUID+706 , 181017, 571, 1, 1, 2314.894, 5185.276, 23.48018, 4.363324, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+707 , 181017, 571, 1, 1, 2274.934, 5189.169, 26.13615, 4.258607, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+708 , 181017, 571, 1, 1, 2303.014, 5208.549, 27.68204, 1.186823, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+709 , 181017, 571, 1, 1, 2320.047, 5198.47, 23.71446, 1.151916, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+710 , 181017, 571, 1, 1, 2270.002, 5197.174, 17.32868, 2.740162, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+711 , 181017, 571, 1, 1, 2288.641, 5214.336, 27.50825, 1.169369, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+712 , 181017, 571, 1, 1, 2270.879, 5210.542, 28.94806, 2.757613, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+713 , 181017, 571, 1, 1, 2769.89, 6123.314, 96.68723, 3.822273, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4020) +(@OGUID+714 , 181017, 571, 1, 1, 2815.303, 6165.526, 90.96311, 3.944446, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4129) +(@OGUID+715 , 181017, 571, 1, 1, 3624.583, 5913.436, 144.8049, 2.094393, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4023) +(@OGUID+716 , 181017, 571, 1, 1, 4172.988, 5271.836, 40.90479, 2.565632, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4108) +(@OGUID+717 , 181017, 571, 1, 1, 4173.983, 5280.55, 30.62882, 6.213374, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4108) +(@OGUID+718 , 181017, 571, 1, 1, 4165.883, 5280.938, 31.36931, 3.089183, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4108) +(@OGUID+719 , 181017, 571, 1, 1, 4174.368, 5270.975, 41.0957, 5.637414, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4108) +(@OGUID+720 , 181017, 571, 1, 1, 5543.419, 5736.716, -72.88883, 2.583081, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4285) +(@OGUID+721 , 181017, 571, 1, 1, 5562.838, 5767.768, -69.31071, 3.036838, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4285) +(@OGUID+722 , 181017, 571, 1, 1, 5549.516, 5738.056, -72.93507, 0.9948372, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4285) +(@OGUID+723 , 181017, 571, 1, 1, 5577.761, 5766.71, -69.34008, 6.230826, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4285) +(@OGUID+724 , 181017, 571, 1, 1, 5544.886, 5730.654, -72.89562, 4.153885, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4285) +(@OGUID+725 , 181017, 571, 1, 1, 5550.921, 5732.03, -72.89473, 5.742135, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4285) +(@OGUID+726 , 181017, 571, 1, 1, 5569.917, 5759.858, -69.32285, 4.677484, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4285) +(@OGUID+727 , 181017, 571, 1, 1, 5570.901, 5774.635, -69.3968, 1.448622, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4285) +(@OGUID+728 , 181017, 571, 1, 1, 5584.953, 5748.914, -68.31659, 3.281239, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4284) +(@OGUID+729 , 181017, 530, 1, 1, -2176.667, 5405.86, 58.44925, 0.5235979, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3898) +(@OGUID+730 , 181017, 530, 1, 1, -1905.432, 5771.346, 137.7419, 5.288348, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+731 , 181017, 530, 1, 1, -1892.362, 5766.126, 137.6966, 6.161013, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 0) +(@OGUID+732 , 181017, 530, 1, 1, -2659.457, 4386.914, 39.52228, 0.8203033, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3683) +(@OGUID+733 , 181017, 530, 1, 1, -2587.3, 4469.175, 40.08729, 3.281239, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3683) +(@OGUID+734 , 181017, 530, 1, 1, -2671.876, 4457.92, 42.83185, 5.270896, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3683) +(@OGUID+735 , 181017, 530, 1, 1, -2648.931, 4478.227, 39.93041, 2.652894, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3683) +(@OGUID+736 , 181017, 530, 1, 1, -2967.964, 4020.805, 7.264894, 5.67232, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3684) +(@OGUID+737 , 181017, 530, 1, 1, -2987.704, 4030.75, 7.28573, 2.478367, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3684) +(@OGUID+738 , 181017, 530, 1, 1, -2923.89, 4017.942, 8.344274, 3.665196, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3684) +(@OGUID+739 , 181017, 530, 1, 1, -2982.132, 3981.363, 8.745137, 6.230826, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3684) +(@OGUID+740 , 181017, 530, 1, 1, -2931.291, 3931.274, 8.816035, 1.902409, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3684) +(@OGUID+741 , 181017, 530, 1, 1, -3022.694, 2624.565, 85.78185, 3.909541, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3744) +(@OGUID+742 , 181017, 530, 1, 1, -2972.565, 2562.675, 83.66947, 5.829401, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3744) +(@OGUID+743 , 181017, 530, 1, 1, -2955.605, 2554.495, 110.3285, 5.846854, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3744) +(@OGUID+744 , 181017, 530, 1, 1, -2927.35, 2650.861, 100.1286, 3.822273, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3744) +(@OGUID+745 , 181017, 530, 1, 1, -4010.367, 2155.552, 109.9921, 1.06465, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3745) +(@OGUID+746 , 181017, 530, 1, 1, -4058.762, 2175.685, 117.8552, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3745) +(@OGUID+747 , 181017, 530, 1, 1, -709.4097, 2704.609, 99.62894, 4.694937, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3538) +(@OGUID+748 , 181017, 530, 1, 1, -717.0001, 2714.823, 100.4722, 3.124123, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3538) +(@OGUID+749 , 181017, 530, 1, 1, -716.9244, 2718.473, 100.4844, 3.106652, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3538) +(@OGUID+750 , 181017, 530, 1, 1, -716.8802, 2742.702, 100.7903, 3.176533, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3538) +(@OGUID+751 , 181017, 530, 1, 1, -690.7932, 2724.943, 100.9289, 6.265733, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3538) +(@OGUID+752 , 181017, 530, 1, 1, 181.4262, 2624.335, 98.51126, 2.18166, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3536) +(@OGUID+753 , 181017, 530, 1, 1, -249.9205, 5495.466, 36.7147, 5.323256, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3565) +(@OGUID+754 , 181017, 530, 1, 1, 282.6363, 6085.975, 137.649, 4.747296, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3644) +(@OGUID+755 , 181017, 530, 1, 1, 237.8501, 7911.491, 30.4785, 5.113817, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3645) +(@OGUID+756 , 181017, 530, 1, 1, 236.9491, 7913.625, 30.50175, 1.97222, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3645) +(@OGUID+757 , 181017, 530, 1, 1, 223.4775, 7943.311, 30.76142, 5.131269, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3645) +(@OGUID+758 , 181017, 530, 1, 1, 244.0695, 7939.386, 30.92426, 3.438303, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3645) +(@OGUID+759 , 181017, 530, 1, 1, 214.1629, 7927.679, 30.72031, 0.4014249, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3645) +(@OGUID+760 , 181017, 530, 1, 1, 195.0323, 8490.546, 35.5514, 0.6632232, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3656) +(@OGUID+761 , 181017, 530, 1, 1, 264.8356, 8492.754, 34.60779, 2.129301, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3656) +(@OGUID+762 , 181017, 530, 1, 1, 272.1655, 8509.436, 32.72204, 3.700105, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3656) +(@OGUID+763 , 181017, 530, 1, 1, 219.5999, 8569.107, 33.13798, 4.677484, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3649) +(@OGUID+764 , 181017, 530, 1, 1, -2713.36, 7298.445, 51.91501, 5.846854, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3626) +(@OGUID+765 , 181017, 530, 1, 1, -2698.241, 7291.552, 49.91637, 5.969027, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3626) +(@OGUID+766 , 181017, 530, 1, 1, -2730.689, 7306.021, 51.7765, 2.740162, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3626) +(@OGUID+767 , 181017, 530, 1, 1, -2677.658, 7203.919, 32.99669, 1.204277, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3626) +(@OGUID+768 , 181017, 530, 1, 1, -2775.226, 7326.033, 51.77103, 5.829401, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3626) +(@OGUID+769 , 181017, 530, 1, 1, 1955.625, 6885.821, 167.1296, 4.468043, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3771) +(@OGUID+770 , 181017, 530, 1, 1, 2009.813, 6871.413, 188.1808, 4.24115, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3772) +(@OGUID+771 , 181017, 530, 1, 1, 2032.214, 6819.37, 181.5125, 3.874631, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3772) +(@OGUID+772 , 181017, 530, 1, 1, 2031.963, 6825.553, 181.5333, 2.426008, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3772) +(@OGUID+773 , 181017, 530, 1, 1, 2038.027, 6826.094, 181.4816, 0.8377575, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3772) +(@OGUID+774 , 181017, 530, 1, 1, 2038.565, 6819.838, 181.4885, 5.550147, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3772) +(@OGUID+775 , 181017, 530, 1, 1, 2062.016, 6825.854, 184.7832, 4.729844, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3772) +(@OGUID+776 , 181017, 530, 1, 1, 2063.305, 6759.898, 173.2681, 4.694937, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3772) +(@OGUID+777 , 181017, 530, 1, 1, 2163.694, 6745.077, 172.4085, 4.049168, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3772) +(@OGUID+778 , 181017, 530, 1, 1, 2162.737, 6751.214, 172.4385, 2.495818, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3772) +(@OGUID+779 , 181017, 530, 1, 1, 2168.956, 6752.182, 172.4387, 0.9250238, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3772) +(@OGUID+780 , 181017, 530, 1, 1, 2169.925, 6745.97, 172.4366, 5.67232, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3772) +(@OGUID+781 , 181017, 530, 1, 1, 3026.51, 5497.439, 151.5307, 3.700105, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3951) +(@OGUID+782 , 181017, 530, 1, 1, 3016.612, 5445.069, 151.877, 2.146753, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3951) +(@OGUID+783 , 181017, 530, 1, 1, 2155.25, 4720.381, 160.9449, 3.036838, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3844) +(@OGUID+784 , 181017, 530, 1, 1, 2154.756, 4716.656, 160.9547, 3.001947, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3844) +(@OGUID+785 , 181017, 530, 1, 1, 2035.05, 4693.116, 154.7217, 1.850049, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3844) +(@OGUID+786 , 181017, 530, 1, 1, 2031.468, 4692.11, 154.7591, 1.884953, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3844) +(@OGUID+787 , 181017, 530, 1, 1, 2962.525, 3697.009, 150.2677, 1.466076, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3712) +(@OGUID+788 , 181017, 530, 1, 1, 3061.875, 3647.259, 149.6342, 2.373644, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3712) +(@OGUID+789 , 181017, 530, 1, 1, 4103.79, 3058.691, 345.6179, 3.525572, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3738) +(@OGUID+790 , 181017, 530, 1, 1, 4125.446, 3068.064, 345.6248, 3.525572, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 3738) +(@OGUID+791 , 181016, 1, 1, 1, 7867.43, -2562.63, 486.946, 6.003934, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 656) +(@OGUID+792 , 181016, 1, 1, 1, 7942.2, -2640.05, 492.378, 1.919862, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 656) +(@OGUID+793 , 181016, 1, 1, 1, 7925.89, -2636.76, 492.584, 1.047198, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 656) +(@OGUID+794 , 181016, 1, 1, 1, 7942.56, -2571.39, 488.843, 4.939284, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 656) +(@OGUID+795 , 181016, 1, 1, 1, 7938.42, -2585.05, 488.907, 0.5934101, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 656) +(@OGUID+796 , 181016, 1, 1, 1, 7910.97, -2575.69, 488.582, 1.989672, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 656) +(@OGUID+797 , 181016, 1, 1, 1, 7915.88, -2561.99, 488.201, 2.949595, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 656) +(@OGUID+798 , 181016, 1, 1, 1, 7912.61, -2504.64, 489.276, 2.705255, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 656) +(@OGUID+799 , 181016, 1, 1, 1, 7862.59, -2495.27, 489.275, 5.550147, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 2361) +(@OGUID+800 , 181016, 1, 1, 1, 7910.7, -2488.95, 489.272, 3.769912, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 2361) +(@OGUID+801 , 181016, 1, 1, 1, 7864, -2510.33, 489.275, 0.9250238, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 2361) +(@OGUID+802 , 181016, 1, 1, 1, 7821.1, -2479.85, 486.84, 6.248279, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 2361) +(@OGUID+803 , 181016, 1, 1, 1, 7790.67, -2422.31, 488.341, 5.358162, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 2361) +(@OGUID+804 , 181016, 1, 1, 1, 7477.78, -2130.38, 492.102, 2.321287, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+805 , 181016, 571, 1, 1, 5843.04, 581.1298, 651.76, 2.775069, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+806 , 181016, 571, 1, 1, 5797.108, 551.8475, 661.095, 0.5759573, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+807 , 181016, 571, 1, 1, 5763.885, 572.2188, 649.8002, 0.9424766, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+808 , 181016, 571, 1, 1, 5803.461, 547.2244, 660.9998, 1.308995, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+809 , 181016, 571, 1, 1, 5789.479, 641.6511, 647.4436, 0.6283169, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+810 , 181016, 571, 1, 1, 5864.823, 610.4653, 650.7043, 1.745327, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+811 , 181016, 571, 1, 1, 5745.615, 586.7101, 649.3102, 0.9250238, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+812 , 181016, 571, 1, 1, 5839.251, 641.2769, 647.5121, 0.2792516, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+813 , 181016, 571, 1, 1, 5761.894, 592.8934, 613.7905, 0.8901166, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+814 , 181016, 571, 1, 1, 5776.402, 530.3011, 641.5594, 0.7504908, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+815 , 181016, 571, 1, 1, 5807.717, 654.8577, 647.4246, 5.427975, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+816 , 181016, 571, 1, 1, 5846.925, 644.6152, 658.404, 2.722713, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+817 , 181016, 571, 1, 1, 5748.025, 626.0618, 660.9924, 0.7155849, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+818 , 181016, 571, 1, 1, 5825.186, 655.9732, 647.5557, 4.223697, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+819 , 181016, 571, 1, 1, 5735.165, 606.0434, 647.9391, 1.518436, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+820 , 181016, 571, 1, 1, 5743.978, 624.6772, 648.4809, 3.543024, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+821 , 181016, 571, 1, 1, 5845.924, 652.1758, 658.404, 3.560473, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+822 , 181016, 571, 1, 1, 5746.787, 636.5056, 660.9924, 5.916668, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+823 , 181016, 571, 1, 1, 5833.373, 645.4617, 609.1575, 2.530723, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+824 , 181016, 571, 1, 1, 5822.227, 502.8376, 657.378, 4.66003, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+825 , 181016, 571, 1, 1, 5840.909, 508.295, 657.4862, 4.694937, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+826 , 181016, 571, 1, 1, 5898.554, 629.4965, 646.7423, 0.8552105, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4395) +(@OGUID+827 , 181016, 571, 1, 1, 5796.696, 707.4605, 641.7041, 1.762782, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4739) +(@OGUID+828 , 181016, 571, 1, 1, 5805.41, 708.4702, 641.4802, 1.675514, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4739) +(@OGUID+829 , 181016, 571, 1, 1, 5751.683, 681.7147, 613.2468, 5.567601, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4739) +(@OGUID+830 , 181016, 571, 1, 1, 5750.272, 691.2866, 618.5539, 5.375615, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4739) +(@OGUID+831 , 181016, 571, 1, 1, 5845.667, 696.0077, 610.6929, 4.153885, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4739) +(@OGUID+832 , 181016, 571, 1, 1, 5867.476, 689.2825, 643.1117, 4.049168, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4739) +(@OGUID+833 , 181016, 571, 1, 1, 5734.079, 690.025, 646.5366, 3.176533, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4739) +(@OGUID+834 , 181016, 571, 1, 1, 5826.764, 723.2586, 641.2166, 3.979355, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4613) +(@OGUID+835 , 181016, 571, 1, 1, 5904.524, 663.1807, 643.8438, 4.06662, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4739) +(@OGUID+836 , 181016, 571, 1, 1, 5773.907, 718.0335, 618.5657, 5.67232, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4739) +(@OGUID+837 , 181016, 571, 1, 1, 5756.162, 712.4989, 618.5643, 5.585054, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4739) +(@OGUID+838 , 181016, 571, 1, 1, 5771.891, 737.5848, 641.4211, 5.567601, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4739) +(@OGUID+839 , 181016, 571, 1, 1, 5914.837, 700.7205, 641.8951, 2.879789, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4739) +(@OGUID+840 , 181016, 571, 1, 1, 5823.329, 760.0555, 640.327, 4.258607, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4739) +(@OGUID+841 , 181016, 571, 1, 1, 5882.65, 517.4098, 641.9064, 5.427975, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4613) +(@OGUID+842 , 181016, 571, 1, 1, 5886.956, 526.6721, 642.1017, 2.146753, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4613) +(@OGUID+843 , 181016, 571, 1, 1, 5921.778, 619.2034, 645.9958, 1.937312, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4613) +(@OGUID+844 , 181016, 571, 1, 1, 5890.065, 519.4915, 641.9147, 4.188792, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4613) +(@OGUID+845 , 181016, 571, 1, 1, 5694.438, 614.2162, 646.6755, 0.5235979, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4613) +(@OGUID+846 , 181016, 571, 1, 1, 5676.881, 659.645, 647.1504, 0.157079, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4613) +(@OGUID+847 , 181016, 571, 1, 1, 5648.303, 675.3729, 651.9927, 2.670348, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4568) +(@OGUID+848 , 181016, 571, 1, 1, 5663.514, 682.673, 651.9452, 4.991644, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4568) +(@OGUID+849 , 181016, 571, 1, 1, 5663.002, 663.5723, 654.331, 0.3316107, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4568) +(@OGUID+850 , 181016, 571, 1, 1, 5673.695, 687.83, 654.3299, 4.834563, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4568) +(@OGUID+851 , 181016, 571, 1, 1, 5685.707, 679.8306, 646.3728, 5.393069, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4568) +(@OGUID+852 , 181016, 571, 1, 1, 5659.298, 673.91, 651.942, 0.1919852, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4568) +(@OGUID+853 , 181016, 571, 1, 1, 5654.433, 690.0082, 651.9927, 2.757613, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4568) +(@OGUID+854 , 181016, 571, 1, 1, 5668.66, 718.72, 653.374, 0.3665176, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4568) +(@OGUID+855 , 181016, 571, 1, 1, 5677.676, 730.4684, 653.3763, 4.380776, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4568) +(@OGUID+856 , 181016, 571, 1, 1, 5630.848, 705.8953, 651.9803, 5.096362, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4568) +(@OGUID+857 , 181016, 571, 1, 1, 5620.479, 681.7556, 651.9917, 0.03490625, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4568) +(@OGUID+858 , 181016, 571, 1, 1, 5704.065, 734.105, 641.7964, 0.8377575, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4568) +(@OGUID+859 , 181016, 571, 1, 1, 5716.991, 723.6447, 641.6827, 0.9075702, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4568) +(@OGUID+860 , 181016, 571, 1, 1, 5710.433, 728.6938, 641.7766, 0.8552105, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4568) +(@OGUID+861 , 181016, 571, 1, 1, 5739.42, 737.81, 656.8243, 3.874631, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4568) +(@OGUID+862 , 181016, 571, 1, 1, 5642.215, 754.7111, 641.5667, 3.961899, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4568) +(@OGUID+863 , 181016, 571, 1, 1, 5740.807, 738.6092, 641.7399, 3.159062, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4568) +(@OGUID+864 , 181016, 571, 1, 1, 5726.913, 764.369, 644.1921, 4.782203, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4568) +(@OGUID+865 , 181016, 571, 1, 1, 5787.012, 774.6193, 661.2783, 4.380776, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4740) +(@OGUID+866 , 181016, 571, 1, 1, 5803.736, 772.4315, 661.2783, 4.468043, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4740) +(@OGUID+867 , 181016, 571, 1, 1, 5808.237, 791.7759, 632.587, 5.515242, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4740) +(@OGUID+868 , 181016, 571, 1, 1, 5892.815, 743.408, 639.8414, 4.729844, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4613) +(@OGUID+869 , 181016, 571, 1, 1, 5929.599, 639.7736, 645.5601, 3.647741, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4613) +(@OGUID+870 , 181016, 571, 1, 1, 5943.547, 636.654, 652.9702, 3.246347, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4613) +(@OGUID+871 , 181016, 571, 1, 1, 5947.679, 626.1014, 650.5775, 3.438303, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4613) +(@OGUID+872 , 181016, 571, 1, 1, 5934.438, 611.9415, 652.9656, 2.007128, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4613) +(@OGUID+873 , 181016, 571, 1, 1, 5944.347, 617.7059, 650.5828, 2.111848, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4613) +(@OGUID+874 , 181016, 571, 1, 1, 5958.763, 626.1614, 650.6269, 5.98648, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4613) +(@OGUID+875 , 181016, 571, 1, 1, 5953.268, 610.4814, 650.6269, 5.951575, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4613) +(@OGUID+876 , 181016, 571, 1, 1, 5978.208, 595.1833, 650.6149, 2.076939, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4618) +(@OGUID+877 , 181016, 571, 1, 1, 5988.101, 621.1797, 650.6269, 3.490667, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4618) +(@OGUID+878 , 181016, 571, 1, 1, 5845.724, 435.9962, 657.6264, 2.740162, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4616) +(@OGUID+879 , 181016, 571, 1, 1, 5788.177, 425.141, 657.5775, 0.7504908, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4564) +(@OGUID+880 , 181016, 571, 1, 1, 6675.403, -194.668, 951.2613, 3.787367, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4428) +(@OGUID+881 , 181016, 571, 1, 1, 6677.512, -203.657, 951.2575, 2.722713, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4428) +(@OGUID+882 , 181016, 571, 1, 1, 6664.053, -252.1919, 962.2114, 4.433136, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4428) +(@OGUID+883 , 181016, 571, 1, 1, 6195.851, -1050.231, 410.5798, 2.757613, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4419) +(@OGUID+884 , 181016, 571, 1, 1, 6128.463, -1071.167, 402.915, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4419) +(@OGUID+885 , 181016, 571, 1, 1, 6143.565, -1062.889, 402.4637, 3.909541, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4419) +(@OGUID+886 , 181016, 571, 1, 1, 6181.414, -1060.371, 410.6938, 1.343901, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4419) +(@OGUID+887 , 181016, 571, 1, 1, 6132.971, -1080.292, 402.5479, 3.211419, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4419) +(@OGUID+888 , 181016, 571, 1, 1, 6105.885, -1064.441, 403.3065, 5.759588, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4419) +(@OGUID+889 , 181016, 571, 1, 1, 6104.259, -1076.63, 403.506, 1.53589, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4419) +(@OGUID+890 , 181016, 571, 1, 1, 5221.921, -1337.251, 241.8586, 5.253442, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+891 , 181016, 571, 1, 1, 5235.554, -1320.319, 242.1471, 6.073746, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+892 , 181016, 571, 1, 1, 5233.944, -1309.333, 242.7248, 0.2617982, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+893 , 181016, 571, 1, 1, 5209.904, -1336.67, 242.6071, 4.572764, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+894 , 181016, 571, 1, 1, 5228.022, -1298.785, 242.8026, 0.7504908, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+895 , 181016, 571, 1, 1, 5197.744, -1301.545, 244.1698, 5.602507, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+896 , 181016, 571, 1, 1, 5170.655, -2175.094, 236.524, 3.979355, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+897 , 181016, 571, 1, 1, 5174.28, -2190.904, 236.5399, 3.159062, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+898 , 181016, 571, 1, 1, 5196.799, -2208.144, 239.3988, 2.932139, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+899 , 181016, 571, 1, 1, 5135.955, -2183.239, 236.8366, 5.689774, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+900 , 181016, 571, 1, 1, 5135.756, -2204.338, 236.5436, 0.383971, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+901 , 181016, 571, 1, 1, 5153.606, -2216.569, 236.805, 1.919862, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+902 , 181016, 571, 1, 1, 5190.787, -2215.081, 239.3982, 2.495818, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+903 , 181016, 571, 1, 1, 5382.32, -2632.782, 303.9539, 0.087266, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+904 , 181016, 571, 1, 1, 5408.356, -2679.761, 303.9539, 1.012289, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+905 , 181016, 571, 1, 1, 5406.375, -2612.042, 303.9539, 3.194002, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+906 , 181016, 571, 1, 1, 5436.389, -2618.382, 306.5511, 5.567601, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+907 , 181016, 571, 1, 1, 5464.559, -2619.046, 306.5511, 3.717554, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4275) +(@OGUID+908 , 181016, 571, 1, 1, 5500.086, -2657.195, 303.9539, 6.126106, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4275) +(@OGUID+909 , 181016, 571, 1, 1, 5526.226, -2674.84, 303.9539, 2.513274, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4275) +(@OGUID+910 , 181016, 571, 1, 1, 5528.214, -2651.125, 303.9539, 2.775069, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4275) +(@OGUID+911 , 181016, 571, 1, 1, 5527.774, -2637.863, 303.9539, 3.106652, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4275) +(@OGUID+912 , 181016, 571, 1, 1, 5750.8, -3535.454, 389.0267, 5.532695, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4324) +(@OGUID+913 , 181016, 571, 1, 1, 5764.8, -3532.155, 388.3556, 4.450591, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4324) +(@OGUID+914 , 181016, 571, 1, 1, 5789.338, -3595.79, 388.8241, 2.967041, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4324) +(@OGUID+915 , 181016, 571, 1, 1, 5783.694, -3600.81, 387.7156, 2.35619, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4324) +(@OGUID+916 , 181016, 571, 1, 1, 5758.551, -3620.203, 385.8352, 0.6632232, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4324) +(@OGUID+917 , 181016, 571, 1, 1, 5774.17, -3614.33, 387.6901, 3.316144, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4324) +(@OGUID+918 , 181016, 571, 1, 1, 5794.01, -3586.305, 388.6537, 2.495818, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4324) +(@OGUID+919 , 181016, 571, 1, 1, 5790.555, -3548.062, 387.1112, 3.735006, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4323) +(@OGUID+920 , 181016, 571, 1, 1, 4604.299, -4216.11, 178.7165, 3.909541, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+921 , 181016, 571, 1, 1, 4578.913, -4263.682, 182.0264, 1.221729, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4159) +(@OGUID+922 , 181016, 571, 1, 1, 4585.377, -4225.431, 178.0588, 2.548179, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4159) +(@OGUID+923 , 181016, 571, 1, 1, 4574.175, -4252.902, 182.2079, 0.1919852, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4159) +(@OGUID+924 , 181016, 571, 1, 1, 4544.073, -4208.386, 170.6733, 4.694937, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4159) +(@OGUID+925 , 181016, 571, 1, 1, 4554.03, -4232.887, 170.6884, 2.740162, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4159) +(@OGUID+926 , 181016, 571, 1, 1, 4550.191, -4182.836, 173.4989, 1.518436, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4159) +(@OGUID+927 , 181016, 571, 1, 1, 4549.178, -4253.708, 170.7494, 2.076939, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4159) +(@OGUID+928 , 181016, 571, 1, 1, 4531.979, -4176.561, 173.4836, 6.178466, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4159) +(@OGUID+929 , 181016, 571, 1, 1, 3854.53, -4499.983, 208.0386, 2.82743, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4205) +(@OGUID+930 , 181016, 571, 1, 1, 3883.566, -4522.057, 217.378, 2.635444, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4205) +(@OGUID+931 , 181016, 571, 1, 1, 3848.002, -4506.846, 207.7856, 1.867502, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+932 , 181016, 571, 1, 1, 3844.868, -4517.594, 210.5048, 5.323256, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+933 , 181016, 571, 1, 1, 3866.024, -4531.325, 209.7259, 3.33359, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+934 , 181016, 571, 1, 1, 3835.15, -4527.149, 210.6371, 5.742135, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+935 , 181016, 571, 1, 1, 3871.145, -4567.245, 207.5447, 5.619962, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+936 , 181016, 571, 1, 1, 3847.246, -4556.365, 210.1268, 0.8377575, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+937 , 181016, 571, 1, 1, 3413.37, -2812.231, 200.4576, 5.078908, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+938 , 181016, 571, 1, 1, 3432.563, -2829.036, 201.7036, 1.97222, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+939 , 181016, 571, 1, 1, 3414.616, -2778.184, 201.5204, 5.201083, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+940 , 181016, 571, 1, 1, 3428.656, -2766.984, 200.3678, 2.251473, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+941 , 181016, 571, 1, 1, 3457.128, -2785.357, 201.2523, 0.1745321, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+942 , 181016, 571, 1, 1, 3452.198, -2755.466, 199.3946, 3.298687, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4204) +(@OGUID+943 , 181016, 571, 1, 1, 3441.72, -2747.261, 199.3887, 4.799657, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4204) +(@OGUID+944 , 181016, 571, 1, 1, 3302.054, -2350.771, 108.8892, 2.076939, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+945 , 181016, 571, 1, 1, 3316.353, -2328.825, 111.0914, 2.565632, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+946 , 181016, 571, 1, 1, 3225.829, -2298.399, 107.2934, 0.8377575, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+947 , 181016, 571, 1, 1, 3267.523, -2271.925, 114.2197, 2.199115, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4248) +(@OGUID+948 , 181016, 571, 1, 1, 3237.112, -2271.502, 113.9172, 1.605702, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4248) +(@OGUID+949 , 181016, 571, 1, 1, 3344.212, -2203.41, 119.4523, 0.3316107, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4206) +(@OGUID+950 , 181016, 571, 1, 1, 3294.673, -2261.47, 111.9283, 3.926996, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4206) +(@OGUID+951 , 181016, 571, 1, 1, 3323.304, -2296.872, 110.1093, 2.460913, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4206) +(@OGUID+952 , 181016, 571, 1, 1, 3308.395, -2221.642, 115.808, 5.550147, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4206) +(@OGUID+953 , 181016, 571, 1, 1, 3352.523, -2221.079, 119.4523, 0.4014249, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4206) +(@OGUID+954 , 181016, 571, 1, 1, 3268.585, -2230.661, 116.8297, 3.804818, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4206) +(@OGUID+955 , 181016, 571, 1, 1, 3286.429, -2201.523, 117.3726, 3.839725, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4206) +(@OGUID+956 , 181016, 571, 1, 1, 3248.892, -2223.04, 116.8297, 4.799657, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4206) +(@OGUID+957 , 181016, 571, 1, 1, 3184.458, -2253.973, 114.8628, 2.408554, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4206) +(@OGUID+958 , 181016, 571, 1, 1, 3183.712, -2235.236, 114.8628, 3.926996, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4206) +(@OGUID+959 , 181016, 571, 1, 1, 3093.765, -2252.836, 97.05368, 3.490667, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+960 , 181016, 571, 1, 1, 2549.787, -1992.145, 8.439572, 4.66003, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4242) +(@OGUID+961 , 181016, 571, 1, 1, 2538.165, -1999.59, 8.439572, 5.742135, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4242) +(@OGUID+962 , 181016, 571, 1, 1, 2554.446, -1931.769, 3.000129, 2.565632, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4242) +(@OGUID+963 , 181016, 571, 1, 1, 2493.727, -1921.882, 10.72953, 0.1919852, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4242) +(@OGUID+964 , 181016, 571, 1, 1, 2503.962, -1936.449, 10.39561, 1.012289, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4242) +(@OGUID+965 , 181016, 571, 1, 1, 2553.7, -1912.366, 2.313859, 3.804818, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4242) +(@OGUID+966 , 181016, 571, 1, 1, 2485.413, -1882.31, 9.955285, 5.881761, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4242) +(@OGUID+967 , 181016, 571, 1, 1, 2485.737, -1895.543, 10.02251, 0.5061446, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4242) +(@OGUID+968 , 181016, 571, 1, 1, 2559.23, -1828.403, 10.51216, 2.321287, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4242) +(@OGUID+969 , 181016, 571, 1, 1, 2546.487, -1837.444, 10.57294, 1.954769, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4242) +(@OGUID+970 , 181016, 571, 1, 1, 2600.053, -1802.445, 10.64246, 1.134463, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4242) +(@OGUID+971 , 181016, 571, 1, 1, 2595.78, -1789.134, 10.64246, 5.585054, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4242) +(@OGUID+972 , 181016, 571, 1, 1, 2491.829, -1845.16, 10.7064, 5.654869, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4242) +(@OGUID+973 , 181016, 571, 1, 1, 2497.92, -1838.303, 10.55219, 5.323256, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4242) +(@OGUID+974 , 181016, 571, 1, 1, 2438.875, -1853.441, 1.204814, 0.2443456, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4242) +(@OGUID+975 , 181016, 571, 1, 1, 2444.651, -1838.691, 1.022343, 5.131269, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4242) +(@OGUID+976 , 181016, 571, 1, 1, 2117.118, -2965.382, 148.6169, 4.031712, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4070) +(@OGUID+977 , 181016, 571, 1, 1, 2109.816, -2988.45, 148.3804, 2.18166, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4070) +(@OGUID+978 , 181016, 571, 1, 1, 2140.401, -2968.399, 148.3356, 4.433136, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+979 , 181016, 571, 1, 1, 2142.096, -2984.892, 148.9165, 1.937312, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+980 , 181016, 571, 1, 1, 1435.889, -3265.063, 178.2813, 0.1396245, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3998) +(@OGUID+981 , 181016, 571, 1, 1, 1394.399, -3307.07, 166.7923, 1.902409, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3998) +(@OGUID+982 , 181016, 571, 1, 1, 1428.256, -3256.8, 165.615, 2.199115, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3998) +(@OGUID+983 , 181016, 571, 1, 1, 1408.13, -3251.247, 162.0143, 3.787367, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3998) +(@OGUID+984 , 181016, 571, 1, 1, 1401.351, -3262.329, 163.0069, 2.251473, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3998) +(@OGUID+985 , 181016, 571, 1, 1, 1370.036, -3334.958, 173.685, 4.852017, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3998) +(@OGUID+986 , 181016, 571, 1, 1, 1458.753, -3200.1, 165.5917, 3.054327, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4380) +(@OGUID+987 , 181016, 571, 1, 1, 1341.442, -3276.221, 174.6177, 4.537859, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4380) +(@OGUID+988 , 181016, 571, 1, 1, 1352.596, -3284.401, 174.7101, 3.508117, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4380) +(@OGUID+989 , 181016, 571, 1, 1, 1349.468, -3297.907, 174.7129, 2.460913, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4380) +(@OGUID+990 , 181016, 571, 1, 1, 1371.299, -3185.653, 162.8225, 2.111848, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4380) +(@OGUID+991 , 181016, 571, 1, 1, 1355.771, -3193.905, 162.8225, 2.024579, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3998) +(@OGUID+992 , 181016, 571, 1, 1, 1400.156, -3458.59, 174.5718, 2.234018, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3998) +(@OGUID+993 , 181016, 571, 1, 1, 1351.665, -3457.366, 175.9246, 1.675514, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3998) +(@OGUID+994 , 181016, 571, 1, 1, 1431.132, -3152.292, 164.8159, 3.560473, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4071) +(@OGUID+995 , 181016, 571, 1, 1, 1429.037, -3131.07, 167.7346, 3.543024, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3998) +(@OGUID+996 , 181016, 571, 1, 1, 1416.06, -3120.286, 167.5702, 4.34587, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3998) +(@OGUID+997 , 181016, 571, 1, 1, 1389.093, -3096.109, 167.4995, 3.700105, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3998) +(@OGUID+998 , 181016, 571, 1, 1, 765.1684, -2962.793, 9.955372, 6.021387, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3987) +(@OGUID+999 , 181016, 571, 1, 1, 784.9827, -2956.3, 8.627842, 4.171338, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3987) +(@OGUID+1000, 181016, 571, 1, 1, 731.5729, -2945.844, 9.658432, 0.5585039, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3987) +(@OGUID+1001, 181016, 571, 1, 1, 807.6268, -2945.674, 6.90544, 1.675514, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3987) +(@OGUID+1002, 181016, 571, 1, 1, 728.2534, -2936.78, 8.08532, 0.9773831, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3987) +(@OGUID+1003, 181016, 571, 1, 1, 726.3077, -2921.696, 7.548036, 6.073746, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3987) +(@OGUID+1004, 181016, 571, 1, 1, 811.6979, -2925.72, 7.491168, 3.47321, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3987) +(@OGUID+1005, 181016, 571, 1, 1, 738.8159, -2917.706, 7.83575, 5.777041, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3987) +(@OGUID+1006, 181016, 571, 1, 1, 708.9809, -2939.207, -3.255977, 2.722713, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3987) +(@OGUID+1007, 181016, 571, 1, 1, 733.0174, -2896.646, 7.161568, 5.742135, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3987) +(@OGUID+1008, 181016, 571, 1, 1, 786.5696, -2895.316, 7.331877, 2.652894, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3987) +(@OGUID+1009, 181016, 571, 1, 1, 706.6024, -2924.741, -3.165701, 3.996807, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3987) +(@OGUID+1010, 181016, 571, 1, 1, 785.3965, -2856.019, 4.484005, 4.415683, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3988) +(@OGUID+1011, 181016, 571, 1, 1, 775.6638, -2854.298, 4.683801, 4.607672, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3988) +(@OGUID+1012, 181016, 571, 1, 1, 785.8663, -2882.146, 4.527083, 3.979355, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3988) +(@OGUID+1013, 181016, 571, 1, 1, 400.0066, -4535.086, 246.1532, 4.258607, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3991) +(@OGUID+1014, 181016, 571, 1, 1, 404.2422, -4538.7, 245.8211, 3.769912, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3991) +(@OGUID+1015, 181016, 571, 1, 1, 434.1599, -4539.468, 245.8032, 2.967041, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3991) +(@OGUID+1016, 181016, 571, 1, 1, 446.3067, -4559.884, 245.5032, 4.363324, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3991) +(@OGUID+1017, 181016, 571, 1, 1, 403.795, -4652.395, 243.9677, 2.18166, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3991) +(@OGUID+1018, 181016, 571, 1, 1, 412.7631, -4658.49, 246.6353, 0.3490652, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3991) +(@OGUID+1019, 181016, 571, 1, 1, 493.6993, -4605.006, 243.6478, 3.316144, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3991) +(@OGUID+1020, 181016, 571, 1, 1, 584.0461, -4934.744, 29.65519, 1.029743, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3981) +(@OGUID+1021, 181016, 571, 1, 1, 577.2066, -4954.415, 18.2157, 3.106652, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3981) +(@OGUID+1022, 181016, 571, 1, 1, 569.7136, -4931.643, 17.79272, 3.33359, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3981) +(@OGUID+1023, 181016, 571, 1, 1, 569.194, -5003.27, 11.0998, 2.949595, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3981) +(@OGUID+1024, 181016, 571, 1, 1, 540.1192, -4999.92, 10.53384, 4.782203, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4379) +(@OGUID+1025, 181016, 571, 1, 1, 563.828, -5017.783, 11.59005, 2.076939, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4379) +(@OGUID+1026, 181016, 571, 1, 1, 575.377, -5101.069, 5.191134, 0.6981314, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3981) +(@OGUID+1027, 181016, 571, 1, 1, 641.0491, -5019.355, 4.459393, 3.211419, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3981) +(@OGUID+1028, 181016, 571, 1, 1, 604.1622, -5108.14, 4.842274, 1.623156, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3981) +(@OGUID+1029, 181016, 571, 1, 1, 1882.581, -6170.531, 23.82956, 0.8377575, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4000) +(@OGUID+1030, 181016, 571, 1, 1, 1899.31, -6178.332, 24.02914, 1.151916, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4000) +(@OGUID+1031, 181016, 571, 1, 1, 1919.915, -6182.599, 24.47692, 1.727875, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4000) +(@OGUID+1032, 181016, 571, 1, 1, 1927.329, -6186.836, 24.11248, 1.727875, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4000) +(@OGUID+1033, 181016, 571, 1, 1, 2021.995, -6214.678, 7.750907, 2.094393, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4000) +(@OGUID+1034, 181016, 571, 1, 1, 2429.847, -5168.776, 277.1109, 1.291542, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4003) +(@OGUID+1035, 181016, 571, 1, 1, 2429.503, -5159.25, 277.0016, 5.061456, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4003) +(@OGUID+1036, 181016, 571, 1, 1, 2417.962, -5122.142, 276.594, 5.270896, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4003) +(@OGUID+1037, 181016, 571, 1, 1, 2438.945, -5120.976, 275.9086, 2.408554, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4003) +(@OGUID+1038, 181016, 571, 1, 1, 2476.26, -5072.812, 283.0372, 3.804818, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4003) +(@OGUID+1039, 181016, 571, 1, 1, 2422.845, -5074.851, 272.2427, 0, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4003) +(@OGUID+1040, 181016, 571, 1, 1, 2462.827, -5023.975, 283.7139, 5.410522, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4003) +(@OGUID+1041, 181016, 571, 1, 1, 2464.117, -5036.913, 283.7561, 0.7330382, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4003) +(@OGUID+1042, 181016, 571, 1, 1, 2657.285, -4403.338, 283.9217, 1.500983, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1043, 181016, 571, 1, 1, 2681.398, -4378.912, 282.9612, 1.989672, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1044, 181016, 571, 1, 1, 2642.45, -4384.394, 283.2693, 6.03884, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1045, 181016, 571, 1, 1, 2654.31, -4365.038, 277.5075, 2.495818, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1046, 181016, 571, 1, 1, 2681.611, -4385.324, 284.4337, 4.555311, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1047, 181016, 571, 1, 1, 2675.206, -4331.749, 289.7764, 0.8203033, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1048, 181016, 571, 1, 1, 2620.654, -4361.461, 276.4902, 5.602507, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1049, 181016, 571, 1, 1, 3296.599, -736.467, 176.1194, 4.031712, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1050, 181016, 571, 1, 1, 3260.281, -749.4948, 168.42, 1.117009, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1051, 181016, 571, 1, 1, 3309.448, -746.7072, 179.006, 3.892087, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1052, 181016, 571, 1, 1, 3274.188, -755.2222, 168.0432, 2.286379, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1053, 181016, 571, 1, 1, 3261.053, -755.9268, 174.2897, 1.117009, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1054, 181016, 571, 1, 1, 3266.31, -712.2863, 172.5281, 4.450591, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4232) +(@OGUID+1055, 181016, 571, 1, 1, 3270.005, -719.1215, 168.8549, 3.68265, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4232) +(@OGUID+1056, 181016, 571, 1, 1, 3281.076, -720.5919, 175.8908, 3.68265, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4232) +(@OGUID+1057, 181016, 571, 1, 1, 3257.232, -695.9045, 167.3684, 3.036838, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4232) +(@OGUID+1058, 181016, 571, 1, 1, 3216.764, -730.0927, 173.64, 3.700105, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4232) +(@OGUID+1059, 181016, 571, 1, 1, 3267.798, -689.1566, 173.7582, 3.141593, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4232) +(@OGUID+1060, 181016, 571, 1, 1, 3254.467, -668.7876, 174.1768, 3.787367, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4232) +(@OGUID+1061, 181016, 571, 1, 1, 3235.794, -713.0104, 167.6716, 1.117009, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4232) +(@OGUID+1062, 181016, 571, 1, 1, 3249.678, -674.059, 167.3249, 3.194002, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4232) +(@OGUID+1063, 181016, 571, 1, 1, 3209.856, -708.0291, 173.0501, 0.2792516, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4232) +(@OGUID+1064, 181016, 571, 1, 1, 3215.154, -685.1657, 174.8388, 2.513274, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4232) +(@OGUID+1065, 181016, 571, 1, 1, 3216.414, -654.4945, 173.1659, 0.8203033, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4232) +(@OGUID+1066, 181016, 571, 1, 1, 3201.649, -673.1436, 172.2877, 2.565632, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4186) +(@OGUID+1067, 181016, 571, 1, 1, 3202.44, -689.5214, 171.9362, 0.8901166, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4186) +(@OGUID+1068, 181016, 571, 1, 1, 3632.087, -711.0179, 214.2405, 4.293513, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1069, 181016, 571, 1, 1, 3658.59, -706.5002, 224.446, 3.490667, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1070, 181016, 571, 1, 1, 3674.527, -739.8177, 213.8958, 0.9948372, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1071, 181016, 571, 1, 1, 3649.295, -702.2972, 215.0318, 6.19592, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1072, 181016, 571, 1, 1, 3676.882, -702.1511, 214.3667, 5.427975, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1073, 181016, 571, 1, 1, 3704.834, -687.1371, 215.5728, 5.148723, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1074, 181016, 571, 1, 1, 3698.531, -714.2257, 214.151, 3.141593, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1075, 181016, 571, 1, 1, 3697.376, -742.7101, 213.797, 2.111848, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1076, 181016, 571, 1, 1, 3716.316, -708.1945, 215.473, 2.268925, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1077, 181016, 571, 1, 1, 3749.342, -769.8768, 197.4349, 0.7504908, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1078, 181016, 571, 1, 1, 3781.028, -803.4545, 197.2077, 0.9424766, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1079, 181016, 571, 1, 1, 3794.07, -804.0314, 197.3381, 2.146753, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1080, 181016, 571, 1, 1, 3826.776, -685.0971, 223.0013, 5.235988, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1081, 181016, 571, 1, 1, 3803.82, -793.8429, 197.2356, 2.251473, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1082, 181016, 571, 1, 1, 3843.911, -763.369, 219.3806, 1.466076, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1083, 181016, 571, 1, 1, 3822.775, -695.2535, 223.0013, 0.1919852, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1084, 181016, 571, 1, 1, 3858.99, -724.03, 221.2304, 3.752462, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1085, 181016, 571, 1, 1, 3862.428, -745.8948, 221.1198, 3.874631, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1086, 181016, 571, 1, 1, 3866.354, -771.1376, 220.3779, 1.169369, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1087, 181016, 571, 1, 1, 3951.355, -780.9128, 244.63, 4.118979, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4177) +(@OGUID+1088, 181016, 571, 1, 1, 3548.806, 191.4957, 52.29362, 0.1047193, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4254) +(@OGUID+1089, 181016, 571, 1, 1, 3562.132, 193.3676, 52.28502, 3.298687, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4254) +(@OGUID+1090, 181016, 571, 1, 1, 3563.86, 208.5335, 52.2564, 3.106652, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4254) +(@OGUID+1091, 181016, 571, 1, 1, 3604.824, 221.3126, -120.0548, 2.199115, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4254) +(@OGUID+1092, 181016, 571, 1, 1, 3543.596, 229.0154, 116.7898, 0.157079, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4254) +(@OGUID+1093, 181016, 571, 1, 1, 3539.345, 210.2894, 116.8406, 4.834563, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4254) +(@OGUID+1094, 181016, 571, 1, 1, 3576.012, 201.1324, -120.133, 2.286379, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4254) +(@OGUID+1095, 181016, 571, 1, 1, 3542.329, 206.0333, 52.2564, 0.2617982, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4254) +(@OGUID+1096, 181016, 571, 1, 1, 3532.222, 198.4992, -120.1445, 1.500983, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4254) +(@OGUID+1097, 181016, 571, 1, 1, 3565.379, 213.0888, 116.8406, 4.607672, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4254) +(@OGUID+1098, 181016, 571, 1, 1, 3557.755, 230.3309, 116.7897, 3.228859, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4254) +(@OGUID+1099, 181016, 571, 1, 1, 3501.747, 212.1927, -120.1452, 0.5585039, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4254) +(@OGUID+1100, 181016, 571, 1, 1, 3579.191, 264.8907, 117.1309, 2.897245, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1101, 181016, 571, 1, 1, 3520.52, 258.9779, 47.3175, 0.4886912, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1102, 181016, 571, 1, 1, 3535.776, 241.7472, 117.1205, 1.256636, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1103, 181016, 571, 1, 1, 3538.464, 244.5366, 47.31742, 1.291542, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1104, 181016, 571, 1, 1, 3575.862, 264.2621, 47.31741, 2.844883, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1105, 181016, 571, 1, 1, 3565.646, 245.8031, 117.1294, 2.18166, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1106, 181016, 571, 1, 1, 3561.06, 247.0676, 47.31746, 2.076939, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1107, 181016, 571, 1, 1, 3517.434, 257.0187, 117.1313, 0.5061446, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1108, 181016, 571, 1, 1, 3597.307, 271.0546, -120.1526, 0.3490652, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1109, 181016, 571, 1, 1, 3573.319, 287.2054, 47.31745, 3.630291, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1110, 181016, 571, 1, 1, 3477.063, 249.0635, -120.1415, 0.4363316, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1111, 181016, 571, 1, 1, 3613.162, 267.1122, 52.27297, 1.815142, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1112, 181016, 571, 1, 1, 3518.373, 281.8263, 47.31754, 5.98648, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1113, 181016, 571, 1, 1, 3483.588, 254.1247, 52.26856, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1114, 181016, 571, 1, 1, 3480.771, 279.4473, 52.26998, 4.939284, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1115, 181016, 571, 1, 1, 3463.682, 274.7737, 52.29326, 4.886924, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1116, 181016, 571, 1, 1, 3559.003, 305.3416, 117.1257, 4.32842, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1117, 181016, 571, 1, 1, 3576.934, 290.0081, 117.1281, 3.647741, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1118, 181016, 571, 1, 1, 3610.144, 292.3628, 52.27081, 4.694937, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1119, 181016, 571, 1, 1, 3532.95, 299.9154, 47.31733, 5.183629, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1120, 181016, 571, 1, 1, 3514.207, 282.3757, 117.1297, 6.003934, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1121, 181016, 571, 1, 1, 3527.995, 301.947, 117.1261, 5.288348, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1122, 181016, 571, 1, 1, 3628.7, 289.4008, 52.28633, 4.81711, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1123, 181016, 571, 1, 1, 3555.46, 301.8236, 47.3174, 4.415683, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1124, 181016, 571, 1, 1, 3466.395, 254.6163, 52.29464, 1.675514, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1125, 181016, 571, 1, 1, 3630.185, 272.4107, 52.28997, 1.797689, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1126, 181016, 571, 1, 1, 3595.918, 285.1813, -120.1526, 5.916668, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1127, 181016, 571, 1, 1, 3535.763, 316.0141, 116.7898, 0.03490625, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1128, 181016, 571, 1, 1, 3646.115, 260.8871, 52.25636, 0.6806767, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1129, 181016, 571, 1, 1, 3471.14, 281.1834, -120.1448, 5.881761, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1130, 181016, 571, 1, 1, 3549.406, 317.3907, 116.7898, 3.281239, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1131, 181016, 571, 1, 1, 3592.655, 332.8689, -120.1448, 4.310966, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1132, 181016, 571, 1, 1, 3546.336, 351.4997, 52.27733, 3.368496, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1133, 181016, 571, 1, 1, 3551.697, 340.1284, 52.2564, 3.403396, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1134, 181016, 571, 1, 1, 3562.234, 345.9385, -120.1445, 4.01426, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1135, 181016, 571, 1, 1, 3515.109, 342.4366, -120.1445, 5.375615, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1136, 181016, 571, 1, 1, 3527.488, 332.789, 116.7998, 1.675514, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1137, 181016, 571, 1, 1, 3531.985, 349.9049, 52.27657, 0.01745246, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1138, 181016, 571, 1, 1, 3492.134, 322.4423, -120.1445, 5.270896, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1139, 181016, 571, 1, 1, 3530.838, 337.9557, 52.25639, 6.19592, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1140, 181016, 571, 1, 1, 3553.869, 335.9773, 116.7962, 1.710422, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1141, 181016, 571, 1, 1, 3656.756, 292.7126, -120.1445, 5.98648, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1142, 181016, 571, 1, 1, 3639.994, 308.4146, 52.25637, 5.724681, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1143, 181016, 571, 1, 1, 3658.891, 275.3087, -120.1445, 0.9075702, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1144, 181016, 571, 1, 1, 3675.714, 259.1941, 52.25635, 6.126106, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4161) +(@OGUID+1145, 181016, 571, 1, 1, 3833.705, 1420.332, 90.87871, 4.904376, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1146, 181016, 571, 1, 1, 3838.928, 1434.694, 90.64106, 5.375615, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1147, 181016, 571, 1, 1, 3847.046, 1434.552, 90.64103, 4.450591, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1148, 181016, 571, 1, 1, 3852.562, 1420.469, 90.91337, 4.24115, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1149, 181016, 571, 1, 1, 3826.221, 1467.968, 91.71698, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4165) +(@OGUID+1150, 181016, 571, 1, 1, 3847.981, 1459.16, 91.84016, 0.05235888, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4165) +(@OGUID+1151, 181016, 571, 1, 1, 3856.728, 1468.202, 92.05556, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4165) +(@OGUID+1152, 181016, 571, 1, 1, 3837.253, 1460.372, 91.84299, 3.001947, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4165) +(@OGUID+1153, 181016, 571, 1, 1, 3827.208, 1483.951, 92.06059, 0.05235888, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4165) +(@OGUID+1154, 181016, 571, 1, 1, 3772.201, 1518.562, 87.60015, 3.036838, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1155, 181016, 571, 1, 1, 3826.889, 1531.865, 95.81321, 0.9773831, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1156, 181016, 571, 1, 1, 3805.442, 1540.334, 89.73431, 6.161013, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1157, 181016, 571, 1, 1, 3842.612, 1551.831, 89.72446, 2.199115, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4165) +(@OGUID+1158, 181016, 571, 1, 1, 3869.433, 1563.036, 89.7524, 2.687807, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4165) +(@OGUID+1159, 181016, 571, 1, 1, 3828.599, 1550.87, 89.65501, 1.448622, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4165) +(@OGUID+1160, 181016, 571, 1, 1, 3857.379, 1532.047, 95.73104, 2.007128, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4165) +(@OGUID+1161, 181016, 571, 1, 1, 3856.719, 1587.243, 89.60239, 0.5934101, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4165) +(@OGUID+1162, 181016, 571, 1, 1, 3799.489, 1569.15, 89.72446, 3.612838, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4165) +(@OGUID+1163, 181016, 571, 1, 1, 3763.406, 1539.296, 87.04375, 3.647741, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4165) +(@OGUID+1164, 181016, 571, 1, 1, 3807.621, 1601.288, 89.72446, 2.286379, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4165) +(@OGUID+1165, 181016, 571, 1, 1, 3825.676, 1611.223, 89.72446, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4165) +(@OGUID+1166, 181016, 571, 1, 1, 3873.578, 1603.196, 90.13206, 3.159062, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4165) +(@OGUID+1167, 181016, 571, 1, 1, 3853.099, 1601.293, 89.72446, 0.157079, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4165) +(@OGUID+1168, 181016, 571, 1, 1, 3804.344, 1618.123, 89.31889, 5.131269, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4165) +(@OGUID+1169, 181016, 571, 1, 1, 3781.226, 1617.937, 87.15925, 5.288348, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4165) +(@OGUID+1170, 181016, 571, 1, 1, 3515.828, 1981.839, 64.86245, 2.548179, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4158) +(@OGUID+1171, 181016, 571, 1, 1, 3533.275, 2028.212, 67.83712, 0.2967052, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4158) +(@OGUID+1172, 181016, 571, 1, 1, 3487.095, 1996.391, 64.86275, 3.228859, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4158) +(@OGUID+1173, 181016, 571, 1, 1, 3503.747, 2013.127, 64.86234, 3.403396, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4158) +(@OGUID+1174, 181016, 571, 1, 1, 3463.338, 1991.168, 64.61589, 0.1919852, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4158) +(@OGUID+1175, 181016, 571, 1, 1, 2795.232, 971.2288, 22.84727, 3.787367, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4154) +(@OGUID+1176, 181016, 571, 1, 1, 2784.236, 959.4688, 22.49838, 5.462882, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4154) +(@OGUID+1177, 181016, 571, 1, 1, 2793.773, 931.6573, 22.35705, 5.742135, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1178, 181016, 571, 1, 1, 2772.131, 928.7278, 22.78977, 0.7330382, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1179, 181016, 571, 1, 1, 2781.197, 933.6979, 22.78251, 3.543024, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1180, 181016, 571, 1, 1, 2731.755, 930.2222, 0.360353, 3.33359, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1181, 181016, 571, 1, 1, 2815.472, 918.7995, 20.88776, 3.857183, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1182, 181016, 571, 1, 1, 2801.712, 908.5086, 22.29059, 1.745327, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1183, 181016, 571, 1, 1, 2754.224, 894.7058, 5.906912, 4.76475, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1184, 181016, 571, 1, 1, 2771.326, 914.0045, 22.36399, 5.619962, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1185, 181016, 571, 1, 1, 2787.118, 905.9583, 22.15631, 1.308995, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1186, 181016, 571, 1, 1, 2802.756, 890.1584, 12.88576, 4.97419, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1187, 181016, 571, 1, 1, 2837.893, 884.1483, 15.9367, 2.164206, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1188, 181016, 571, 1, 1, 2720.492, 904.6319, 5.697, 5.93412, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1189, 181016, 571, 1, 1, 2763.372, 862.8993, 6.277842, 5.777041, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1190, 181016, 571, 1, 1, 2722.365, 888.5219, 5.181851, 0.4014249, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1191, 181016, 571, 1, 1, 2743.732, 851.4514, 6.691175, 4.293513, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1192, 181016, 571, 1, 1, 2645.363, 884.6476, 4.748452, 0.5061446, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1193, 181016, 571, 1, 1, 2659.202, 906.3993, 4.293646, 4.852017, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1194, 181016, 571, 1, 1, 2643.082, 897.5799, 4.501051, 6.021387, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1195, 181016, 571, 1, 1, 2663.845, 880.2552, 4.281791, 1.850049, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4152) +(@OGUID+1196, 181016, 571, 1, 1, 4462.361, 1266.483, 142.2847, 5.009095, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1197, 181016, 571, 1, 1, 4469.088, 1267.642, 141.8956, 4.520406, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1198, 181016, 571, 1, 1, 4528.026, 1252.006, 139.5977, 3.33359, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1199, 181016, 571, 1, 1, 4515.189, 1271.205, 137.7116, 3.909541, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1200, 181016, 571, 1, 1, 4866.249, 1289.011, 222.6894, 3.735006, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4171) +(@OGUID+1201, 181016, 571, 1, 1, 4908.99, 1241.123, 226.8822, 1.431168, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4171) +(@OGUID+1202, 181016, 571, 1, 1, 4896.076, 1252.84, 227.6416, 0.2443456, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4171) +(@OGUID+1203, 181016, 571, 1, 1, 4925.459, 1257.523, 226.8904, 1.326448, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4171) +(@OGUID+1204, 181016, 571, 1, 1, 4919.086, 1318.598, 229.563, 4.188792, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4171) +(@OGUID+1205, 181016, 571, 1, 1, 4950.565, 1309.806, 235.062, 3.368496, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4170) +(@OGUID+1206, 181016, 571, 1, 1, 4948.565, 1174.379, 239.7921, 4.485497, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4170) +(@OGUID+1207, 181016, 571, 1, 1, 4956.751, 1164.542, 239.6501, 4.258607, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4170) +(@OGUID+1208, 181016, 571, 1, 1, 4967.222, 1205.661, 227.3895, 2.548179, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4170) +(@OGUID+1209, 181016, 571, 1, 1, 4958.919, 1196.348, 226.8051, 1.797689, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4170) +(@OGUID+1210, 181016, 571, 1, 1, 4978.83, 1243.004, 227.4904, 2.949595, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4170) +(@OGUID+1211, 181016, 571, 1, 1, 4980.446, 1205.421, 227.7068, 1.117009, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4170) +(@OGUID+1212, 181016, 571, 1, 1, 4986.674, 1189.043, 227.4761, 5.98648, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4170) +(@OGUID+1213, 181016, 571, 1, 1, 5003.663, 1190.19, 227.3823, 2.792518, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4170) +(@OGUID+1214, 181016, 571, 1, 1, 4985.378, 1269.712, 229.3461, 3.246347, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4170) +(@OGUID+1215, 181016, 571, 1, 1, 5019.801, 1236.83, 230.0975, 3.961899, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4170) +(@OGUID+1216, 181016, 571, 1, 1, 4692.931, 1529.158, 261.0022, 5.689774, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4171) +(@OGUID+1217, 181016, 571, 1, 1, 4690.823, 1517.44, 261.1075, 0.03490625, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4171) +(@OGUID+1218, 181016, 571, 1, 1, 3437.819, 4086.14, 17.09811, 1.518436, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4042) +(@OGUID+1219, 181016, 571, 1, 1, 3426.033, 4071.888, 18.0825, 4.01426, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4042) +(@OGUID+1220, 181016, 571, 1, 1, 3409.352, 4091.084, 18.57693, 4.468043, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4042) +(@OGUID+1221, 181016, 571, 1, 1, 3473.787, 4089.247, 17.13011, 3.961899, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4042) +(@OGUID+1222, 181016, 571, 1, 1, 3458.691, 4082.395, 17.32234, 0.4537851, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4042) +(@OGUID+1223, 181016, 571, 1, 1, 3469.884, 4115.7, 16.70656, 3.68265, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4043) +(@OGUID+1224, 181016, 571, 1, 1, 3429.658, 4124.901, 16.82856, 5.253442, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4043) +(@OGUID+1225, 181016, 571, 1, 1, 3419, 4110.042, 17.55773, 6.021387, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4043) +(@OGUID+1226, 181016, 571, 1, 1, 3455.853, 4140.363, 15.27709, 5.235988, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4037) +(@OGUID+1227, 181016, 571, 1, 1, 3468.707, 4138.945, 15.28419, 4.276057, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4037) +(@OGUID+1228, 181016, 571, 1, 1, 3484.245, 4164.788, 17.17531, 1.483528, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4037) +(@OGUID+1229, 181016, 571, 1, 1, 3472.248, 4185.592, 18.24646, 2.775069, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4037) +(@OGUID+1230, 181016, 571, 1, 1, 3460.45, 4186.23, 18.21275, 6.143561, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4037) +(@OGUID+1231, 181016, 571, 1, 1, 3484.917, 4176.376, 17.19302, 4.694937, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4037) +(@OGUID+1232, 181016, 571, 1, 1, 3445, 4178.582, 17.15816, 4.729844, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4037) +(@OGUID+1233, 181016, 571, 1, 1, 3444.581, 4167.645, 17.16287, 1.466076, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4037) +(@OGUID+1234, 181016, 571, 1, 1, 2998.711, 4070.604, 26.91523, 1.047198, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4113) +(@OGUID+1235, 181016, 571, 1, 1, 2997.857, 4049.579, 26.61824, 6.213374, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4113) +(@OGUID+1236, 181016, 571, 1, 1, 3008.427, 4048.363, 26.36823, 2.722713, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4113) +(@OGUID+1237, 181016, 571, 1, 1, 3017.189, 4065.652, 26.77533, 1.710422, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4113) +(@OGUID+1238, 181016, 571, 1, 1, 2910.194, 4046.256, 1.670829, 0.122173, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4113) +(@OGUID+1239, 181016, 571, 1, 1, 2899.832, 4067.156, 1.7923, 6.0912, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4113) +(@OGUID+1240, 181016, 571, 1, 1, 2922.883, 4037.388, 1.768461, 1.483528, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4113) +(@OGUID+1241, 181016, 571, 1, 1, 2904.64, 4073.7, 1.964231, 4.904376, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4113) +(@OGUID+1242, 181016, 571, 1, 1, 2927.117, 4077.872, 2.141783, 5.881761, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4113) +(@OGUID+1243, 181016, 571, 1, 1, 2238.36, 5132.744, 5.344914, 2.757613, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1244, 181016, 571, 1, 1, 2226.791, 5136.915, 5.344575, 5.93412, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1245, 181016, 571, 1, 1, 2352.742, 5196.42, 7.632045, 2.757613, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1246, 181016, 571, 1, 1, 2248.404, 5206.861, 14.71353, 0.5235979, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1247, 181016, 571, 1, 1, 2238.517, 5180.176, 14.71353, 5.93412, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1248, 181016, 571, 1, 1, 2207.053, 5222.542, 14.10005, 2.705255, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4032) +(@OGUID+1249, 181016, 571, 1, 1, 2255.31, 5225.856, 14.71353, 5.93412, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4032) +(@OGUID+1250, 181016, 571, 1, 1, 2302.698, 5237.8, 11.3397, 2.775069, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4032) +(@OGUID+1251, 181016, 571, 1, 1, 2366.833, 5211.396, 7.632044, 2.705255, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4032) +(@OGUID+1252, 181016, 571, 1, 1, 2214.695, 5241.333, 14.10005, 2.775069, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4032) +(@OGUID+1253, 181016, 571, 1, 1, 2276.32, 5282.166, 15.66975, 5.811947, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4032) +(@OGUID+1254, 181016, 571, 1, 1, 2234.987, 5298.379, 15.05626, 2.687807, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4032) +(@OGUID+1255, 181016, 571, 1, 1, 2187.269, 5257.097, 23.37515, 2.932139, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4032) +(@OGUID+1256, 181016, 571, 1, 1, 2192.255, 5270.982, 24.45937, 2.722713, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4032) +(@OGUID+1257, 181016, 571, 1, 1, 2288.013, 5313.147, 14.71353, 5.044002, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4032) +(@OGUID+1258, 181016, 571, 1, 1, 2213.95, 5333.778, 23.37515, 3.455756, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4032) +(@OGUID+1259, 181016, 571, 1, 1, 2197.986, 5288.558, 24.45936, 2.722713, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4032) +(@OGUID+1260, 181016, 571, 1, 1, 2202.939, 5302.733, 23.37515, 2.82743, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4032) +(@OGUID+1261, 181016, 571, 1, 1, 2208.51, 5319.641, 23.37515, 2.897245, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4032) +(@OGUID+1262, 181016, 571, 1, 1, 2151.343, 5284.071, 24.66521, 2.757613, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4032) +(@OGUID+1263, 181016, 571, 1, 1, 2157.476, 5301.414, 24.66485, 2.809975, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4032) +(@OGUID+1264, 181016, 571, 1, 1, 2122.561, 5320.263, 32.77589, 4.398232, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4032) +(@OGUID+1265, 181016, 571, 1, 1, 2112.85, 5291.524, 32.77574, 1.239183, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4032) +(@OGUID+1266, 181016, 571, 1, 1, 2805.134, 6135.274, 84.65132, 1.134463, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4129) +(@OGUID+1267, 181016, 571, 1, 1, 2788.66, 6162.68, 84.8553, 5.515242, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4129) +(@OGUID+1268, 181016, 571, 1, 1, 2823.609, 6165.092, 121.9373, 2.251473, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4129) +(@OGUID+1269, 181016, 571, 1, 1, 2815.305, 6174.101, 121.9518, 5.497789, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4129) +(@OGUID+1270, 181016, 571, 1, 1, 2799.835, 6186.328, 84.08407, 2.809975, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4129) +(@OGUID+1271, 181016, 571, 1, 1, 2876.308, 6204.336, 208.7393, 0.9773831, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4129) +(@OGUID+1272, 181016, 571, 1, 1, 2860.569, 6221.081, 208.7375, 0.5410506, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4129) +(@OGUID+1273, 181016, 571, 1, 1, 2861.186, 6199.252, 208.7366, 2.234018, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4129) +(@OGUID+1274, 181016, 571, 1, 1, 2853.404, 6207.334, 208.7359, 5.462882, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4129) +(@OGUID+1275, 181016, 571, 1, 1, 2888.891, 6247.602, 208.8507, 4.276057, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4129) +(@OGUID+1276, 181016, 571, 1, 1, 2902.97, 6231.561, 208.8656, 3.455756, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4129) +(@OGUID+1277, 181016, 571, 1, 1, 2899.378, 6242.913, 208.8885, 3.839725, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4129) +(@OGUID+1278, 181016, 571, 1, 1, 2892.682, 6263.139, 209.0361, 5.201083, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4129) +(@OGUID+1279, 181016, 571, 1, 1, 2922.968, 6238.53, 208.9055, 2.478367, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4129) +(@OGUID+1280, 181016, 571, 1, 1, 3521.802, 5957.627, 134.0744, 5.462882, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4023) +(@OGUID+1281, 181016, 571, 1, 1, 3519.409, 5943.527, 134.4016, 0.1396245, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4023) +(@OGUID+1282, 181016, 571, 1, 1, 3584.385, 5975.644, 136.2158, 6.248279, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4023) +(@OGUID+1283, 181016, 571, 1, 1, 3624.637, 5926.569, 136.2162, 2.617989, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4023) +(@OGUID+1284, 181016, 571, 1, 1, 3623.188, 5947.213, 136.2162, 3.368496, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4023) +(@OGUID+1285, 181016, 571, 1, 1, 3612.38, 5919.877, 136.0995, 1.954769, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4023) +(@OGUID+1286, 181016, 571, 1, 1, 3605.886, 5989.136, 136.2162, 4.084071, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4023) +(@OGUID+1287, 181016, 571, 1, 1, 3633.385, 5887.483, 140.0765, 0.9948372, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4023) +(@OGUID+1288, 181016, 571, 1, 1, 3647.803, 5882.226, 174.4943, 0.9773831, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4023) +(@OGUID+1289, 181016, 571, 1, 1, 4047.685, 5298.593, 24.65438, 2.408554, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1290, 181016, 571, 1, 1, 4079.892, 5272.371, 27.84729, 1.134463, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1291, 181016, 571, 1, 1, 4174.55, 5310.481, 25.4746, 2.809975, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1292, 181016, 571, 1, 1, 4124.854, 5302.798, 29.50037, 1.623156, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1293, 181016, 571, 1, 1, 4166.071, 5288.284, 26.37672, 2.82743, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1294, 181016, 571, 1, 1, 4064.177, 5287.178, 28.33383, 0.4886912, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1295, 181016, 571, 1, 1, 4038.373, 5295.928, 24.80445, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1296, 181016, 571, 1, 1, 4133.651, 5261.081, 25.0436, 1.431168, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4108) +(@OGUID+1297, 181016, 571, 1, 1, 4116.859, 5260.454, 24.72842, 1.658062, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4108) +(@OGUID+1298, 181016, 571, 1, 1, 4188.307, 5253.252, 26.37672, 3.298687, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4108) +(@OGUID+1299, 181016, 571, 1, 1, 4203.514, 5258.505, 32.30191, 3.106652, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4108) +(@OGUID+1300, 181016, 571, 1, 1, 4245.934, 5261.749, 70.84612, 2.670348, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4108) +(@OGUID+1301, 181016, 571, 1, 1, 4464.801, 5710.149, 81.19541, 0.4886912, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1302, 181016, 571, 1, 1, 4474.953, 5701.296, 81.26831, 0.2967052, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1303, 181016, 571, 1, 1, 4504.061, 5681.631, 81.48656, 3.543024, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1304, 181016, 571, 1, 1, 4496.206, 5716.174, 81.43398, 1.221729, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1305, 181016, 571, 1, 1, 4503.089, 5725.708, 81.28325, 2.460913, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1306, 181016, 571, 1, 1, 4518.926, 5710.135, 81.47955, 2.775069, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1307, 181016, 571, 1, 1, 4509.733, 5758.892, 81.67448, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4122) +(@OGUID+1308, 181016, 571, 1, 1, 5533.617, 5764.573, -78.64155, 0.802851, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4285) +(@OGUID+1309, 181016, 571, 1, 1, 5538.608, 5734.042, -76.70612, 3.316144, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4285) +(@OGUID+1310, 181016, 571, 1, 1, 5581.773, 5765.792, -74.64859, 5.061456, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4285) +(@OGUID+1311, 181016, 571, 1, 1, 5565.491, 5758.583, -75.22591, 5.794494, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4285) +(@OGUID+1312, 181016, 571, 1, 1, 5590.33, 5779.955, -71.88873, 5.67232, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4285) +(@OGUID+1313, 181016, 571, 1, 1, 5591.747, 5812.308, -69.85215, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4285) +(@OGUID+1314, 181016, 571, 1, 1, 5547.863, 5726.392, -76.03914, 4.502952, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4285) +(@OGUID+1315, 181016, 571, 1, 1, 5594.934, 5715.648, -72.77393, 4.084071, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4284) +(@OGUID+1316, 181016, 571, 1, 1, 5575.626, 5710.971, -76.69463, 5.358162, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4284) +(@OGUID+1317, 181016, 571, 1, 1, 5584.725, 5752.109, -72.06274, 3.612838, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4284) +(@OGUID+1318, 181016, 571, 1, 1, 5609.327, 5807.859, -70.49896, 0.6457717, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4284) +(@OGUID+1319, 181016, 571, 1, 1, 5623.018, 5797.692, -71.15307, 1.605702, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4284) +(@OGUID+1320, 181016, 571, 1, 1, 5480.522, 4749.844, -197.1695, 5.654869, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4290) +(@OGUID+1321, 181016, 571, 1, 1, 5499.655, 4733.096, -194.545, 2.460913, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4290) +(@OGUID+1322, 181016, 571, 1, 1, 5480.355, 4744.158, -196.4283, 0.087266, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4290) +(@OGUID+1323, 181016, 571, 1, 1, 5489.249, 4730.626, -194.7575, 1.186823, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4290) +(@OGUID+1324, 181016, 571, 1, 1, 5478.019, 4730.707, -195.1084, 0.7853968, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4290) +(@OGUID+1325, 181016, 571, 1, 1, 8436.615, -338.5281, 906.6075, 5.567601, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4436) +(@OGUID+1326, 181016, 571, 1, 1, 8477.151, -325.8229, 905.8746, 4.01426, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4436) +(@OGUID+1327, 181016, 571, 1, 1, 8442.052, -343.1962, 906.6075, 2.33874, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4436) +(@OGUID+1328, 181016, 571, 1, 1, 8471.394, -348.3333, 906.9317, 1.815142, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4436) +(@OGUID+1329, 181016, 571, 1, 1, 7856.442, -742.1389, 1177.688, 6.108654, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1330, 181016, 571, 1, 1, 7879.499, -759.5701, 1175.366, 2.460913, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1331, 181016, 571, 1, 1, 7850.471, -793.3299, 1183.955, 3.106652, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1332, 181016, 530, 1, 1, -1907.199, 5450.696, -12.42813, 5.480334, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3703) +(@OGUID+1333, 181016, 530, 1, 1, -1917.352, 5455.052, -12.55365, 5.096362, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3703) +(@OGUID+1334, 181016, 530, 1, 1, -1911.368, 5439.292, -12.42818, 0.122173, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3703) +(@OGUID+1335, 181016, 530, 1, 1, -1885.166, 5386.202, -12.42817, 0.7679439, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3703) +(@OGUID+1336, 181016, 530, 1, 1, -1873.54, 5382.65, -12.42811, 1.727875, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3703) +(@OGUID+1337, 181016, 530, 1, 1, -1815.917, 5420.624, -12.42818, 3.211419, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3703) +(@OGUID+1338, 181016, 530, 1, 1, -1819.924, 5409.16, -12.42813, 2.391098, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3703) +(@OGUID+1339, 181016, 530, 1, 1, -1727.312, 5487.572, -8.355326, 0.9599299, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3703) +(@OGUID+1340, 181016, 530, 1, 1, -1735.256, 5502.995, -8.428672, 6.19592, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3703) +(@OGUID+1341, 181016, 530, 1, 1, -1695.612, 5498.583, -9.799444, 2.757613, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3703) +(@OGUID+1342, 181016, 530, 1, 1, -1706.805, 5522.744, -9.799464, 4.06662, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3703) +(@OGUID+1343, 181016, 530, 1, 1, -1745.647, 5142.983, -37.22771, 1.047198, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3899) +(@OGUID+1344, 181016, 530, 1, 1, -1758.525, 5138.586, -37.21199, 2.809975, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3899) +(@OGUID+1345, 181016, 530, 1, 1, -1775.782, 5170.78, -40.20916, 2.216565, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3899) +(@OGUID+1346, 181016, 530, 1, 1, -2042.056, 5233.834, -38.8555, 3.141593, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1347, 181016, 530, 1, 1, -2050.452, 5241.551, -38.85723, 4.76475, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1348, 181016, 530, 1, 1, -2061.054, 5250.36, -38.46526, 6.056293, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1349, 181016, 530, 1, 1, -2021.757, 5336.417, -9.350949, 0.9599299, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1350, 181016, 530, 1, 1, -2034.004, 5359.76, -9.350951, 6.003934, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1351, 181016, 530, 1, 1, -2001.405, 5370.284, -8.034398, 3.961899, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1352, 181016, 530, 1, 1, -2171.618, 5399.994, 50.22791, 0.6283169, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1353, 181016, 530, 1, 1, -1994.435, 5356.163, -8.067644, 3.351047, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1354, 181016, 530, 1, 1, -2024.566, 5470.972, 3.928363, 5.98648, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1355, 181016, 530, 1, 1, -2032.695, 5481.466, 54.53995, 1.308995, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1356, 181016, 530, 1, 1, -2029.916, 5490.481, 54.53994, 4.363324, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1357, 181016, 530, 1, 1, -2016.837, 5494.008, 3.808645, 5.846854, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1358, 181016, 530, 1, 1, -2145.284, 5497.773, 51.2669, 1.692969, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1359, 181016, 530, 1, 1, -2176.784, 5413.221, 50.22791, 0.4188786, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3898) +(@OGUID+1360, 181016, 530, 1, 1, -2167.578, 5441.844, 51.2669, 3.316144, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3898) +(@OGUID+1361, 181016, 530, 1, 1, -2185.163, 5454.922, 51.2669, 5.811947, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1362, 181016, 530, 1, 1, -1802.705, 5597.75, 130.8119, 2.652894, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1363, 181016, 530, 1, 1, -1811.717, 5600.768, 130.8119, 5.811947, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1364, 181016, 530, 1, 1, -1798.486, 5585.74, 3.878141, 4.293513, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1365, 181016, 530, 1, 1, -1822.766, 5593.826, 3.894919, 4.555311, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1366, 181016, 530, 1, 1, -1791.788, 5726.31, 129.1411, 5.689774, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1367, 181016, 530, 1, 1, -1780.283, 5739.229, 128.7909, 5.061456, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1368, 181016, 530, 1, 1, -1745.379, 5726.958, 128.7801, 3.647741, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1369, 181016, 530, 1, 1, -1743.729, 5710.51, 129.1411, 3.019413, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1370, 181016, 530, 1, 1, -1864.92, 5715.607, 132.2513, 2.199115, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1371, 181016, 530, 1, 1, -1844.504, 5746.667, 130.7976, 2.33874, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1372, 181016, 530, 1, 1, -1886.932, 5771.139, 129.5579, 5.881761, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1373, 181016, 530, 1, 1, -1846.261, 5773.022, 131.2068, 3.857183, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1374, 181016, 530, 1, 1, -1917.616, 5746.094, 131.1787, 0.5061446, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1375, 181016, 530, 1, 1, -1893.715, 5757.046, 129.482, 0.3665176, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1376, 181016, 530, 1, 1, -1888.447, 5716.592, 132.1732, 1.117009, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1377, 181016, 530, 1, 1, -1904.28, 5729.601, 131.1909, 1.029743, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1378, 181016, 530, 1, 1, -1993.964, 5686.367, 117.6628, 5.829401, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1379, 181016, 530, 1, 1, -1990.117, 5678.112, 117.6628, 1.291542, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1380, 181016, 530, 1, 1, -2545.219, 4312.679, 20.62585, 4.747296, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1381, 181016, 530, 1, 1, -2558.318, 4305.626, 20.76239, 5.759588, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1382, 181016, 530, 1, 1, -2623.644, 4378.721, 35.27359, 4.01426, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1383, 181016, 530, 1, 1, -2611.685, 4383.334, 32.93204, 2.583081, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1384, 181016, 530, 1, 1, -2569.438, 4420.438, 39.15441, 0.9424766, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3683) +(@OGUID+1385, 181016, 530, 1, 1, -2617.922, 4427.623, 36.09334, 4.171338, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3683) +(@OGUID+1386, 181016, 530, 1, 1, -2631.962, 4428.709, 36.10242, 4.81711, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3683) +(@OGUID+1387, 181016, 530, 1, 1, -2614.487, 4456.502, 36.09352, 5.009095, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3683) +(@OGUID+1388, 181016, 530, 1, 1, -2624.518, 4467.333, 36.14123, 2.44346, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3683) +(@OGUID+1389, 181016, 530, 1, 1, -2666.818, 4443.57, 36.34382, 5.166176, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3683) +(@OGUID+1390, 181016, 530, 1, 1, -2667.306, 4424.93, 37.06041, 6.230826, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3683) +(@OGUID+1391, 181016, 530, 1, 1, -2966.667, 4073.203, 2.960989, 1.745327, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3684) +(@OGUID+1392, 181016, 530, 1, 1, -2924.175, 4014.802, 0.424108, 3.368496, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3684) +(@OGUID+1393, 181016, 530, 1, 1, -2904.558, 4017.979, 0.378337, 2.82743, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3684) +(@OGUID+1394, 181016, 530, 1, 1, -2926.811, 4019.083, 0.413682, 4.01426, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3684) +(@OGUID+1395, 181016, 530, 1, 1, -2942.975, 3949.947, 0.906697, 4.66003, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3684) +(@OGUID+1396, 181016, 530, 1, 1, -2987.699, 3860.738, 8.660349, 1.308995, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3684) +(@OGUID+1397, 181016, 530, 1, 1, -2956.34, 3907.056, 3.423482, 0.7504908, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3684) +(@OGUID+1398, 181016, 530, 1, 1, -2943.432, 3903.176, 3.423485, 1.692969, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3684) +(@OGUID+1399, 181016, 530, 1, 1, -2975.988, 3877.033, 9.545059, 3.769912, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3684) +(@OGUID+1400, 181016, 530, 1, 1, -3031.269, 2631.006, 76.54335, 4.485497, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3744) +(@OGUID+1401, 181016, 530, 1, 1, -3081.042, 2598.579, 61.74963, 3.38594, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3744) +(@OGUID+1402, 181016, 530, 1, 1, -2932.842, 2657.233, 94.24632, 4.502952, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3744) +(@OGUID+1403, 181016, 530, 1, 1, -3065.579, 2555.547, 65.75816, 3.752462, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3744) +(@OGUID+1404, 181016, 530, 1, 1, -3104.677, 2582.695, 61.977, 4.642576, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3744) +(@OGUID+1405, 181016, 530, 1, 1, -3107.003, 2545.114, 62.05597, 1.029743, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3744) +(@OGUID+1406, 181016, 530, 1, 1, -3006.598, 2549.313, 78.11643, 2.129301, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3744) +(@OGUID+1407, 181016, 530, 1, 1, -3052.811, 2481.651, 66.65688, 2.565632, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3744) +(@OGUID+1408, 181016, 530, 1, 1, -2979.335, 2554.049, 76.54335, 3.926996, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3744) +(@OGUID+1409, 181016, 530, 1, 1, -2986.574, 2565.178, 76.54335, 2.600535, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3744) +(@OGUID+1410, 181016, 530, 1, 1, -2956.544, 2554.592, 126.6191, 2.740162, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3744) +(@OGUID+1411, 181016, 530, 1, 1, -2970.731, 2573.003, 76.54335, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3744) +(@OGUID+1412, 181016, 530, 1, 1, -2921.617, 2644.625, 94.40192, 3.351047, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3744) +(@OGUID+1413, 181016, 530, 1, 1, -3930.809, 2115.148, 96.81004, 3.508117, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3745) +(@OGUID+1414, 181016, 530, 1, 1, -3984.704, 2162.162, 105.4418, 4.380776, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3745) +(@OGUID+1415, 181016, 530, 1, 1, -3948.719, 2165.375, 100.8409, 2.775069, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3745) +(@OGUID+1416, 181016, 530, 1, 1, -3981.395, 2150.587, 105.0282, 2.600535, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3745) +(@OGUID+1417, 181016, 530, 1, 1, -3966.465, 2185.426, 101.8951, 1.692969, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3745) +(@OGUID+1418, 181016, 530, 1, 1, -4008.345, 2172.325, 105.0965, 0.2792516, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3745) +(@OGUID+1419, 181016, 530, 1, 1, -4026.63, 2188.58, 109.1173, 2.251473, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3745) +(@OGUID+1420, 181016, 530, 1, 1, -4035.944, 2238.973, 112.2723, 5.270896, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3745) +(@OGUID+1421, 181016, 530, 1, 1, -4047.156, 2228.053, 112.0462, 5.951575, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3745) +(@OGUID+1422, 181016, 530, 1, 1, -4062.359, 2190.83, 109.8543, 5.602507, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3745) +(@OGUID+1423, 181016, 530, 1, 1, -4130.572, 1173.389, 49.58154, 5.777041, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3929) +(@OGUID+1424, 181016, 530, 1, 1, -4084.195, 1138.926, 44.43298, 4.537859, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3929) +(@OGUID+1425, 181016, 530, 1, 1, -4065.08, 1138.295, 43.1756, 3.909541, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3929) +(@OGUID+1426, 181016, 530, 1, 1, -4088.488, 1139.846, 44.42666, 4.572764, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3929) +(@OGUID+1427, 181016, 530, 1, 1, -4135.374, 1128.675, 54.58289, 4.223697, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3929) +(@OGUID+1428, 181016, 530, 1, 1, -4112.096, 1121.578, 44.54679, 5.288348, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3929) +(@OGUID+1429, 181016, 530, 1, 1, -4062.444, 1135.474, 43.18277, 3.804818, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3929) +(@OGUID+1430, 181016, 530, 1, 1, -4114.819, 1116.677, 44.53127, 0.1745321, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3929) +(@OGUID+1431, 181016, 530, 1, 1, -3080.772, 825.7006, -11.35703, 1.029743, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1432, 181016, 530, 1, 1, -3055.614, 812.4755, -9.506436, 0.4363316, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1433, 181016, 530, 1, 1, -3075.424, 858.7751, -20.02081, 3.298687, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1434, 181016, 530, 1, 1, -3079.415, 748.1234, -10.33996, 6.248279, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1435, 181016, 530, 1, 1, -3089.802, 837.7723, -19.92381, 1.867502, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1436, 181016, 530, 1, 1, -3061.827, 853.1981, -11.37245, 4.06662, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1437, 181016, 530, 1, 1, -3040.775, 806.6836, -9.706291, 1.692969, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3754) +(@OGUID+1438, 181016, 530, 1, 1, -3012.275, 861.4301, -10.48986, 4.01426, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3754) +(@OGUID+1439, 181016, 530, 1, 1, -3007.626, 853.5888, -10.48604, 3.33359, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3754) +(@OGUID+1440, 181016, 530, 1, 1, -3016.658, 795.0476, -9.916844, 2.129301, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3754) +(@OGUID+1441, 181016, 530, 1, 1, -3028.215, 823.3273, -9.546359, 3.455756, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3754) +(@OGUID+1442, 181016, 530, 1, 1, -3009.987, 803.8392, -10.3957, 2.722713, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3754) +(@OGUID+1443, 181016, 530, 1, 1, -3041.075, 832.1203, -9.484895, 4.607672, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3754) +(@OGUID+1444, 181016, 530, 1, 1, -2983.705, 809.1548, -6.9079, 4.06662, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3754) +(@OGUID+1445, 181016, 530, 1, 1, -3010.563, 770.086, -6.933084, 0.8901166, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3754) +(@OGUID+1446, 181016, 530, 1, 1, -2983.507, 869.4686, -7.479865, 4.66003, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3754) +(@OGUID+1447, 181016, 530, 1, 1, -717.8087, 2647.749, 93.05632, 3.787367, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3538) +(@OGUID+1448, 181016, 530, 1, 1, -720.9301, 2658.757, 93.7806, 3.106652, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3538) +(@OGUID+1449, 181016, 530, 1, 1, -695.8323, 2638.751, 90.97626, 4.81711, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3538) +(@OGUID+1450, 181016, 530, 1, 1, -708.6624, 2640.041, 91.84985, 4.136433, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3538) +(@OGUID+1451, 181016, 530, 1, 1, -702.0106, 2676.552, 93.48396, 1.727875, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3538) +(@OGUID+1452, 181016, 530, 1, 1, -714.3968, 2671.541, 93.92791, 2.234018, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3538) +(@OGUID+1453, 181016, 530, 1, 1, -690.535, 2673.585, 92.20389, 0.9424766, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3538) +(@OGUID+1454, 181016, 530, 1, 1, -684.1902, 2664.04, 90.97864, 0.5061446, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3538) +(@OGUID+1455, 181016, 530, 1, 1, -685.2488, 2644.338, 90.4667, 5.462882, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3538) +(@OGUID+1456, 181016, 530, 1, 1, -681.7703, 2653.848, 90.5937, 6.108654, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3538) +(@OGUID+1457, 181016, 530, 1, 1, -699.3879, 2717.673, 94.73693, 3.822273, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3538) +(@OGUID+1458, 181016, 530, 1, 1, 41.7532, 2675.019, 78.98357, 0.157079, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3536) +(@OGUID+1459, 181016, 530, 1, 1, 49.26655, 2658.362, 78.4103, 0.4712385, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3536) +(@OGUID+1460, 181016, 530, 1, 1, 168.2221, 2632.726, 86.68047, 2.600535, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3536) +(@OGUID+1461, 181016, 530, 1, 1, 177.3938, 2641.12, 87.18604, 2.199115, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3536) +(@OGUID+1462, 181016, 530, 1, 1, 184.4233, 2683.703, 88.28799, 3.001947, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3536) +(@OGUID+1463, 181016, 530, 1, 1, 182.2488, 2695.313, 88.79645, 3.47321, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3536) +(@OGUID+1464, 181016, 530, 1, 1, 202.2809, 2606.497, 87.28353, 2.670348, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3536) +(@OGUID+1465, 181016, 530, 1, 1, 193.15, 2600.053, 87.28353, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3536) +(@OGUID+1466, 181016, 530, 1, 1, 293.5556, 2757.308, 85.24716, 0.9773831, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3536) +(@OGUID+1467, 181016, 530, 1, 1, 277.2957, 2769.554, 84.67036, 0.9948372, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3536) +(@OGUID+1468, 181016, 530, 1, 1, 123.4488, 2766.59, 102.234, 3.804818, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3536) +(@OGUID+1469, 181016, 530, 1, 1, 211.9928, 2818.017, 129.8682, 2.91469, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3536) +(@OGUID+1470, 181016, 530, 1, 1, 215.5181, 2828.05, 130.0014, 2.635444, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3536) +(@OGUID+1471, 181016, 530, 1, 1, 223.0891, 2810.249, 129.6152, 4.747296, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3536) +(@OGUID+1472, 181016, 530, 1, 1, 140.73, 4269.448, 107.4208, 2.024579, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1473, 181016, 530, 1, 1, 82.60951, 4318.784, 102.0311, 0.383971, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1474, 181016, 530, 1, 1, 147.9486, 4275.235, 107.2797, 2.426008, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1475, 181016, 530, 1, 1, 136.032, 4345.664, 106.6182, 4.799657, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3552) +(@OGUID+1476, 181016, 530, 1, 1, 152.2135, 4318.471, 106.2541, 2.949595, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3552) +(@OGUID+1477, 181016, 530, 1, 1, 80.49339, 4347.601, 102.071, 5.183629, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3552) +(@OGUID+1478, 181016, 530, 1, 1, 134.9947, 4319.371, 106.7541, 1.500983, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3552) +(@OGUID+1479, 181016, 530, 1, 1, 151.8665, 4348.405, 107.2158, 3.071766, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3552) +(@OGUID+1480, 181016, 530, 1, 1, 181.2025, 4317.459, 119.9638, 1.675514, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3552) +(@OGUID+1481, 181016, 530, 1, 1, 181.4662, 4350.056, 119.962, 4.782203, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3552) +(@OGUID+1482, 181016, 530, 1, 1, 196.4538, 4339.529, 116.9748, 3.787367, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3552) +(@OGUID+1483, 181016, 530, 1, 1, 196.2876, 4328.141, 116.8841, 2.548179, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3552) +(@OGUID+1484, 181016, 530, 1, 1, -208.6328, 5388.645, 22.92735, 4.555311, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3521) +(@OGUID+1485, 181016, 530, 1, 1, -236.2242, 5387.014, 24.6395, 5.410522, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3521) +(@OGUID+1486, 181016, 530, 1, 1, -210.9873, 5433.489, 21.37882, 3.822273, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3521) +(@OGUID+1487, 181016, 530, 1, 1, -212.93, 5473.045, 22.87997, 2.146753, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3565) +(@OGUID+1488, 181016, 530, 1, 1, -324.4565, 5466.785, 22.66969, 1.326448, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3565) +(@OGUID+1489, 181016, 530, 1, 1, -306.1548, 5479.317, 22.28877, 2.35619, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3565) +(@OGUID+1490, 181016, 530, 1, 1, -253.026, 5481.032, 24.94352, 5.480334, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3565) +(@OGUID+1491, 181016, 530, 1, 1, -344.9888, 5492.374, 22.00702, 3.57793, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3565) +(@OGUID+1492, 181016, 530, 1, 1, -196.088, 5525.092, 22.81344, 3.612838, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3565) +(@OGUID+1493, 181016, 530, 1, 1, -213.9051, 5547.442, 24.07233, 3.57793, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3565) +(@OGUID+1494, 181016, 530, 1, 1, -192.6228, 5531.502, 29.45192, 3.769912, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3565) +(@OGUID+1495, 181016, 530, 1, 1, -184.6291, 5506.406, 29.47097, 3.141593, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3565) +(@OGUID+1496, 181016, 530, 1, 1, -192.4105, 5510.174, 22.67085, 3.33359, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3565) +(@OGUID+1497, 181016, 530, 1, 1, -87.59586, 5535.549, 22.80703, 0.5759573, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3565) +(@OGUID+1498, 181016, 530, 1, 1, -87.05946, 5555.918, 22.68842, 5.689774, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3565) +(@OGUID+1499, 181016, 530, 1, 1, -149.7903, 5567.248, 23.00511, 5.689774, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3565) +(@OGUID+1500, 181016, 530, 1, 1, -145.6747, 5545.872, 22.66767, 0.6457717, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3565) +(@OGUID+1501, 181016, 530, 1, 1, 278.5881, 5966.778, 150.1677, 5.375615, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1502, 181016, 530, 1, 1, 272.3167, 5944.75, 26.52184, 5.270896, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1503, 181016, 530, 1, 1, 298.2953, 5957.52, 26.42815, 1.745327, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1504, 181016, 530, 1, 1, 269.9623, 5956.735, 26.43292, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1505, 181016, 530, 1, 1, 296.5285, 5941.624, 26.55748, 3.68265, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1506, 181016, 530, 1, 1, 280.785, 6008.137, 144.7295, 4.729844, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1507, 181016, 530, 1, 1, 261.4174, 5980.111, 132.9563, 4.118979, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1508, 181016, 530, 1, 1, 301.7136, 5979.073, 132.4598, 4.782203, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1509, 181016, 530, 1, 1, 222.1361, 6049.518, 148.3132, 2.33874, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3644) +(@OGUID+1510, 181016, 530, 1, 1, 307.1656, 6055.835, 131.5718, 3.33359, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3644) +(@OGUID+1511, 181016, 530, 1, 1, 208.3886, 6049.729, 148.32, 3.909541, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3644) +(@OGUID+1512, 181016, 530, 1, 1, 290.4184, 6083.181, 131.5468, 4.590216, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3644) +(@OGUID+1513, 181016, 530, 1, 1, 227.5588, 6070.599, 148.3118, 3.176533, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3644) +(@OGUID+1514, 181016, 530, 1, 1, 275.337, 6082.517, 131.545, 4.886924, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3644) +(@OGUID+1515, 181016, 530, 1, 1, 217.2829, 6078.526, 148.3125, 1.710422, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3644) +(@OGUID+1516, 181016, 530, 1, 1, 276.2028, 6122.649, 142.509, 5.323256, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1517, 181016, 530, 1, 1, 210.443, 7810.77, 23.8272, 1.099556, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1518, 181016, 530, 1, 1, 229.981, 7821.426, 21.9932, 3.001947, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1519, 181016, 530, 1, 1, 253.7596, 7836.7, 22.96672, 5.078908, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1520, 181016, 530, 1, 1, 293.3064, 7831.16, 24.93296, 4.415683, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1521, 181016, 530, 1, 1, 287.7669, 7842.643, 22.58914, 2.44346, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1522, 181016, 530, 1, 1, 238.5979, 7893.07, 21.80824, 5.393069, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3645) +(@OGUID+1523, 181016, 530, 1, 1, 334.9908, 7839.56, 22.29418, 1.658062, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3645) +(@OGUID+1524, 181016, 530, 1, 1, 250.3989, 7896.925, 21.68546, 4.590216, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3645) +(@OGUID+1525, 181016, 530, 1, 1, 261.7739, 7872.234, 23.73318, 5.113817, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3645) +(@OGUID+1526, 181016, 530, 1, 1, 210.8226, 7926.406, 25.6933, 0.3316107, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3645) +(@OGUID+1527, 181016, 530, 1, 1, 247.4571, 7941.143, 25.69258, 3.612838, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3645) +(@OGUID+1528, 181016, 530, 1, 1, 285.1593, 7952.144, 21.52511, 3.804818, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3645) +(@OGUID+1529, 181016, 530, 1, 1, 276.1272, 7957.609, 21.57661, 4.32842, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3645) +(@OGUID+1530, 181016, 530, 1, 1, 201.9845, 8489.734, 24.44587, 0.6457717, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3656) +(@OGUID+1531, 181016, 530, 1, 1, 253.3038, 8489.067, 23.37944, 1.431168, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3656) +(@OGUID+1532, 181016, 530, 1, 1, 265.287, 8514.346, 23.52993, 3.68265, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3656) +(@OGUID+1533, 181016, 530, 1, 1, 223.5183, 8562.453, 23.26412, 4.293513, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3649) +(@OGUID+1534, 181016, 530, 1, 1, -1207.967, 7386.663, 31.42567, 2.321287, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1535, 181016, 530, 1, 1, -1220.264, 7388.16, 30.78928, 0.6108634, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1536, 181016, 530, 1, 1, -1265.508, 7313.129, 34.21532, 1.047198, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1537, 181016, 530, 1, 1, -1184.679, 7246.92, 35.14313, 2.82743, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1538, 181016, 530, 1, 1, -1198.807, 7250.11, 35.15434, 6.108654, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1539, 181016, 530, 1, 1, -1273.831, 7316.673, 33.7791, 1.169369, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1540, 181016, 530, 1, 1, -1221.305, 7222.463, 59.25886, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1541, 181016, 530, 1, 1, -1176.216, 7200.084, 58.21382, 0.5759573, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1542, 181016, 530, 1, 1, -1184.833, 7207.807, 57.92133, 0.5410506, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1543, 181016, 530, 1, 1, -1201.722, 7206.649, 58.55188, 0.9948372, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1544, 181016, 530, 1, 1, -1296.44, 7267.444, 34.61653, 4.049168, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1545, 181016, 530, 1, 1, -1302.753, 7271.99, 34.41439, 4.101525, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1546, 181016, 530, 1, 1, -1271.883, 7197.997, 57.89819, 2.35619, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1547, 181016, 530, 1, 1, -1282.837, 7187.43, 58.00641, 2.391098, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1548, 181016, 530, 1, 1, -1249.806, 7217.763, 58.32962, 2.146753, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1549, 181016, 530, 1, 1, -1454.16, 7165.046, 44.56573, 5.166176, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1550, 181016, 530, 1, 1, -1387.221, 7134.828, 34.03579, 3.874631, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1551, 181016, 530, 1, 1, -1392.476, 7140.168, 33.73893, 3.944446, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1552, 181016, 530, 1, 1, -1371.671, 7162.804, 33.254, 0.8203033, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1553, 181016, 530, 1, 1, -1364.813, 7156.565, 34.00505, 0.8901166, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1554, 181016, 530, 1, 1, -1283.426, 7130.822, 59.73568, 3.38594, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1555, 181016, 530, 1, 1, -1254.381, 7007.266, 36.623, 4.537859, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1556, 181016, 530, 1, 1, -1296.558, 6953.973, 33.24513, 4.118979, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1557, 181016, 530, 1, 1, -1307.797, 6960.474, 32.26982, 4.223697, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1558, 181016, 530, 1, 1, -1241.754, 7003.594, 36.79386, 4.537859, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1559, 181016, 530, 1, 1, -1262.076, 7107.592, 58.88747, 3.944446, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1560, 181016, 530, 1, 1, -1209.608, 7103.708, 57.44921, 5.410522, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1561, 181016, 530, 1, 1, -1194.752, 7110.279, 58.0645, 5.044002, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1562, 181016, 530, 1, 1, -1247.801, 7101.981, 58.06834, 4.171338, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1563, 181016, 530, 1, 1, -1173.556, 7134.231, 58.11499, 5.951575, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3613) +(@OGUID+1564, 181016, 530, 1, 1, -2571.461, 7378.03, 11.05957, 0.2617982, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1565, 181016, 530, 1, 1, -2561.666, 7378.96, 10.5709, 2.967041, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1566, 181016, 530, 1, 1, -2573.72, 7300.305, 13.90452, 6.003934, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1567, 181016, 530, 1, 1, -2602.271, 7282.346, 19.39945, 3.38594, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1568, 181016, 530, 1, 1, -2528.435, 7266.286, 16.27025, 2.478367, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1569, 181016, 530, 1, 1, -2611.334, 7343.457, 23.60636, 5.393069, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1570, 181016, 530, 1, 1, -2605.266, 7291.263, 19.8158, 3.647741, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1571, 181016, 530, 1, 1, -2624.408, 7331.686, 24.46344, 1.396262, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1572, 181016, 530, 1, 1, -2534.468, 7256.75, 16.26636, 2.530723, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1573, 181016, 530, 1, 1, -2614.572, 7330.876, 24.21089, 1.500983, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1574, 181016, 530, 1, 1, -2570.705, 7291.29, 14.81433, 0.5410506, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1575, 181016, 530, 1, 1, -2618.061, 7338.908, 23.65936, 4.956738, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1576, 181016, 530, 1, 1, -2614.92, 7297.726, 20.7448, 4.398232, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1577, 181016, 530, 1, 1, -2625.71, 7298.209, 21.14083, 4.799657, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1578, 181016, 530, 1, 1, -2720.994, 7355.896, 39.75894, 6.03884, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1579, 181016, 530, 1, 1, -2596.802, 7228.939, 13.47051, 0.2792516, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1580, 181016, 530, 1, 1, -2697.95, 7284.061, 42.72089, 6.108654, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1581, 181016, 530, 1, 1, -2692.656, 7296.979, 42.78501, 5.427975, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1582, 181016, 530, 1, 1, -2600.806, 7237.711, 12.91722, 0.3490652, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1583, 181016, 530, 1, 1, -2630.099, 7224.425, 19.74051, 3.717554, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1584, 181016, 530, 1, 1, -2702.841, 7293.721, 88.63655, 2.82743, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1585, 181016, 530, 1, 1, -2626.202, 7216.55, 20.35766, 3.560473, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1586, 181016, 530, 1, 1, -2670.031, 7211.863, 23.66941, 0.9948372, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1587, 181016, 530, 1, 1, -2678.989, 7214.03, 23.95701, 1.396262, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1588, 181016, 530, 1, 1, -2721.762, 7343.454, 39.44633, 6.161013, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1589, 181016, 530, 1, 1, -2755.534, 7275.691, 40.27126, 5.515242, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1590, 181016, 530, 1, 1, -2752.121, 7315.08, 43.48479, 5.689774, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1591, 181016, 530, 1, 1, -2762.166, 7267.401, 40.26734, 5.724681, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1592, 181016, 530, 1, 1, -2755.324, 7317.081, 56.35859, 2.617989, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3626) +(@OGUID+1593, 181016, 530, 1, 1, 937.6202, 7360.125, 26.74729, 1.378809, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1594, 181016, 530, 1, 1, 1006.334, 7322.549, 41.04741, 5.131269, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1595, 181016, 530, 1, 1, 957.7293, 7355.671, 29.15186, 0.4363316, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1596, 181016, 530, 1, 1, 993.2974, 7345.906, 35.77085, 1.431168, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1597, 181016, 530, 1, 1, 964.8279, 7387.548, 28.52687, 5.393069, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1598, 181016, 530, 1, 1, 945.5008, 7392.224, 26.72158, 4.380776, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1599, 181016, 530, 1, 1, 1033.736, 7322.608, 40.50263, 4.049168, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1600, 181016, 530, 1, 1, 971.3665, 7408.698, 29.54321, 5.026549, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3766) +(@OGUID+1601, 181016, 530, 1, 1, 1003.335, 7429.998, 28.07676, 5.358162, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3766) +(@OGUID+1602, 181016, 530, 1, 1, 1052.856, 7384.014, 39.65503, 4.468043, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3766) +(@OGUID+1603, 181016, 530, 1, 1, 1058.58, 7386.76, 39.58334, 4.276057, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3766) +(@OGUID+1604, 181016, 530, 1, 1, 1036.931, 7385.866, 40.72616, 5.201083, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3766) +(@OGUID+1605, 181016, 530, 1, 1, 1021.34, 7392.521, 36.32355, 3.490667, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3766) +(@OGUID+1606, 181016, 530, 1, 1, 1072.741, 7372.522, 39.58335, 3.455756, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3766) +(@OGUID+1607, 181016, 530, 1, 1, 1069.436, 7366.63, 39.64074, 3.246347, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3766) +(@OGUID+1608, 181016, 530, 1, 1, 1042.453, 7348.262, 36.65906, 2.565632, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3766) +(@OGUID+1609, 181016, 530, 1, 1, 1068.558, 7349.528, 40.72983, 2.495818, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3766) +(@OGUID+1610, 181016, 530, 1, 1, 2007.013, 6878.822, 178.9834, 4.24115, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3772) +(@OGUID+1611, 181016, 530, 1, 1, 2017.319, 6873.481, 178.983, 4.24115, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3772) +(@OGUID+1612, 181016, 530, 1, 1, 2161.682, 6783.048, 183.4536, 0.8901166, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3772) +(@OGUID+1613, 181016, 530, 1, 1, 2950.829, 5486.531, 144.1427, 5.497789, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3951) +(@OGUID+1614, 181016, 530, 1, 1, 2969.01, 5459.725, 144.6972, 4.06662, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3951) +(@OGUID+1615, 181016, 530, 1, 1, 3011.185, 5493.75, 145.0009, 0.6806767, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3951) +(@OGUID+1616, 181016, 530, 1, 1, 2087.611, 4782.989, 157.7814, 0.2268925, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3827) +(@OGUID+1617, 181016, 530, 1, 1, 2019.061, 4700.482, 150.2378, 0.4363316, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3844) +(@OGUID+1618, 181016, 530, 1, 1, 2945.531, 3714.857, 143.1773, 3.159062, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3712) +(@OGUID+1619, 181016, 530, 1, 1, 3014.989, 3753.323, 144.3842, 1.256636, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3712) +(@OGUID+1620, 181016, 530, 1, 1, 2984.193, 3711.066, 142.8784, 2.932139, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3712) +(@OGUID+1621, 181016, 530, 1, 1, 3025.728, 3750.257, 144.7281, 1.326448, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3712) +(@OGUID+1622, 181016, 530, 1, 1, 2946.058, 3725.089, 143.1839, 3.089183, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3712) +(@OGUID+1623, 181016, 530, 1, 1, 3004.393, 3656.724, 143.8046, 4.694937, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3712) +(@OGUID+1624, 181016, 530, 1, 1, 3058.527, 3663.685, 143.0369, 2.042035, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3712) +(@OGUID+1625, 181016, 530, 1, 1, 2972.385, 3659.229, 144.8418, 0, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3712) +(@OGUID+1626, 181016, 530, 1, 1, 2972.166, 3648.618, 144.8469, 0.03490625, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3712) +(@OGUID+1627, 181016, 530, 1, 1, 2947.035, 3659.529, 132.5782, 3.298687, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3712) +(@OGUID+1628, 181016, 530, 1, 1, 2947.682, 3649.331, 132.5782, 2.949595, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3712) +(@OGUID+1629, 181016, 530, 1, 1, 3003.333, 3637.782, 143.8042, 1.500983, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3712) +(@OGUID+1630, 181016, 530, 1, 1, 3037.129, 3606.581, 144.4336, 4.729844, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3712) +(@OGUID+1631, 181016, 530, 1, 1, 3115.857, 3694.574, 144.0382, 0.5061446, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3712) +(@OGUID+1632, 181016, 530, 1, 1, 3120.857, 3684.906, 143.2626, 0.5759573, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3712) +(@OGUID+1633, 181016, 530, 1, 1, 4083.412, 3091.455, 339.3883, 2.879789, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3738) +(@OGUID+1634, 181016, 530, 1, 1, 4082.152, 3077.441, 339.3883, 3.159062, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3738) +(@OGUID+1635, 181016, 530, 1, 1, 4122.787, 2967.157, 352.2287, 1.605702, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3738) +(@OGUID+1636, 181016, 530, 1, 1, 4092.646, 3104.921, 339.3883, 2.234018, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3738) +(@OGUID+1637, 181016, 530, 1, 1, 4087.922, 3100.24, 339.3883, 2.530723, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3738) +(@OGUID+1638, 181016, 530, 1, 1, 4099.208, 3107.681, 339.3884, 1.692969, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3738) +(@OGUID+1639, 181016, 530, 1, 1, 4114.772, 2967.272, 352.1837, 1.500983, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3738) +(@OGUID+1640, 181016, 530, 1, 1, 4113.936, 3050.741, 339.3003, 5.899214, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3738) +(@OGUID+1641, 181016, 530, 1, 1, 4123.493, 3055.268, 339.3098, 4.520406, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3738) +(@OGUID+1642, 181016, 530, 1, 1, 4105.933, 3108.072, 339.3884, 1.431168, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3738) +(@OGUID+1643, 181016, 530, 1, 1, 4114.827, 3105.379, 339.3884, 1.169369, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3738) +(@OGUID+1644, 181016, 530, 1, 1, 4126.727, 3096.481, 339.3884, 0.7155849, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3738) +(@OGUID+1645, 181016, 530, 1, 1, 4177.695, 3093.462, 335.8202, 5.445428, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3738) +(@OGUID+1646, 181016, 530, 1, 1, 4200.194, 3075.751, 335.8202, 2.565632, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3738) +(@OGUID+1647, 181016, 530, 1, 1, 4177.452, 3004.381, 339.1197, 2.495818, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3738) +(@OGUID+1648, 181016, 530, 1, 1, 4178.088, 3015.381, 339.1293, 3.804818, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3738) +(@OGUID+1649, 181016, 530, 1, 1, 9987.122, -7093.597, 47.70498, 5.253442, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3487) +(@OGUID+1650, 181016, 530, 1, 1, 9982.972, -7098.827, 47.70499, 6.056293, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3487) +(@OGUID+1651, 181016, 0, 1, 1, -4618.024, -925.1197, 501.0621, 0.7853968, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 5344) +(@OGUID+1652, 181016, 0, 1, 1, -4623.986, -917.6334, 501.063, 0.6981314, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 5344) +(@OGUID+1653, 181016, 0, 1, 1, -8657.15, 500.306, 101.605, 3.769912, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 5390) +(@OGUID+1654, 181016, 0, 1, 1, -8673.01, 442.396, 100.031, 1.658062, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 5390) +(@OGUID+1655, 181016, 0, 1, 1, -8711.88, 463.47, 97.4507, 5.201083, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 5390) +(@OGUID+1656, 181016, 0, 1, 1, -8746.15, 410.78, 98.2072, 6.056293, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 5149) +(@OGUID+1657, 181016, 0, 1, 1, -9021.94, 883.635, 29.6565, 5.864307, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 5154) +(@OGUID+1658, 181016, 0, 1, 1, -9013.6, 889.642, 29.6736, 4.886924, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 5154) +(@OGUID+1659, 181016, 0, 1, 1, -9010.44, 847.085, 105.864, 5.829401, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 5154) +(@OGUID+1660, 181016, 0, 1, 1, -9004.8, 854.139, 105.594, 5.218536, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 5154) +(@OGUID+1661, 181016, 0, 1, 1, -8984.32, 852.349, 29.6207, 2.652894, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 5154) +(@OGUID+1662, 181016, 0, 1, 1, -8992.8, 846.523, 29.6207, 1.675514, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 5154) +(@OGUID+1663, 181016, 0, 1, 1, -8611.958, 774.5919, 97.13689, 3.979355, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 5390) +(@OGUID+1664, 181016, 0, 1, 1, -8621.187, 786.2004, 97.13911, 3.68265, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 5390) +(@OGUID+1665, 181016, 0, 1, 1, -8586.704, 962.4266, 98.45146, 3.019413, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 5151) +(@OGUID+1666, 181016, 0, 1, 1, -8605.82, 983.8307, 98.57872, 4.834563, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 5151) +(@OGUID+1667, 181016, 0, 1, 1, -8548.039, 997.2659, 89.73065, 1.047198, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 5151) +(@OGUID+1668, 181016, 0, 1, 1, -8412.685, 1042.276, 68.38379, 2.33874, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 5346) +(@OGUID+1669, 181016, 0, 1, 1, -8562.563, 1016.086, 89.73065, 0.3490652, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1670, 181016, 0, 1, 1, -8350.607, 1093.494, 57.26217, 0.6806767, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1671, 181016, 0, 1, 1, -8336.738, 1109.575, 57.26216, 4.747296, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1672, 181016, 0, 1, 1, -8451.66, 1220.867, 5.646727, 3.036838, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4411) +(@OGUID+1673, 181016, 0, 1, 1, -8439.422, 1221.072, 5.661162, 0.122173, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4411) +(@OGUID+1674, 181016, 0, 1, 1, -8328.427, 1192.425, 5.818892, 1.832595, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4411) +(@OGUID+1675, 181016, 0, 1, 1, -8396.861, 1314.031, 5.981066, 6.143561, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4411) +(@OGUID+1676, 181016, 0, 1, 1, -8367.763, 1314.994, 6.094531, 3.211419, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4411) +(@OGUID+1677, 181016, 0, 1, 1, -8232.368, 1236.465, 5.230234, 2.879789, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4411) +(@OGUID+1678, 181016, 0, 1, 1, -8489.128, 1323.822, 5.894643, 0.087266, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4411) +(@OGUID+1679, 181016, 0, 1, 1, -8459.286, 1323.448, 5.861743, 3.159062, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 4411) +(@OGUID+1680, 181016, 530, 1, 1, -4025.329, -11590.4, -138.3277, 1.762782, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1681, 181016, 530, 1, 1, -4040.372, -11581.41, -138.4519, 0.6806767, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1682, 181016, 530, 1, 1, -4006.567, -11572.73, -138.0419, 2.670348, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1683, 181016, 530, 1, 1, -4214.633, -12476, 45.07409, 5.497789, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1684, 181016, 530, 1, 1, -4212.527, -12510.34, 45.44406, 0.2268925, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1685, 181016, 530, 1, 1, -4209.379, -12517.65, 45.81722, 0.3316107, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 0) +(@OGUID+1686, 181016, 530, 1, 1, -4185.712, -12504.83, 44.36132, 3.560473, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3576) +(@OGUID+1687, 181016, 530, 1, 1, -4176.958, -12493.97, 44.361, 1.361356, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3576) +(@OGUID+1688, 181016, 530, 1, 1, -4171.624, -12506.62, 44.36132, 5.550147, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3576) +(@OGUID+1689, 181016, 530, 1, 1, -4158.644, -12533.33, 45.45204, 2.129301, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3576) +(@OGUID+1690, 181016, 530, 1, 1, -4158.139, -12463.08, 45.08138, 3.717554, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3576) +(@OGUID+1691, 181016, 530, 1, 1, -4153.742, -12484.6, 44.51342, 3.909541, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3576) +(@OGUID+1692, 181016, 530, 1, 1, -4048.503, -13778.93, 75.01585, 0.2967052, 0, 0, 0, 1, 120, 255, 1), -- 181016 (Area: 3527) +(@OGUID+1693, 181015, 530, 1, 1, -1742.215, 5135.275, -36.2613, 1.169369, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 3899) +(@OGUID+1694, 181015, 530, 1, 1, -1757.831, 5131.28, -36.26131, 0.9075702, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 3899) +(@OGUID+1695, 181015, 530, 1, 1, -2037.28, 5275.622, -39.58699, 0.5410506, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 0) +(@OGUID+1696, 181015, 530, 1, 1, -2059.588, 5316.215, -37.32355, 5.235988, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 3899) +(@OGUID+1697, 181015, 530, 1, 1, 9612.646, -7184.878, 14.28442, 3.316144, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 3487) +(@OGUID+1698, 181015, 530, 1, 1, 9611.202, -7185.08, 14.28158, 0, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 3487) +(@OGUID+1699, 181015, 530, 1, 1, 9610.517, -7182.689, 14.28269, 1.797689, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 3487) +(@OGUID+1700, 181015, 530, 1, 1, 9612.523, -7182.323, 14.28678, 1.675514, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 3487) +(@OGUID+1701, 181015, 530, 1, 1, 9611.927, -7184.979, 15.52289, 4.502952, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 3487) +(@OGUID+1702, 181015, 0, 1, 1, -4916.252, -984.5313, 501.4471, 2.879789, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 5342) +(@OGUID+1703, 181015, 0, 1, 1, -4917.014, -984.7448, 502.6873, 2.617989, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 5342) +(@OGUID+1704, 181015, 0, 1, 1, -4918.153, -982.1979, 501.4553, 2.199115, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 5342) +(@OGUID+1705, 181015, 0, 1, 1, -4917.79, -985.2344, 501.4486, 0, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 5342) +(@OGUID+1706, 181015, 0, 1, 1, -4919.722, -983.6129, 501.4555, 2.460913, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 5342) +(@OGUID+1707, 181015, 0, 1, 1, -8867.429, 637.0868, 95.78714, 0.6981314, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 5148) +(@OGUID+1708, 181015, 0, 1, 1, -8868.944, 638.5764, 95.78714, 4.136433, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 5148) +(@OGUID+1709, 181015, 0, 1, 1, -8870.591, 636.8524, 95.78714, 4.625124, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 5148) +(@OGUID+1710, 181015, 0, 1, 1, -8869.873, 636.4618, 97.00977, 0, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 5148) +(@OGUID+1711, 181015, 0, 1, 1, -8869.328, 635.8524, 95.78714, 4.625124, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 5148) +(@OGUID+1712, 181015, 0, 1, 1, -8973.23, 491.104, 97.0423, 2.076939, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 5148) +(@OGUID+1713, 181015, 0, 1, 1, -8987.81, 509.179, 97.0711, 5.480334, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 5148) +(@OGUID+1714, 181015, 1, 1, 1, 9871.61, 2494.44, 1315.87, 6.003934, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 0) +(@OGUID+1715, 181015, 1, 1, 1, 9868.24, 2493.52, 1315.87, 0, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 0) +(@OGUID+1716, 181015, 1, 1, 1, 9868.4, 2494.36, 1317.11, 5.707228, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 0) +(@OGUID+1717, 181015, 1, 1, 1, 9868.74, 2495.04, 1315.87, 5.916668, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 0) +(@OGUID+1718, 181015, 1, 1, 1, 9870.92, 2492.5, 1315.87, 5.916668, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 0) +(@OGUID+1719, 181015, 530, 1, 1, -4004.693, -11842.24, 0.201654, 0, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 0) +(@OGUID+1720, 181015, 530, 1, 1, -4004.752, -11845.42, 0.192709, 4.642576, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 0) +(@OGUID+1721, 181015, 530, 1, 1, -4006.262, -11842.13, 0.18635, 4.153885, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 0) +(@OGUID+1722, 181015, 530, 1, 1, -4005.507, -11842.26, 1.427111, 4.886924, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 0) +(@OGUID+1723, 181015, 530, 1, 1, -4006.776, -11844.98, 0.173841, 4.468043, 0, 0, 0, 1, 120, 255, 1), -- 181015 (Area: 0) +(@OGUID+1724, 181014, 571, 1, 1, 5353.096, -2653.161, 310.5197, 3.857183, 0, 0, 0, 1, 120, 255, 1), -- 181014 (Area: 0) +(@OGUID+1725, 181014, 571, 1, 1, 5391.959, -2692.568, 310.2863, 3.874631, 0, 0, 0, 1, 120, 255, 1), -- 181014 (Area: 0) +(@OGUID+1726, 181014, 571, 1, 1, 3802.911, 1477.594, 94.39955, 3.263772, 0, 0, 0, 1, 120, 255, 1), -- 181014 (Area: 4165) +(@OGUID+1727, 181014, 571, 1, 1, 3771.654, 1596.684, 107.9985, 5.009095, 0, 0, 0, 1, 120, 255, 1), -- 181014 (Area: 4165) +(@OGUID+1728, 181014, 571, 1, 1, 3787.579, 1624.979, 107.0998, 0.2967052, 0, 0, 0, 1, 120, 255, 1), -- 181014 (Area: 4165) +(@OGUID+1729, 181014, 571, 1, 1, 2754.732, 6279.374, 181.2734, 2.286379, 0, 0, 0, 1, 120, 255, 1), -- 181014 (Area: 4129) +(@OGUID+1730, 181014, 530, 1, 1, -2054.687, 5229.547, -21.3585, 0.7679439, 0, 0, 0, 1, 120, 255, 1), -- 181014 (Area: 0) +(@OGUID+1731, 181014, 530, 1, 1, 9698.271, -7053.018, 22.76448, 4.729844, 0, 0, 0, 1, 120, 255, 1), -- 181014 (Area: 3487) +(@OGUID+1732, 181060, 571, 1, 1, 6676.038, -197.873, 951.159, 3.33359, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4428) +(@OGUID+1733, 181060, 571, 1, 1, 6676.64, -200.5191, 951.2183, 3.316144, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4428) +(@OGUID+1734, 181060, 571, 1, 1, 6692.196, -262.1433, 956.036, 3.124123, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4428) +(@OGUID+1735, 181060, 571, 1, 1, 6693.974, -261.8266, 956.4064, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4428) +(@OGUID+1736, 181060, 571, 1, 1, 5173.95, -2179.033, 236.5379, 6.143561, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1737, 181060, 571, 1, 1, 5148.001, -2198.408, 237.614, 5.707228, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1738, 181060, 571, 1, 1, 5190.736, -2212.201, 239.3978, 2.513274, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1739, 181060, 571, 1, 1, 5134.635, -2201.145, 238.8165, 0.4014249, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1740, 181060, 571, 1, 1, 5143.447, -2210.877, 237.8243, 0.157079, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1741, 181060, 571, 1, 1, 5380.456, -2636.633, 304.966, 3.106652, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1742, 181060, 571, 1, 1, 5407.522, -2646.742, 305.2902, 3.141593, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1743, 181060, 571, 1, 1, 5407.927, -2617.18, 305.2808, 2.984498, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1744, 181060, 571, 1, 1, 5410.432, -2652.655, 306.231, 2.635444, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1745, 181060, 571, 1, 1, 5465.895, -2590.533, 304.9167, 1.431168, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4275) +(@OGUID+1746, 181060, 571, 1, 1, 5435.949, -2590.28, 304.9167, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4275) +(@OGUID+1747, 181060, 571, 1, 1, 5492.635, -2649.156, 305.2701, 3.089183, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4275) +(@OGUID+1748, 181060, 571, 1, 1, 5492.885, -2617.632, 305.2991, 0.03490625, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4275) +(@OGUID+1749, 181060, 571, 1, 1, 5500.449, -2662.013, 304.9659, 6.161013, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4275) +(@OGUID+1750, 181060, 571, 1, 1, 5524.156, -2679.053, 305.1702, 1.291542, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4275) +(@OGUID+1751, 181060, 571, 1, 1, 5759.467, -3565.396, 388.2509, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4324) +(@OGUID+1752, 181060, 571, 1, 1, 5767.891, -3581.12, 388.5618, 4.747296, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4324) +(@OGUID+1753, 181060, 571, 1, 1, 5771.673, -3602.202, 388.4206, 2.495818, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4324) +(@OGUID+1754, 181060, 571, 1, 1, 5768.993, -3564.651, 388.132, 1.675514, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4324) +(@OGUID+1755, 181060, 571, 1, 1, 5760.941, -3580.523, 388.6815, 4.66003, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4324) +(@OGUID+1756, 181060, 571, 1, 1, 5800.075, -3557.563, 389.7701, 0.3316107, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4323) +(@OGUID+1757, 181060, 571, 1, 1, 5796.288, -3573.157, 388.1471, 3.211419, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4323) +(@OGUID+1758, 181060, 571, 1, 1, 5794.419, -3557.554, 388.8964, 3.176533, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4323) +(@OGUID+1759, 181060, 571, 1, 1, 5801.048, -3572.997, 389.0887, 3.019413, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4323) +(@OGUID+1760, 181060, 571, 1, 1, 3873.443, -4541.185, 210.1433, 4.188792, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1761, 181060, 571, 1, 1, 3876.738, -4547.531, 210.9673, 5.183629, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1762, 181060, 571, 1, 1, 3862.321, -4549.055, 211.5898, 2.757613, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1763, 181060, 571, 1, 1, 3408.684, -2785.898, 202.9841, 5.323256, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1764, 181060, 571, 1, 1, 3411.444, -2783.841, 202.9332, 5.358162, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1765, 181060, 571, 1, 1, 3421.057, -2770.74, 201.4035, 5.340709, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1766, 181060, 571, 1, 1, 3313.647, -2337.281, 112.4452, 0.157079, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1767, 181060, 571, 1, 1, 3201.634, -2297.767, 109.0517, 0.2792516, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4248) +(@OGUID+1768, 181060, 571, 1, 1, 3240.247, -2236.566, 117.1561, 4.607672, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4206) +(@OGUID+1769, 181060, 571, 1, 1, 1456.939, -3279.144, 173.5854, 0.9250238, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4071) +(@OGUID+1770, 181060, 571, 1, 1, 1454.438, -3273.762, 173.5819, 5.602507, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4071) +(@OGUID+1771, 181060, 571, 1, 1, 1458.552, -3277.082, 173.5854, 2.44346, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4071) +(@OGUID+1772, 181060, 571, 1, 1, 1457.29, -3270.155, 173.5816, 5.567601, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4071) +(@OGUID+1773, 181060, 571, 1, 1, 1445.745, -3269.811, 179.7056, 2.373644, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4071) +(@OGUID+1774, 181060, 571, 1, 1, 1447.377, -3267.913, 179.7009, 2.426008, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 4071) +(@OGUID+1775, 181060, 571, 1, 1, 1445.814, -3264.554, 168.441, 5.550147, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 3998) +(@OGUID+1776, 181060, 571, 1, 1, 1447.826, -3262.189, 168.441, 5.550147, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 3998) +(@OGUID+1777, 181060, 571, 1, 1, 606.9359, -4923.435, 24.95922, 1.919862, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1778, 181060, 571, 1, 1, 601.9346, -4924.686, 24.95571, 1.745327, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1779, 181060, 571, 1, 1, 600.7967, -4920.292, 24.95571, 3.368496, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1780, 181060, 571, 1, 1, 607.8849, -4925.905, 24.95922, 3.298687, 0, 0, 0, 1, 120, 255, 1), -- 181060 (Area: 0) +(@OGUID+1781, 181055, 1, 1, 1, 7862.05, -2568.29, 499.327, 0.1047193, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 656) +(@OGUID+1782, 181055, 1, 1, 1, 7958.75, -2575.71, 501.371, 3.124123, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 656) +(@OGUID+1783, 181055, 1, 1, 1, 8013.66, -2637.12, 523.791, 1.727875, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 656) +(@OGUID+1784, 181055, 1, 1, 1, 7917.81, -2496.79, 496.893, 0.122173, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 656) +(@OGUID+1785, 181055, 1, 1, 1, 7918.85, -2507.95, 496.78, 0.05235888, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 656) +(@OGUID+1786, 181055, 1, 1, 1, 7916.47, -2485.73, 496.947, 0.1396245, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 2361) +(@OGUID+1787, 181055, 1, 1, 1, 7856.99, -2491.97, 497.065, 3.194002, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 2361) +(@OGUID+1788, 181055, 1, 1, 1, 7859.37, -2514.28, 496.969, 3.281239, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 2361) +(@OGUID+1789, 181055, 1, 1, 1, 7857.99, -2503.12, 496.981, 3.228859, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 2361) +(@OGUID+1790, 181055, 1, 1, 1, 7883.59, -2461.34, 503.191, 1.692969, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 2361) +(@OGUID+1791, 181055, 1, 1, 1, 7831.7, -2476.79, 502.888, 4.76475, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 2361) +(@OGUID+1792, 181055, 1, 1, 1, 7830.23, -2446.4, 503.081, 1.605702, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 2361) +(@OGUID+1793, 181055, 571, 1, 1, 5762.126, 588.5176, 618.8284, 0.8901166, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4395) +(@OGUID+1794, 181055, 571, 1, 1, 5659.443, 679.3284, 661.8507, 5.864307, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4568) +(@OGUID+1795, 181055, 571, 1, 1, 5948.385, 621.1386, 660.8089, 2.775069, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4613) +(@OGUID+1796, 181055, 571, 1, 1, 5418.945, -2609.535, 310.7752, 3.124123, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1797, 181055, 571, 1, 1, 5418.217, -2654.892, 310.6752, 3.124123, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1798, 181055, 571, 1, 1, 5427.37, -2617.239, 310.7862, 4.694937, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1799, 181055, 571, 1, 1, 5427.162, -2601.81, 310.7791, 1.553341, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1800, 181055, 571, 1, 1, 5426.538, -2647.546, 310.7589, 1.553341, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1801, 181055, 571, 1, 1, 5435.416, -2610.136, 310.76, 6.265733, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1802, 181055, 571, 1, 1, 5465.976, -2609.939, 310.7266, 3.124123, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4275) +(@OGUID+1803, 181055, 571, 1, 1, 5472.982, -2649.109, 310.3139, 1.623156, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4275) +(@OGUID+1804, 181055, 571, 1, 1, 5473.117, -2618.065, 310.7838, 4.694937, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4275) +(@OGUID+1805, 181055, 571, 1, 1, 5474.365, -2602.701, 310.6908, 1.553341, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4275) +(@OGUID+1806, 181055, 571, 1, 1, 5482.347, -2610.531, 310.6789, 6.265733, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4275) +(@OGUID+1807, 181055, 571, 1, 1, 5481.421, -2655.851, 310.4912, 0, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4275) +(@OGUID+1808, 181055, 571, 1, 1, 5779.607, -3647.157, 397.0788, 4.81711, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4324) +(@OGUID+1809, 181055, 571, 1, 1, 3415.612, -2804.818, 207.8745, 5.340709, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1810, 181055, 571, 1, 1, 3426.07, -2797.111, 207.806, 5.340709, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1811, 181055, 571, 1, 1, 3404.855, -2779.617, 207.3744, 2.216565, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1812, 181055, 571, 1, 1, 3272.992, -2376.118, 126.1801, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1813, 181055, 571, 1, 1, 3248.334, -2376.13, 125.8163, 1.570796, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1814, 181055, 571, 1, 1, 3220.808, -2360.816, 129.0979, 0.5585039, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1815, 181055, 571, 1, 1, 3194.915, -2304.803, 131.4482, 0.157079, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1816, 181055, 571, 1, 1, 3207.483, -2339.074, 129.0386, 0.5410506, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1817, 181055, 571, 1, 1, 3313.64, -2339.259, 135.3806, 2.460913, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1818, 181055, 571, 1, 1, 3191.102, -2279.254, 131.5012, 0.1396245, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4248) +(@OGUID+1819, 181055, 571, 1, 1, 3351.668, -2245.885, 137.426, 3.159062, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4206) +(@OGUID+1820, 181055, 571, 1, 1, 3331.027, -2305.595, 137.5376, 2.705255, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4206) +(@OGUID+1821, 181055, 571, 1, 1, 3342.094, -2281.307, 137.6798, 2.705255, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4206) +(@OGUID+1822, 181055, 571, 1, 1, 3325.675, -2187.142, 134.1245, 3.787367, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4206) +(@OGUID+1823, 181055, 571, 1, 1, 2495.748, -1930.493, 18.89087, 0.5934101, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4242) +(@OGUID+1824, 181055, 571, 1, 1, 2510.754, -1823.163, 18.16746, 5.515242, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4242) +(@OGUID+1825, 181055, 571, 1, 1, 2508.891, -1811.156, 18.57204, 0.802851, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4242) +(@OGUID+1826, 181055, 571, 1, 1, 2502.159, -1831.973, 18.18279, 5.480334, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4242) +(@OGUID+1827, 181055, 571, 1, 1, 2493.719, -1840.646, 18.18876, 5.515242, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4242) +(@OGUID+1828, 181055, 571, 1, 1, 2482.121, -1838.097, 19.10611, 3.926996, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4242) +(@OGUID+1829, 181055, 571, 1, 1, 4502.594, 5701.009, 86.9327, 3.804818, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1830, 181055, 571, 1, 1, 4520.103, 5699.374, 86.98763, 5.375615, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1831, 181055, 571, 1, 1, 4505.328, 5718.376, 87.04783, 2.234018, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1832, 181055, 571, 1, 1, 4522.387, 5716.762, 86.95365, 0.6632232, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 4122) +(@OGUID+1833, 181055, 530, 1, 1, -1730.328, 5649.338, 136.299, 1.588249, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3899) +(@OGUID+1834, 181055, 530, 1, 1, -1645.066, 5192.24, -27.42542, 2.565632, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3899) +(@OGUID+1835, 181055, 530, 1, 1, -1759.38, 5167.662, -28.72669, 1.902409, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3899) +(@OGUID+1836, 181055, 530, 1, 1, -2056.806, 5228.367, -27.39764, 0.7504908, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1837, 181055, 530, 1, 1, -2138.824, 5148.72, -8.640973, 3.944446, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1838, 181055, 530, 1, 1, -1864.128, 4999.87, -8.724302, 4.66003, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1839, 181055, 530, 1, 1, -1552.944, 5125.714, -8.696525, 5.689774, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 0) +(@OGUID+1840, 181055, 530, 1, 1, -2625.937, 4419.99, 42.99473, 4.572764, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3683) +(@OGUID+1841, 181055, 530, 1, 1, -3080.017, 2519.666, 75.95196, 0.3490652, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3744) +(@OGUID+1842, 181055, 530, 1, 1, -3097.624, 2522.847, 75.95374, 2.44346, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3744) +(@OGUID+1843, 181055, 530, 1, 1, -3088.047, 2526.28, 75.9549, 1.396262, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3744) +(@OGUID+1844, 181055, 530, 1, 1, -3092.005, 2502.068, 76.35168, 4.555311, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3744) +(@OGUID+1845, 181055, 530, 1, 1, -3099.529, 2512.387, 75.96468, 3.490667, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3744) +(@OGUID+1846, 181055, 530, 1, 1, -3081.95, 2509.127, 75.9601, 5.585054, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3744) +(@OGUID+1847, 181055, 530, 1, 1, -2980.738, 2565.908, 97.9761, 2.705255, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3744) +(@OGUID+1848, 181055, 530, 1, 1, -2978.653, 2545.87, 97.51945, 3.787367, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3744) +(@OGUID+1849, 181055, 530, 1, 1, -2960.054, 2536.851, 96.74974, 4.81711, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3744) +(@OGUID+1850, 181055, 530, 1, 1, -2944.712, 2569.651, 97.11517, 0.6108634, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3744) +(@OGUID+1851, 181055, 530, 1, 1, -2963.106, 2578.467, 97.77729, 1.658062, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3744) +(@OGUID+1852, 181055, 530, 1, 1, -2943.146, 2549.089, 96.68553, 5.846854, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3744) +(@OGUID+1853, 181055, 530, 1, 1, -3956.793, 2241.567, 107.9687, 4.572764, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3745) +(@OGUID+1854, 181055, 530, 1, 1, -4044.765, 2237.184, 118.0772, 5.515242, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3745) +(@OGUID+1855, 181055, 530, 1, 1, -4063.29, 2183.958, 117.962, 0.03490625, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3745) +(@OGUID+1856, 181055, 530, 1, 1, -4053.135, 2167.243, 117.8958, 0.01745246, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3745) +(@OGUID+1857, 181055, 530, 1, 1, -4063.405, 2159.092, 117.9386, 4.729844, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3745) +(@OGUID+1858, 181055, 530, 1, 1, -4114.495, 1119.618, 52.38124, 5.742135, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3929) +(@OGUID+1859, 181055, 530, 1, 1, -3006.023, 795.2581, -1.891022, 2.565632, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3754) +(@OGUID+1860, 181055, 530, 1, 1, -716.8414, 2735.047, 100.798, 3.141593, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3538) +(@OGUID+1861, 181055, 530, 1, 1, -717.3152, 2750.212, 100.8153, 3.176533, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3538) +(@OGUID+1862, 181055, 530, 1, 1, -699.2603, 2709.337, 101.0987, 4.694937, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3538) +(@OGUID+1863, 181055, 530, 1, 1, -690.6761, 2732.448, 100.9171, 6.265733, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3538) +(@OGUID+1864, 181055, 530, 1, 1, -690.3901, 2717.364, 101.012, 0, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3538) +(@OGUID+1865, 181055, 530, 1, 1, 175.2291, 2619.424, 98.45457, 2.18166, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3536) +(@OGUID+1866, 181055, 530, 1, 1, 187.7007, 2628.467, 98.74133, 2.164206, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3536) +(@OGUID+1867, 181055, 530, 1, 1, 203.049, 4333.749, 125.1613, 3.141593, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3552) +(@OGUID+1868, 181055, 530, 1, 1, -223.1397, 5396.124, 40.32872, 1.867502, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3521) +(@OGUID+1869, 181055, 530, 1, 1, -222.4095, 5391.945, 40.32674, 4.921829, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3521) +(@OGUID+1870, 181055, 530, 1, 1, -341.6888, 5481.863, 37.94325, 3.054327, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3565) +(@OGUID+1871, 181055, 530, 1, 1, -337.4103, 5481.802, 37.91649, 6.161013, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3565) +(@OGUID+1872, 181055, 530, 1, 1, -186.2492, 5519.735, 33.73346, 3.455756, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3565) +(@OGUID+1873, 181055, 530, 1, 1, -181.5449, 5532.257, 33.22929, 1.884953, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3565) +(@OGUID+1874, 181055, 530, 1, 1, -175.3683, 5512.138, 33.37462, 5.026549, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3565) +(@OGUID+1875, 181055, 530, 1, 1, -166.1566, 5537.293, 33.22692, 1.884953, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3565) +(@OGUID+1876, 181055, 530, 1, 1, -96.04215, 5545.813, 45.60166, 3.089183, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3565) +(@OGUID+1877, 181055, 530, 1, 1, -91.70524, 5545.659, 45.61694, 6.178466, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3565) +(@OGUID+1878, 181055, 530, 1, 1, -159.9268, 5517.314, 33.24236, 5.026549, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3565) +(@OGUID+1879, 181055, 530, 1, 1, -155.342, 5529.741, 33.96249, 0.3141584, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3565) +(@OGUID+1880, 181055, 530, 1, 1, -1260.943, 7180.634, 63.39374, 2.565632, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3613) +(@OGUID+1881, 181055, 530, 1, 1, 1044.882, 7361.025, 45.56539, 3.874631, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3766) +(@OGUID+1882, 181055, 530, 1, 1, 1941.395, 6838.657, 177.4772, 0.01745246, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3771) +(@OGUID+1883, 181055, 530, 1, 1, 1937.434, 6838.64, 177.4422, 3.194002, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3771) +(@OGUID+1884, 181055, 530, 1, 1, 2085.431, 6890.104, 190.4657, 3.944446, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3772) +(@OGUID+1885, 181055, 530, 1, 1, 2095.052, 6899.62, 190.4382, 3.944446, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3772) +(@OGUID+1886, 181055, 530, 1, 1, 2070.803, 6759.671, 173.2742, 4.694937, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3772) +(@OGUID+1887, 181055, 530, 1, 1, 2055.827, 6759.792, 173.2742, 4.729844, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3772) +(@OGUID+1888, 181055, 530, 1, 1, 2066.258, 6730.639, 181.5167, 1.518436, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3772) +(@OGUID+1889, 181055, 530, 1, 1, 2066.148, 6726.275, 181.5531, 4.747296, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3772) +(@OGUID+1890, 181055, 530, 1, 1, 2944.296, 5533.428, 163.821, 2.565632, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3828) +(@OGUID+1891, 181055, 530, 1, 1, 3085.633, 5473.628, 162.5824, 0.2967052, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3951) +(@OGUID+1892, 181055, 530, 1, 1, 2940.299, 5415.802, 165.9382, 4.084071, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3951) +(@OGUID+1893, 181055, 530, 1, 1, 2090.407, 4769.771, 175.6497, 4.921829, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3827) +(@OGUID+1894, 181055, 530, 1, 1, 2092.127, 4792.164, 175.6362, 1.134463, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3827) +(@OGUID+1895, 181055, 530, 1, 1, 2098.946, 4779.432, 175.5325, 6.178466, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3827) +(@OGUID+1896, 181055, 530, 1, 1, 2078.747, 4789.831, 175.6968, 2.391098, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3827) +(@OGUID+1897, 181055, 530, 1, 1, 3018.137, 3748.76, 151.2779, 1.291542, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3712) +(@OGUID+1898, 181055, 530, 1, 1, 2948.536, 3719.698, 150.2694, 3.124123, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3712) +(@OGUID+1899, 181055, 530, 1, 1, 3044.282, 3608.729, 150.461, 4.729844, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3712) +(@OGUID+1900, 181055, 530, 1, 1, 3116.458, 3688.845, 150.6044, 0.5585039, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3712) +(@OGUID+1901, 181055, 530, 1, 1, 4116.873, 3058.359, 349.9748, 5.131269, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3738) +(@OGUID+1902, 181055, 530, 1, 1, 4184.254, 3009.556, 349.8448, 3.124123, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3738) +(@OGUID+1903, 181055, 530, 1, 1, 4118.572, 2954.05, 360.3641, 1.605702, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3738) +(@OGUID+1904, 181055, 530, 1, 1, 2984.813, 1803.785, 146.0861, 0.6632232, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3728) +(@OGUID+1905, 181055, 530, 1, 1, 2969.402, 1791.448, 145.6347, 3.769912, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3724) +(@OGUID+1906, 181055, 530, 1, 1, 9954.997, -7098.571, 59.86189, 3.996807, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3487) +(@OGUID+1907, 181055, 530, 1, 1, 9992.33, -7205.063, 44.06255, 2.18166, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3487) +(@OGUID+1908, 181055, 530, 1, 1, 10002.23, -7202.467, 44.06782, 1.466076, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3487) +(@OGUID+1909, 181055, 530, 1, 1, 10007.34, -7030.903, 57.97285, 4.06662, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3487) +(@OGUID+1910, 181055, 530, 1, 1, 10010.68, -7199.167, 44.22095, 2.478367, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3487) +(@OGUID+1911, 181055, 530, 1, 1, 9952.419, -7232.268, 43.9028, 2.234018, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3487) +(@OGUID+1912, 181055, 530, 1, 1, 9945.498, -7242.049, 43.90578, 2.792518, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 3487) +(@OGUID+1913, 181055, 0, 1, 1, -8341.17, 615.349, 104.273, 2.234018, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 5150) +(@OGUID+1914, 181055, 0, 1, 1, -8605.4, 391.313, 114.686, 2.234018, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 5390) +(@OGUID+1915, 181055, 0, 1, 1, -8610.86, 398.378, 114.794, 2.234018, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 5390) +(@OGUID+1916, 181055, 0, 1, 1, -8616.79, 405.722, 114.684, 2.234018, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 5390) +(@OGUID+1917, 181055, 0, 1, 1, -8845.916, 468.9219, 122.3519, 3.804818, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 5148) +(@OGUID+1918, 181055, 0, 1, 1, -8892.52, 867.236, 109.002, 0.9250238, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 5390) +(@OGUID+1919, 181055, 0, 1, 1, -8937.31, 861.234, 119.3, 6.213374, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 5390) +(@OGUID+1920, 181055, 0, 1, 1, -8914.21, 995.188, 129.577, 4.188792, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 5390) +(@OGUID+1921, 181055, 0, 1, 1, -8948.17, 861.865, 119.265, 2.967041, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 5390) +(@OGUID+1922, 181055, 0, 1, 1, -8630.926, 945.2589, 136.5359, 3.822273, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 5151) +(@OGUID+1923, 181055, 0, 1, 1, -8578.42, 986.8, 133.948, 0.6806767, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 5151) +(@OGUID+1924, 181055, 0, 1, 1, -8523.936, 930.3209, 108.977, 1.53589, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 5151) +(@OGUID+1925, 181055, 1, 1, 1, 10144.4, 2233.66, 1352.2, 2.199115, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 1659) +(@OGUID+1926, 181055, 1, 1, 1, 10130.9, 2224.82, 1352.22, 2.111848, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 1659) +(@OGUID+1927, 181055, 1, 1, 1, 10119.3, 2216.15, 1351.82, 2.199115, 0, 0, 0, 1, 120, 255, 1), -- 181055 (Area: 1659) +(@OGUID+1928, 181017, 0, 1, 1, -8624.95, 933.507, 125.42, 3.839725, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 5151) +(@OGUID+1929, 181017, 0, 1, 1, -8641.03, 953.563, 125.408, 3.822273, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 5151) +(@OGUID+1930, 181017, 0, 1, 1, -8568.147, 978.654, 122.7587, 3.804818, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 5151) +(@OGUID+1931, 181017, 0, 1, 1, -8584.17, 998.563, 122.819, 0.6806767, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 5151) +(@OGUID+1932, 181017, 0, 1, 1, -8504.936, 1192.633, 16.33525, 0.5410506, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4411) +(@OGUID+1933, 181017, 0, 1, 1, -8512.316, 1200.338, 16.39689, 0.9250238, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4411) +(@OGUID+1934, 181017, 0, 1, 1, -8520.524, 1204.205, 16.42972, 1.396262, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4411) +(@OGUID+1935, 181017, 0, 1, 1, -8542.321, 1200.581, 16.43208, 2.129301, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4411) +(@OGUID+1936, 181017, 0, 1, 1, -8534.486, 1204.204, 16.40989, 1.745327, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4411) +(@OGUID+1937, 181017, 0, 1, 1, -8276.106, 1193.003, 16.38176, 2.495818, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4411) +(@OGUID+1938, 181017, 0, 1, 1, -8268.55, 1200.73, 16.45654, 2.146753, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4411) +(@OGUID+1939, 181017, 0, 1, 1, -8238.383, 1200.478, 16.38265, 0.9424766, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4411) +(@OGUID+1940, 181017, 0, 1, 1, -8246.669, 1204.407, 16.31734, 1.378809, 0, 0, 0, 1, 120, 255, 1), -- 181017 (Area: 4411) +(@OGUID+1941, 181017, 0, 1, 1, -8260.668, 1204.398, 16.41504, 1.710422, 0, 0, 0, 1, 120, 255, 1); -- 181017 (Area: 4411) + +DELETE FROM `game_event_gameobject` WHERE `guid` BETWEEN @OGUID+0 AND @OGUID+1941 AND `eventEntry`=@Event; +INSERT INTO `game_event_gameobject` SELECT @Event, gameobject.guid FROM `gameobject` WHERE gameobject.guid BETWEEN @OGUID+0 AND @OGUID+1941; + +DELETE FROM `gameobject` WHERE `guid` IN (24399, 24400, 24401, 24402, 24405); + +UPDATE `creature` SET `position_x`=9616.942, `position_y`=-7181.332, `position_z`=14.3793, `orientation`=2.303835 WHERE `guid`=208827; +UPDATE `creature` SET `position_x`=9612.548, `position_y`=-7182.34, `position_z`=15.55145, `orientation`=1.762783 WHERE `guid`=208800; +UPDATE `creature` SET `position_x`=-4918.147, `position_y`=-982.1111, `position_z`=502.7113, `orientation`=2.234021 WHERE `guid`=208797; +UPDATE `creature` SET `position_x`=-8867.42, `position_y`=637.047, `position_z`=97.03574, `orientation`=0.8203048 WHERE `guid`=208798; +UPDATE `creature` SET `position_x`=9870.95, `position_y`=2492.47, `position_z`=1317.113, `orientation`=5.969026 WHERE `guid`=208799; +UPDATE `creature` SET `position_x`=-4006.774, `position_y`=-11844.94, `position_z`=1.430115, `orientation`=4.468043 WHERE `guid`=208796; +UPDATE `creature` SET `position_x`=9610.493, `position_y`=-7182.677, `position_z`=15.53905, `orientation`=1.850049 WHERE `guid`=208808; +UPDATE `creature` SET `position_x`=-4919.688, `position_y`=-983.6163, `position_z`=502.6961, `orientation`=2.949606 WHERE `guid`=208810; +UPDATE `creature` SET `position_x`=-8868.953, `position_y`=638.5087, `position_z`=97.03911, `orientation`=1.466077 WHERE `guid`=208806; +UPDATE `creature` SET `position_x`=9871.64, `position_y`=2494.43, `position_z`=1317.123, `orientation`=6.021386 WHERE `guid`=208807; +UPDATE `creature` SET `position_x`=-4004.755, `position_y`=-11845.5, `position_z`=1.443716, `orientation`=4.782202 WHERE `guid`=208811; +UPDATE `creature` SET `position_x`=9586.303, `position_y`=-7181.014, `position_z`=14.32427, `orientation`=0 WHERE `guid`=208833; diff --git a/sql/updates/world/2016_02_25_00_world.sql b/sql/updates/world/2016_02_25_00_world.sql new file mode 100644 index 00000000000..346c77bee43 --- /dev/null +++ b/sql/updates/world/2016_02_25_00_world.sql @@ -0,0 +1,5 @@ +-- Create gossip_menu_option 7731,7732 for NPC 18588 Floon in Terokkar Forest +DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (7731,7732) AND `id` = 0; +INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`OptionBroadcastTextID`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`,`BoxBroadcastTextID`) VALUES +(7731,0,0,'He wants his "golds." Pay up or die... again...',15564,1,1,0,0,0,0,'',0), +(7732,0,0,"I have been sent by Sal'salabim to collect a debt that you owe. Pay up or I'm going to have to hurt you.",15560,1,1,0,0,0,0,'',0); diff --git a/sql/updates/world/2016_02_25_01_world_335.sql b/sql/updates/world/2016_02_25_01_world_335.sql new file mode 100644 index 00000000000..473cbd506ce --- /dev/null +++ b/sql/updates/world/2016_02_25_01_world_335.sql @@ -0,0 +1,25 @@ +-- new gossip_menus for Quest 5742 Redemption (Tirion's Tale) +DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (3502,3681,3682,3683) AND `id` = 0; +INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`OptionBroadcastTextID`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`,`BoxBroadcastTextID`) VALUES +(3502, 0,0, 'I am ready to hear your tale, Tirion.', 7219, 1,1, 3681, 0,0,0,'',0), +(3681, 0,0, 'Thank you, Tirion. What of your identity?', 7221, 1,1, 3682, 0,0,0,'',0), +(3682, 0,0, 'That is terrible.', 7223, 1,1, 3683, 0,0,0,'',0), +(3683, 0,0, 'I will, Tirion.', 7225, 1,1, 0, 0,0,0,'',0); + +-- update creature entry 1855 Tirion Fordring +UPDATE `creature_template` SET `AIName` = 'SmartAI', `ScriptName`= '' WHERE `entry` = 1855; + +-- SmartAI script actions for Quest 5742 Redemption (Tirion's Tale) +DELETE FROM `smart_scripts` WHERE `entryorguid`= 1855 AND `source_type`= 0; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(1855,0, 0,0, 62, 0,100,0, 3502, 0,0,0, 98, 3681, 4493, 0,0,0,0, 7,0,0,0,0,0,0,0, 'Tirion Fordring - on gossip_menu 3502 selected - Send Gossip text 4493 with menu option 3681'), +(1855,0, 1,0, 62, 0,100,0, 3681, 0,0,0, 98, 3682, 4494, 0,0,0,0, 7,0,0,0,0,0,0,0, 'Tirion Fordring - on gossip_menu 3681 selected - Send Gossip text 4494 with menu option 3682'), +(1855,0, 2,0, 62, 0,100,0, 3682, 0,0,0, 98, 3683, 4495, 0,0,0,0, 7,0,0,0,0,0,0,0, 'Tirion Fordring - on gossip_menu 3682 selected - Send Gossip text 4495 with menu option 3683'), +(1855,0, 3,4, 62, 0,100,0, 3683, 0,0,0, 15, 5742, 0, 0,0,0,0, 7,0,0,0,0,0,0,0, 'Tirion Fordring - on gossip_menu 3683 selected - Give credit for Quest 5742 Redemption'), +(1855,0, 4,0, 61, 0,100,0, 0, 0,0,0, 72, 0, 0, 0,0,0,0, 7,0,0,0,0,0,0,0, 'Tirion Fordring - on gossip_menu 3683 selected - Close Gossip'); + +-- conditions for Quest 5742 Redemption (Tirion's Tale) +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`= 15 AND `SourceGroup`= 3502; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(15, 3502,0, 0,1, 9,0, 5742, 0,0,0,0,0, '', 'Show gossip menu option 3502 only if Quest 5742 is taken (active)'), +(15, 3502,0, 0,1, 41,0, 1, 1,0,0,0,0, '', 'Show gossip menu option 3502 only if player is sitting (any type)'); diff --git a/sql/updates/world/2016_02_25_02_world.sql b/sql/updates/world/2016_02_25_02_world.sql new file mode 100644 index 00000000000..c5355b13c29 --- /dev/null +++ b/sql/updates/world/2016_02_25_02_world.sql @@ -0,0 +1,109 @@ +SET @CGUID := 86984; + +DELETE FROM `creature` WHERE `id`=24110 AND `guid` BETWEEN @CGUID+0 AND @CGUID+31; +INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `MovementType`) VALUES +(@CGUID+0, 24110, 571, 1, 1, 2480.52, -405.0309, 31.25292, 1.954769, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+1, 24110, 571, 1, 1, 2485.832, -406.4011, 38.64569, 1.937315, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+2, 24110, 571, 1, 1, 2483.247, -405.9387, 35.05476, 4.991642, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+3, 24110, 571, 1, 1, 2477.307, -404.4191, 27.71297, 2.530727, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+4, 24110, 571, 1, 1, 2490.05, -404.6198, 27.34736, 0, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+5, 24110, 571, 1, 1, 2486.804, -396.4983, 37.61678, 6.248279, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+6, 24110, 571, 1, 1, 2473.764, -403.68, 23.80915, 3.246312, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+7, 24110, 571, 1, 1, 2489.167, -395.6806, 28.83605, 0.01745329, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+8, 24110, 571, 1, 1, 2488.105, -403.3663, 35.30573, 2.80998, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+9, 24110, 571, 1, 1, 2457.642, -389.6918, 23.55255, 6.143559, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+10, 24110, 571, 1, 1, 2469.61, -402.5246, 21.45798, 4.08407, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+11, 24110, 571, 1, 1, 2454.252, -397.5855, 51.25713, 0.03490658, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+12, 24110, 571, 1, 1, 2457.418, -405.3847, 30.72205, 6.213372, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+13, 24110, 571, 1, 1, 2483.101, -393.8391, 43.72463, 2.897247, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+14, 24110, 571, 1, 1, 2455.441, -395.9613, 42.66463, 0.05235988, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+15, 24110, 571, 1, 1, 2454.66, -404.776, 48.54633, 6.143559, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+16, 24110, 571, 1, 1, 2458.783, -404.1076, 23.79817, 6.265732, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+17, 24110, 571, 1, 1, 2458.11, -410.4796, 22.85155, 6.195919, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+18, 24110, 571, 1, 1, 2481.292, -393.944, 40.58387, 4.171337, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+19, 24110, 571, 1, 1, 2457.773, -397.1545, 31.50192, 6.195919, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+20, 24110, 571, 1, 1, 2469.01, -396.4393, 25.475, 0.2792527, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+21, 24110, 571, 1, 1, 2478.411, -394.4479, 36.02073, 4.223697, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+22, 24110, 571, 1, 1, 2456.78, -389.8281, 32.9614, 0, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+23, 24110, 571, 1, 1, 2460.665, -399.6276, 19.7543, 3.089233, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+24, 24110, 571, 1, 1, 2476.166, -394.8342, 31.92243, 1.27409, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+25, 24110, 571, 1, 1, 2455.731, -404.8611, 40.88202, 6.213372, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+26, 24110, 571, 1, 1, 2460.889, -401.5321, 19.4641, 5.131268, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+27, 24110, 571, 1, 1, 2464.679, -397.7112, 21.8534, 5.113815, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+28, 24110, 571, 1, 1, 2464.713, -401.7634, 19.7663, 0.06981317, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+29, 24110, 571, 1, 1, 2456.293, -412.3963, 29.24669, 6.073746, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+30, 24110, 571, 1, 1, 2472.812, -395.45, 28.40558, 3.368485, 120, 0, 0), -- 24110 (Area: 4181) +(@CGUID+31, 24110, 571, 1, 1, 2458.6, -396.5036, 23.42054, 6.248279, 120, 0, 0); -- 24110 (Area: 4181) + +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=28013; +UPDATE `creature_template` SET `AIName`='' WHERE `entry`=28013; +DELETE FROM `creature` WHERE `id`=28013; + +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid` BETWEEN -@CGUID-31 AND -@CGUID-0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(-@CGUID-0, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-0, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-1, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-1, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-2, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-2, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-3, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-3, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-4, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-4, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-5, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-5, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-6, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-6, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-7, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-7, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-8, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-8, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-9, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-9, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-10, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-10, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-11, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-11, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-12, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-12, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-13, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-13, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-14, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-14, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-15, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-15, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-16, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-16, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-17, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-17, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-18, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-18, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-19, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-19, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-20, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-20, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-21, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-21, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-22, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-22, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-23, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-23, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-24, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-24, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-25, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-25, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-26, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-26, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-27, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-27, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-28, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-28, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-29, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-29, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-30, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-30, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''), +(-@CGUID-31, 0, 0, 1, 8, 0, 100, 0, 48455, 0, 0, 0, 11, 50290, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Fire Upon the Waters: Sail Burning Kill Credit\''), +(-@CGUID-31, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48522, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'ELM General Purpose Bunny Large - On Spellhit \'Apothecary\'s Burning Water\' - Cast \'Sinner''s Folly Fire Bunny: Periodic Fire Aura\''); + +UPDATE `conditions` SET `ConditionValue2`=24110, `Comment`='Fire Upon the Waters - spell to ELM General Purpose Bunny Large' WHERE `SourceTypeOrReferenceId`=13 AND `SourceGroup`=1 AND `SourceEntry`=48455 AND `SourceId`=0 AND `ElseGroup`=0 AND `ConditionTypeOrReference`=31 AND `ConditionTarget`=0 AND `ConditionValue1`=3 AND `ConditionValue2`=28013 AND `ConditionValue3`=0; diff --git a/sql/updates/world/2016_02_26_00_world.sql b/sql/updates/world/2016_02_26_00_world.sql new file mode 100644 index 00000000000..d08d5055089 --- /dev/null +++ b/sql/updates/world/2016_02_26_00_world.sql @@ -0,0 +1,17 @@ +UPDATE `smart_scripts` SET `action_type`=11, `action_param1`=48351, `comment`='Bombard the Ballistae Kill Credit Bunny - On Spellhit \'Siegesmith Bombs\' - Cast Bombard the Ballistae: Ballista Bow' WHERE `entryorguid`=27331 AND `source_type`=0 AND `id`=1 AND `link`=0; +UPDATE `smart_scripts` SET `event_param3`=120000, `event_param4`=120000 WHERE `entryorguid`=27331 AND `source_type`=0 AND `id`=0 AND `link`=1; + +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=27331 AND `id`>1; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(27331, 0, 2, 3, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48352, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Bombard the Ballistae Kill Credit Bunny - On Spellhit \'Siegesmith Bombs\' - Cast Bombard the Ballistae: Ballista Frame'), +(27331, 0, 3, 4, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48353, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Bombard the Ballistae Kill Credit Bunny - On Spellhit \'Siegesmith Bombs\' - Cast Bombard the Ballistae: Ballista Missile'), +(27331, 0, 4, 5, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48354, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Bombard the Ballistae Kill Credit Bunny - On Spellhit \'Siegesmith Bombs\' - Cast Bombard the Ballistae: Ballista Wheel'), +(27331, 0, 5, 6, 61, 0, 100, 0, 0, 0, 0, 0, 11, 48347, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Bombard the Ballistae Kill Credit Bunny - On Spellhit \'Siegesmith Bombs\' - Cast Bombard the Ballistae: FX Master'), +(27331, 0, 6, 7, 61, 0, 100, 0, 0, 0, 0, 0, 11, 52687, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Bombard the Ballistae Kill Credit Bunny - On Spellhit \'Siegesmith Bombs\' - Cast Bombard the Ballistae: Knockback'), +(27331, 0, 7, 0, 61, 0, 100, 0, 0, 0, 0, 0, 70, 120, 0, 0, 0, 0, 0, 20, 188673, 0, 0, 0, 0, 0, 0, 'Bombard the Ballistae Kill Credit Bunny - On Spellhit \'Siegesmith Bombs\' - Despawn GO'); + +UPDATE `smart_scripts` SET `link`=2 WHERE `entryorguid`=27331 AND `source_type`=0 AND `id`=1 AND `link`=0; + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=48347; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 2, 48347, 0, 0, 31, 0, 5, 188673, 0, 0, 0, 0, '', 'Bombard the Ballistae: FX Master effect #2 targets go 188673'); diff --git a/sql/updates/world/2016_02_26_01_world.sql b/sql/updates/world/2016_02_26_01_world.sql new file mode 100644 index 00000000000..b30b3cba35f --- /dev/null +++ b/sql/updates/world/2016_02_26_01_world.sql @@ -0,0 +1 @@ +DELETE FROM `event_scripts` WHERE `id` = 16547; diff --git a/sql/updates/world/2016_02_27_00_world.sql b/sql/updates/world/2016_02_27_00_world.sql new file mode 100644 index 00000000000..b9288b2ddfb --- /dev/null +++ b/sql/updates/world/2016_02_27_00_world.sql @@ -0,0 +1,4 @@ +-- fix "Val'anyr, Hammer of Ancient Kings" to properly provide shields from Earth Shield charges and Glyph of Holy Light heals (as well as others) +DELETE FROM `spell_proc_event` WHERE `entry`=64411; +INSERT INTO `spell_proc_event` (`entry`,`procFlags`) VALUES +(64411,0x00044400); diff --git a/sql/updates/world/2016_02_28_00_world.sql b/sql/updates/world/2016_02_28_00_world.sql new file mode 100644 index 00000000000..5a5694e0320 --- /dev/null +++ b/sql/updates/world/2016_02_28_00_world.sql @@ -0,0 +1,2 @@ +-- remove script from core requires removing ScriptName from creature_template +UPDATE `creature_template` SET `ScriptName`= '' WHERE `entry`IN (1749,2708); diff --git a/sql/updates/world/2016_02_29_00_world.sql b/sql/updates/world/2016_02_29_00_world.sql new file mode 100644 index 00000000000..280f2f901ef --- /dev/null +++ b/sql/updates/world/2016_02_29_00_world.sql @@ -0,0 +1,27 @@ +-- creature text 23576 Nalorakk + sound ID + broadcast_text ID +DELETE FROM `creature_text` WHERE `entry` = 23576 AND `type` = 14; +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`BroadcastTextId`,`TextRange`,`comment`) VALUES +(23576, 0,0, "Get da move on, guards! It be killin' time!", 14,0,100,0,0, 12066, 22144, 1, 'Nalorakk - YELL_NALORAKK_WAVE1'), +(23576, 1,0, "Guards, go already! Who you more afraid of, dem... or me?", 14,0,100,0,0, 12067, 22146, 1, 'Nalorakk - YELL_NALORAKK_WAVE2'), +(23576, 2,0, "Ride now! Ride out dere and bring me back some heads!", 14,0,100,0,0, 12068, 22151, 1, 'Nalorakk - YELL_NALORAKK_WAVE3'), +(23576, 3,0, "I be losin' me patience! Go on: make dem wish dey was never born!", 14,0,100,0,0, 12069, 22155, 1, 'Nalorakk - YELL_NALORAKK_WAVE4'), +(23576, 4,0, "You be dead soon enough!", 14,0,100,0,0, 12070, 23166, 1, 'Nalorakk - YELL_AGGRO'), +(23576, 5,0, "I bring da pain!", 14,0,100,0,0, 12071, 23167, 1, 'Nalorakk - YELL_SURGE'), +(23576, 6,0, "You call on da beast, you gonna get more dan you bargain for!", 14,0,100,0,0, 12072, 23168, 1, 'Nalorakk - YELL_SHIFTEDTOBEAR '), +(23576, 7,0, "Make way for da Nalorakk!", 14,0,100,0,0, 12073, 23169, 1, 'Nalorakk - YELL_SHIFTEDTOTROLL'), +(23576, 8,0, "You had your chance; now it be too late!", 14,0,100,0,0, 12074, 23170, 1, 'Nalorakk - YELL_BERSERK'), +(23576, 9,0, "Now whatchoo got to say?", 14,0,100,0,0, 12075, 23171, 1, 'Nalorakk - YELL_KILL_ONE'), +(23576, 10,0, "Da Amani gonna rule again!", 14,0,100,0,0, 12076, 23172, 1, 'Nalorakk - YELL_KILL_TWO'), +(23576, 11,0, "I... be waitin' on da udda side....", 14,0,100,0,0, 12077, 23173, 1, 'Nalorakk - YELL_DEATH'), +(23576, 12,0, "What could be better than servin' da bear spirit for eternity? Come closer now. Bring your souls to me!", 14,0,100,0,0, 12078, 23305, 1, 'Nalorakk - YELL_NALORAKK_EVENT1'), +(23576, 13,0, "I smell you, strangers. Don't be delayin' your fate. Come to me now. I make your sacrifice quick.", 14,0,100,0,0, 12079, 23306, 1, 'Nalorakk - YELL_NALORAKK_EVENT1'); + +-- creature text 24239 Hex Lord Malacrass + sound ID + broadcast_text ID +DELETE FROM `creature_text` WHERE `entry` = 24239 AND `type` = 14; +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`BroadcastTextId`,`TextRange`,`comment`) VALUES +(24239, 0,0, "Da shadow gonna fall on you....", 14,0,100,0,0, 12041, 23591, 1, 'Hex Lord Malacrass - YELL_AGGRO'), +(24239, 1,0, "Dis a nightmare ya don' wake up from!", 14,0,100,0,0, 12043, 23593, 1, 'Hex Lord Malacrass - YELL_KILL_ONE'), +(24239, 2,0, "Azzaga choogo zinn!", 14,0,100,0,0, 12044, 23594, 1, 'Hex Lord Malacrass - YELL_KILL_TWO'), +(24239, 3,0, "Darkness comin' for you....", 14,0,100,0,0, 12046, 23596, 1, 'Hex Lord Malacrass - YELL_DRAIN_POWER'), +(24239, 4,0, "Your soul gonna bleed!", 14,0,100,0,0, 12047, 23597, 1, 'Hex Lord Malacrass - YELL_SPIRIT_BOLTS'), +(24239, 5,0, "Dis not... da end for me!", 14,0,100,0,0, 12051, 23601, 1, 'Hex Lord Malacrass - YELL_DEATH'); diff --git a/sql/updates/world/2016_02_29_01_world.sql b/sql/updates/world/2016_02_29_01_world.sql new file mode 100644 index 00000000000..40343440d9a --- /dev/null +++ b/sql/updates/world/2016_02_29_01_world.sql @@ -0,0 +1 @@ +DELETE FROM `game_event_gameobject` WHERE `guid` IN (24399, 24400, 24401, 24402, 24405); diff --git a/sql/updates/world/2016_03_01_00_world_335.sql b/sql/updates/world/2016_03_01_00_world_335.sql new file mode 100644 index 00000000000..36c48379190 --- /dev/null +++ b/sql/updates/world/2016_03_01_00_world_335.sql @@ -0,0 +1,75 @@ +SET @Pool := 370; + +UPDATE `quest_template_addon` SET `PrevQuestID`=0 WHERE `ID` IN(12604,12541,12502,12509,12519,12502,12509,12519,12588,12591,12594,12557,12597,12598,12599,12564,12568,12585); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` IN(19,20) AND`SourceEntry` IN(12541,12604,12502,12509,12519,12502,12509,12519,12588,12591,12594,12557,12597,12598,12599,12564,12568,12585); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(19, 0, 12604, 0, 0, 1, 0, 51573, 0, 0, 0, 0, 0, '', "Show quest mark 12604 'Congratulations!' if player has aura 51573 'On Patrol'."), +(20, 0, 12604, 0, 0, 1, 0, 51573, 0, 0, 0, 0, 0, '', "Show quest mark 12604 'Congratulations!' if player has aura 51573 'On Patrol'."), +(19, 0, 12604, 0, 0, 1, 0, 53707, 0, 0, 1, 0, 0, '', "Show quest mark 12604 'Congratulations!' if player has no aura 51573 'On Patrol Heartbeat Script'."), +(20, 0, 12604, 0, 0, 1, 0, 53707, 0, 0, 1, 0, 0, '', "Show quest mark 12604 'Congratulations!' if player has no aura 51573 'On Patrol Heartbeat Script'."), +(19, 0, 12541, 0, 0, 9, 0, 12501, 0, 0, 0, 0, 0, '', "Show quest mark 12604 'Troll Patrol: The Alchemists Apprentice' if player has quest Troll patrol'."), +(20, 0, 12541, 0, 0, 9, 0, 12501, 0, 0, 0, 0, 0, '', "Show quest mark 12604 'Troll Patrol: The Alchemists Apprentice' if player has quest Troll patrol'."), +(19, 0, 12541, 0, 1, 9, 0, 12563, 0, 0, 0, 0, 0, '', "Show quest mark 12604 'Troll Patrol: The Alchemists Apprentice' if player has quest Troll patrol'."), +(20, 0, 12541, 0, 1, 9, 0, 12563, 0, 0, 0, 0, 0, '', "Show quest mark 12604 'Troll Patrol: The Alchemists Apprentice' if player has quest Troll patrol'."), +(19, 0, 12541, 0, 2, 9, 0, 12587, 0, 0, 0, 0, 0, '', "Show quest mark 12604 'Troll Patrol: The Alchemists Apprentice' if player has quest Troll patrol'."), +(20, 0, 12541, 0, 2, 9, 0, 12587, 0, 0, 0, 0, 0, '', "Show quest mark 12604 'Troll Patrol: The Alchemists Apprentice' if player has quest Troll patrol'."), +(19, 0, 12509, 0, 0, 9, 0, 12501, 0, 0, 0, 0, 0, '', "Show quest mark 12509 'Troll Patrol: Intestinal Fortitude' if player has quest Troll patrol'."), +(20, 0, 12509, 0, 0, 9, 0, 12501, 0, 0, 0, 0, 0, '', "Show quest mark 12509 'Troll Patrol: Intestinal Fortitude' if player has quest Troll patrol'."), +(19, 0, 12519, 0, 0, 9, 0, 12501, 0, 0, 0, 0, 0, '', "Show quest mark 12604 'Troll Patrol: Whatdya Want, a Medal?' if player has quest Troll patrol'."), +(20, 0, 12519, 0, 0, 9, 0, 12501, 0, 0, 0, 0, 0, '', "Show quest mark 12604 'Troll Patrol: Whatdya Want, a Medal?' if player has quest Troll patrol'."), +(19, 0, 12502, 0, 0, 9, 0, 12501, 0, 0, 0, 0, 0, '', "Show quest mark 12502 'Troll Patrol: High Standards' if player has quest Troll patrol'."), +(20, 0, 12502, 0, 0, 9, 0, 12501, 0, 0, 0, 0, 0, '', "Show quest mark 12502 'Troll Patrol: High Standards' if player has quest Troll patrol'."), +(19, 0, 12564, 0, 0, 9, 0, 12563, 0, 0, 0, 0, 0, '', "Show quest mark 12564 'Troll Patrol: Something for the Pain' if player has quest Troll patrol'."), +(20, 0, 12564, 0, 0, 9, 0, 12563, 0, 0, 0, 0, 0, '', "Show quest mark 12564 'Troll Patrol: Something for the Pain' if player has quest Troll patrol'."), +(19, 0, 12568, 0, 0, 9, 0, 12563, 0, 0, 0, 0, 0, '', "Show quest mark 12568 'Troll Patrol: Done to Death' if player has quest Troll patrol'."), +(20, 0, 12568, 0, 0, 9, 0, 12563, 0, 0, 0, 0, 0, '', "Show quest mark 12558 'Troll Patrol: Done to Death' if player has quest Troll patrol'."), +(19, 0, 12585, 0, 0, 9, 0, 12563, 0, 0, 0, 0, 0, '', "Show quest mark 12585 'Troll Patrol: Creature Comforts' if player has quest Troll patrol'."), +(20, 0, 12585, 0, 0, 9, 0, 12563, 0, 0, 0, 0, 0, '', "Show quest mark 12585 'Troll Patrol: Creature Comforts' if player has quest Troll patrol'."), +(19, 0, 12588, 0, 0, 9, 0, 12587, 0, 0, 0, 0, 0, '', "Show quest mark 12588 'Troll Patrol: Can You Dig It?' if player has quest Troll patrol'."), +(20, 0, 12588, 0, 0, 9, 0, 12587, 0, 0, 0, 0, 0, '', "Show quest mark 12588 'Troll Patrol: Can You Dig It?' if player has quest Troll patrol'."), +(19, 0, 12591, 0, 0, 9, 0, 12587, 0, 0, 0, 0, 0, '', "Show quest mark 12591 'Troll Patrol: Throwing Down' if player has quest Troll patrol'."), +(20, 0, 12591, 0, 0, 9, 0, 12587, 0, 0, 0, 0, 0, '', "Show quest mark 12591 'Troll Patrol: Throwing Down' if player has quest Troll patrol'."), +(19, 0, 12594, 0, 0, 9, 0, 12587, 0, 0, 0, 0, 0, '', "Show quest mark 12594 'Troll Patrol: Couldn't Care Less' if player has quest Troll patrol'."), +(20, 0, 12594, 0, 0, 9, 0, 12587, 0, 0, 0, 0, 0, '', "Show quest mark 12594 'Troll Patrol: Couldn't Care Less' if player has quest Troll patrol'."), +(19, 0, 12557, 0, 0, 9, 0, 12596, 0, 0, 0, 0, 0, '', "Show quest mark 12557 'Lab Work' if player has quest Pa'Troll'."), +(20, 0, 12557, 0, 0, 9, 0, 12596, 0, 0, 0, 0, 0, '', "Show quest mark 12557 'Lab Work' if player has quest Pa'Troll'."), +(19, 0, 12597, 0, 0, 9, 0, 12596, 0, 0, 0, 0, 0, '', "Show quest mark 12597 'Something for the Pain' if player has quest Pa'Troll'."), +(20, 0, 12597, 0, 0, 9, 0, 12596, 0, 0, 0, 0, 0, '', "Show quest mark 12597 'Something for the Pain' if player has quest Pa'Troll'."), +(19, 0, 12598, 0, 0, 9, 0, 12596, 0, 0, 0, 0, 0, '', "Show quest mark 12598 'Throwing Down' if player has quest Pa'Troll'."), +(20, 0, 12598, 0, 0, 9, 0, 12596, 0, 0, 0, 0, 0, '', "Show quest mark 12598 'Throwing Down' if player has quest Pa'Troll'."), +(19, 0, 12599, 0, 0, 9, 0, 12596, 0, 0, 0, 0, 0, '', "Show quest mark 12599 'Creature Comforts' if player has quest Pa'Troll'."), +(20, 0, 12599, 0, 0, 9, 0, 12596, 0, 0, 0, 0, 0, '', "Show quest mark 12599 'Creature Comforts' if player has quest Pa'Troll'."); + +UPDATE `creature_template` SET `AIName`='SmartAI', `ScriptName`='' WHERE `entry` =28039; +DELETE FROM `smart_scripts` WHERE `entryorguid` =28039 AND `source_type`=0; + +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(28039, 0, 0, 1, 19, 0, 100, 0, 12596, 0, 0, 0, 85, 51506, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Commander Kunz - On Quest Accept Pa''Troll - Invoker Cast Clear Patrol Quests'), +(28039, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 85, 51509, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Commander Kunz - On Quest Accept Pa''Troll - Invoker Cast Clear Patrol Quests II'), +(28039, 0, 2, 5, 19, 0, 100, 0, 12587, 0, 0, 0, 85, 51573, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Commander Kunz - On Quest Accept Troll Patrol - Invoker Cast On Patrol'), +(28039, 0, 3, 5, 19, 0, 100, 0, 12501, 0, 0, 0, 85, 51573, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Commander Kunz - On Quest Accept Troll Patrol - Invoker Cast On Patrol'), +(28039, 0, 4, 5, 19, 0, 100, 0, 12563, 0, 0, 0, 85, 51573, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Commander Kunz - On Quest Accept Troll Patrol - Invoker Cast On Patrol'), +(28039, 0, 5, 6, 61, 0, 100, 0, 0, 0, 0, 0, 85, 53712, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Commander Kunz - On Quest Accept Troll Patrol - Invoker Cast Clear DAILY Patrol SUBQuests 00'), +(28039, 0, 6, 7, 61, 0, 100, 0, 0, 0, 0, 0, 85, 53713, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Commander Kunz - On Quest Accept Troll Patrol - Invoker Cast Clear DAILY Patrol SUBQuests 01'), +(28039, 0, 7, 8, 61, 0, 100, 0, 0, 0, 0, 0, 85, 53715, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Commander Kunz - On Quest Accept Troll Patrol - Invoker Cast Clear DAILY Patrol SUBQuests 02'), +(28039, 0, 8, 9, 61, 0, 100, 0, 0, 0, 0, 0, 85, 53716, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Commander Kunz - On Quest Accept Troll Patrol - Invoker Cast Clear DAILY Patrol SUBQuests 03'), +(28039, 0, 9, 0, 61, 0, 100, 0, 0, 0, 0, 0, 85, 53707, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Commander Kunz - On Quest Accept Troll Patrol - Invoker Cast On Patrol Heartbeat Script'), +(28039, 0, 10, 0, 20, 0, 100, 0, 12587, 0, 0, 0, 28, 51573, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Commander Kunz - On Quest Reward Congratulations - Remove Aura On Patrol'), +(28039, 0, 11, 0, 20, 0, 100, 0, 12563, 0, 0, 0, 28, 53707, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Commander Kunz - On Quest Reward Troll Patrol - Remove Aura On Patrol Heartbeat Script'), +(28039, 0, 12, 0, 20, 0, 100, 0, 12501, 0, 0, 0, 28, 53707, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Commander Kunz - On Quest Reward Troll Patrol - Remove Aura On Patrol Heartbeat Script'), +(28039, 0, 13, 0, 20, 0, 100, 0, 12604, 0, 0, 0, 28, 53707, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Commander Kunz - On Quest Reward Troll Patrol - Remove Aura On Patrol Heartbeat Script'); + +UPDATE `quest_template_addon` SET `ExclusiveGroup`=12587 WHERE `ID` IN(12501,12563,12587); + +DELETE FROM `pool_quest` WHERE `pool_entry` IN (@Pool); + +INSERT INTO `pool_quest` (`entry`, `pool_entry`, `description`) VALUES +(12587, @Pool, 'Troll Patrol'), +(12501, @Pool, 'Troll Patrol'), +(12563, @Pool, 'Troll Patrol'); + +DELETE FROM `pool_template` WHERE `entry` IN (@Pool); + +INSERT INTO `pool_template` (`entry`, `max_limit`, `description`) VALUES +(@Pool, 1, 'Troll Patrol Daily Quests'); diff --git a/sql/updates/world/2016_03_02_00_world_335.sql b/sql/updates/world/2016_03_02_00_world_335.sql new file mode 100644 index 00000000000..e7a9f60e790 --- /dev/null +++ b/sql/updates/world/2016_03_02_00_world_335.sql @@ -0,0 +1,3 @@ +-- +-- Only for 3.3.5! +UPDATE `conditions` SET `ConditionTypeOrReference`=42 WHERE `ConditionTypeOrReference`=41; diff --git a/sql/updates/world/2016_03_03_00_world.sql b/sql/updates/world/2016_03_03_00_world.sql new file mode 100644 index 00000000000..473bac4708a --- /dev/null +++ b/sql/updates/world/2016_03_03_00_world.sql @@ -0,0 +1,93 @@ +SET @CGUID := 91749; +SET @OGUID := 62179; + +UPDATE `creature_template` SET `npcflag`=16777216 WHERE `entry`=28162; + +DELETE FROM `npc_spellclick_spells` WHERE `npc_entry`=28162; +INSERT INTO `npc_spellclick_spells` (`npc_entry`, `spell_id`, `cast_flags`, `user_type`) VALUES +(28162, 51026, 1, 0); +DELETE FROM `smart_scripts` WHERE `entryorguid`IN(28162,28330,28156) AND `source_type`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid`IN(2833000,2833001,2833002) AND `source_type`=9; + +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(28162, 0, 0, 1, 8, 0, 100, 1, 51026, 0, 0, 0, 11, 61286, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Drakkari Corpse - On Spellhit Create Drakkari Medallion Cover - Cast World Generic Dismount/Cancel Shapeshift'), +(28162, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 11, 50737, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Drakkari Corpse - On Spellhit Create Drakkari Medallion Cover - Cast Create Drakkari Medallion'), +(28162, 0, 2, 3, 61, 0, 100, 0, 0, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Drakkari Corpse - On Spellhit Create Drakkari Medallion Cover - Cast Create Drakkari Medallion'), +(28162, 0, 3, 0, 61, 0, 100, 0, 0, 0, 0, 0, 41, 3000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Drakkari Corpse - On Spellhit Create Drakkari Medallion Cover - Despawn'), +(28162, 0, 4, 0, 25, 0, 100, 0, 0, 0, 0, 0, 81, 16777216, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Drakkari Corpse - On Respawn - Set NPC Flags'), +(28330, 0, 0, 1, 8, 0, 100, 0, 51333, 0, 120000, 120000, 33, 28330, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Ancient Dirt KC Bunny - On Spell Hit - Give Quest Credit'), +(28330, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 70, 120, 0, 0, 0, 0, 0, 20, 190550, 0, 0, 0, 0, 0, 0, 'Ancient Dirt KC Bunny - On Spell Hit - Despawn GO'), +(28330, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 87, 2833000, 2833001, 2833002, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Ancient Dirt KC Bunny - On Spell Hit - Run Random Script'), +(28156, 0, 0, 1, 8, 0, 100, 1, 51276, 0, 0, 0, 11, 59216, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Defeated Argent Footman - On Spellhit \'Incinerate Corpse\' - Cast \'Burning Corpse\''), +(28156, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 11, 51279, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Defeated Argent Footman - On Spellhit - Cast \'Defeated Argent Footman KC\''), +(28156, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 41, 10000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Defeated Argent Footman - On Spellhit - Despawn'), +(2833000, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 51345, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Ancient Dirt KC Bunny - Script 1 - Cast Summon Ancient Drakkari Chest'), +(2833001, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 51357, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Ancient Dirt KC Bunny - Script 2 - Cast Summon Spider'), +(2833002, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 11, 51370, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Ancient Dirt KC Bunny - Script 3 - Cast Summon Drakkari Spectre'); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=18 AND `SourceGroup`=28162; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(18, 28162, 51026, 0, 0, 9, 0, 12519, 0, 0, 0, 0, 0, '', 'Required quest active for spellclick'); + +DELETE FROM `gameobject_template` WHERE `entry`=190552; +INSERT INTO `gameobject_template` (`entry`, `type`, `displayId`, `name`, `IconName`, `castBarCaption`, `unk1`, `faction`, `flags`, `size`, `Data0`, `Data1`, `Data2`, `Data3`, `Data4`, `Data5`, `Data6`, `Data7`, `Data8`, `Data9`, `Data10`, `Data11`, `Data12`, `Data13`, `Data14`, `Data15`, `Data16`, `Data17`, `Data18`, `Data19`, `Data20`, `Data21`, `Data22`, `Data23`, `AIName`, `ScriptName`, `VerifiedBuild`) VALUES +(190552, 3, 2450, 'Ancient Drakkari Chest', '', '', '', 94, 0, 1, 1691, 27240, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, '', '', 14007); + +DELETE FROM `gameobject_loot_template` WHERE `Entry`=27240; +INSERT INTO `gameobject_loot_template` (`Entry`, `Item`, `Reference`, `Chance`, `QuestRequired`, `LootMode`, `GroupId`, `MinCount`, `MaxCount`, `Comment`) VALUES +(27240, 46369, 0, 52, 0, 1, 1, 1, 1, NULL), +(27240, 46368, 0, 47, 0, 1, 1, 1, 1, NULL), +(27240, 43851, 0, 15, 0, 1, 2, 1, 1, NULL), +(27240, 43852, 0, 14, 0, 1, 2, 1, 1, NULL), +(27240, 33470, 0, 14, 0, 1, 3, 1, 4, NULL); + +DELETE FROM `creature` WHERE `id`=28330; +INSERT INTO `creature` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `spawndist`, `MovementType`) VALUES +(@CGUID+0, 28330, 571, 1, 1, 4994.237, -2934.52, 289.698, 4.502949, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+1, 28330, 571, 1, 1, 4928.283, -2954.844, 289.4258, 0.3665192, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+2, 28330, 571, 1, 1, 4971.499, -2967.053, 290.4032, 6.021386, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+3, 28330, 571, 1, 1, 4934.217, -2988.888, 290.1517, 3.316126, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+4, 28330, 571, 1, 1, 4901.642, -3020.357, 290.4903, 3.577925, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+5, 28330, 571, 1, 1, 4936.192, -2911.305, 289.9935, 3.804818, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+6, 28330, 571, 1, 1, 4904.635, -2938.013, 290.041, 2.792527, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+7, 28330, 571, 1, 1, 4959.712, -2882.519, 290.1794, 2.495821, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+8, 28330, 571, 1, 1, 4903.988, -2988.983, 289.8607, 6.073746, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+9, 28330, 571, 1, 1, 4884.578, -2949.397, 291.4635, 6.248279, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+10, 28330, 571, 1, 1, 4867.053, -3032.317, 290.2768, 0.01745329, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+11, 28330, 571, 1, 1, 4875.137, -2981.573, 289.6624, 3.769911, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+12, 28330, 571, 1, 1, 4948.37, -2845.009, 289.9186, 0.2094395, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+13, 28330, 571, 1, 1, 4900.262, -2870.288, 290.5846, 2.879793, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+14, 28330, 571, 1, 1, 4889.488, -2826.498, 291.2368, 6.213372, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+15, 28330, 571, 1, 1, 4865.896, -2879.65, 291.2252, 3.124139, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+16, 28330, 571, 1, 1, 4847.792, -2933.366, 290.7986, 1.954769, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+17, 28330, 571, 1, 1, 4838.494, -2962.302, 290.7893, 5.096361, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+18, 28330, 571, 1, 1, 4834.676, -3024.518, 290.9732, 5.77704, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+19, 28330, 571, 1, 1, 4834.516, -3055.432, 292.7168, 4.223697, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+20, 28330, 571, 1, 1, 4833.344, -3086.806, 290.7325, 5.183628, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+21, 28330, 571, 1, 1, 4811.373, -3122.263, 290.908, 3.787364, 120, 0, 0), -- 28330 (Area: 66) +(@CGUID+22, 28330, 571, 1, 1, 4774.604, -3146.782, 293.9535, 4.886922, 120, 0, 0); -- 28330 (Area: 66) + +DELETE FROM `gameobject` WHERE `id`=190550; +INSERT INTO `gameobject` (`guid`, `id`, `map`, `spawnMask`, `phaseMask`, `position_x`, `position_y`, `position_z`, `orientation`, `rotation0`, `rotation1`, `rotation2`, `rotation3`, `spawntimesecs`, `animprogress`, `state`) VALUES +(@OGUID+0, 190550, 571, 1, 1, 4947.931, -2845.012, 289.6788, 3.141593, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 4278) +(@OGUID+1, 190550, 571, 1, 1, 4994.241, -2934.715, 289.4844, 3.036838, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 0) +(@OGUID+2, 190550, 571, 1, 1, 4959.522, -2882.375, 289.9583, -0.2268925, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 0) +(@OGUID+3, 190550, 571, 1, 1, 4935.69, -2910.847, 289.8739, 0.4712385, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 0) +(@OGUID+4, 190550, 571, 1, 1, 4904.143, -2988.849, 289.7597, -2.879789, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 0) +(@OGUID+5, 190550, 571, 1, 1, 4901.818, -3020.541, 290.4142, 2.862335, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 0) +(@OGUID+6, 190550, 571, 1, 1, 4847.445, -2933.018, 290.703, 2.91469, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 0) +(@OGUID+7, 190550, 571, 1, 1, 4889.123, -2826.122, 291.1009, -2.670348, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 0) +(@OGUID+8, 190550, 571, 1, 1, 4959.522, -2882.375, 289.9583, -0.2268925, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 0) +(@OGUID+9, 190550, 571, 1, 1, 4904.084, -2937.728, 289.9795, -0.9250239, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 0) +(@OGUID+10, 190550, 571, 1, 1, 4865.544, -2879.292, 291.0988, 0.8377574, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 0) +(@OGUID+11, 190550, 571, 1, 1, 4935.69, -2910.847, 289.8739, 0.4712385, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 0) +(@OGUID+12, 190550, 571, 1, 1, 4934.223, -2988.802, 290.0577, 1.727875, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 0) +(@OGUID+13, 190550, 571, 1, 1, 4874.853, -2981.499, 289.5772, 5.183629, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 0) +(@OGUID+14, 190550, 571, 1, 1, 4837.822, -2961.738, 290.6022, 2.565632, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 0) +(@OGUID+15, 190550, 571, 1, 1, 4834.372, -3055.432, 292.4856, 4.799657, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 0) +(@OGUID+16, 190550, 571, 1, 1, 4928.226, -2954.833, 289.3405, 2.129301, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 4279) +(@OGUID+17, 190550, 571, 1, 1, 4900.326, -2870.361, 290.4038, 1.431168, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 0) +(@OGUID+18, 190550, 571, 1, 1, 4971.439, -2966.859, 290.2518, 4.520406, 0, 0, 0, 1, 120, 255, 1), -- 190550 (Area: 4278) +(@OGUID+19, 190550, 571, 1, 1, 4928.226, -2954.833, 289.3405, 2.129301, 0, 0, 0, 1, 120, 255, 1); -- 190550 (Area: 0) + +DELETE FROM `event_scripts` WHERE `id`=4845 AND `delay`=0 AND `command`=9 AND `datalong`=21207 AND `datalong2`=66 AND `dataint`=0 AND `x`=0 AND `y`=0 AND `z`=0 AND `o`=0 LIMIT 1; diff --git a/sql/updates/world/2016_03_03_01_world.sql b/sql/updates/world/2016_03_03_01_world.sql new file mode 100644 index 00000000000..a242d26efe1 --- /dev/null +++ b/sql/updates/world/2016_03_03_01_world.sql @@ -0,0 +1,57 @@ +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=28330; + +-- Ghostwing needs spell 59091 in relation to Crusader Olakin Sainrith in phase 64 +DELETE FROM `npc_spellclick_spells` WHERE `npc_entry`= 31432 AND `spell_id`= 59091; + +INSERT INTO `npc_spellclick_spells` (`npc_entry`,`spell_id`,`cast_flags`,`user_type`) VALUES +(31432, 59091, 1, 0); + +DELETE FROM `vehicle_template_accessory` WHERE `entry`=31432 AND `seat_id`=0; + +DELETE FROM `creature` WHERE `guid`=145119; + +DELETE FROM `spell_area` WHERE `spell`=58139 AND `area`IN(4588); +INSERT INTO `spell_area` (`spell`, `area`, `quest_start`, `quest_end`, `aura_spell`, `racemask`, `gender`, `autocast`, `quest_start_status`, `quest_end_status`) VALUES +(58139, 4588, 13144, 0, 0, 0, 2, 1, 64, 11); -- Blackwatch after Killing two scourge with one skeleton +UPDATE `creature` SET `phaseMask`=65 WHERE `guid`=123657; + +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`IN(30631,31432); + +DELETE FROM `smart_scripts` WHERE `entryorguid`IN(30631,31432) AND `source_type`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid`IN(31428) AND `source_type`=0 AND `id`>4; + +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(30631, 0, 0, 1, 20, 0, 100, 0, 13144, 0, 0, 0, 12, 31432, 1, 90000, 0, 0, 0, 8, 0, 0, 0, 6588.43, 3278.2, 818.203, 5.044, 'Darkrider Arly - On Quest Reward - Summon Ghostwing'), +(30631, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 12, 31428, 1, 90000, 0, 0, 0, 8, 0, 0, 0, 6648.77, 3217.7, 810.501, 1.55334, 'Darkrider Arly - On Quest Reward - Summon Crusader Olakin Sainrith'), +(31428, 0, 5, 6, 54, 0, 100, 0, 0, 0, 0, 0, 71, 0, 0, 40598, 42543, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Crusader Olakin Sainrith - On Just Summoned - Equip Items'), +(31428, 0, 6, 7, 61, 0, 100, 0, 0, 0, 0, 0, 44, 64, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Crusader Olakin Sainrith - On Just Summoned - Set Ingame Phase 64'), +(31428, 0, 7, 8, 61, 0, 100, 0, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Crusader Olakin Sainrith - On Just Summoned - Dismount'), +(31428, 0, 8, 0, 61, 0, 100, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Crusader Olakin Sainrith - On Just Summoned - Say Line 1'), +(31428, 0, 9, 0, 38, 0, 100, 0, 2, 2, 0, 0, 11, 59091, 2, 0, 0, 0, 0, 19, 31432, 0, 0, 0, 0, 0, 0, 'Crusader Olakin Sainrith - On Data Set - Cast Ride Ghostwing'), +(31432, 0, 0, 1, 54, 0, 100, 0, 0, 0, 0, 0, 44, 64, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Ghostwing - On Just Summoned - Set Ingame Phase 64'), +(31432, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Ghostwing - On Just Summoned - Start WP'), +(31432, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 53, 1, 31432, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Ghostwing - On Just Summoned - Set Active'), +(31432, 0, 3, 4, 40, 0, 100, 0, 1, 31432, 0, 0, 54, 3000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Ghostwing - On Reached WP1 - Pause WP'), +(31432, 0, 4, 5, 61, 0, 100, 0, 0, 0, 0, 0, 45, 2, 2, 0, 0, 0, 0, 19, 31428, 0, 0, 0, 0, 0, 0, 'Ghostwing - On Reached WP1 - Set Data on Crusader Olakin Sainrith'), +(31432, 0, 5, 0, 61, 0, 100, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Ghostwing - On Reached WP1 - Say Line 0'), +(31432, 0, 6, 7, 40, 0, 100, 0, 2, 31432, 0, 0, 1, 0, 0, 0, 0, 0, 0, 19, 30631, 0, 0, 0, 0, 0, 0, 'Ghostwing - On Reached WP2 - Say Line 0 on Darkrider Arly'), +(31432, 0, 7, 8, 61, 0, 100, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 19, 31432, 0, 0, 0, 0, 0, 0, 'Ghostwing - On Reached WP2 - Despawn Crusader Olakin Sainrith'), +(31432, 0, 8, 0, 61, 0, 100, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Ghostwing - On Reached WP2 - Despawn '); + +DELETE FROM `creature_text` WHERE `entry` IN(30631,31432); +DELETE FROM `creature_text` WHERE `entry` IN(31428) AND `groupid`=1; + + +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextId`, `comment`) VALUES +(30631, 0, 0, 'Damn it, Olakin, get your arse back here! There''s work to be done!', 12, 0, 100, 5, 0, 0, 32195, 'Darkrider Arly to Crusader Olakin Sainrith'), +(31428, 1, 0, 'Look! What''s a frostwyrm doing here? It''s coming straight for us.', 12, 0, 100, 25, 0, 0, 32173, 'Crusader Olakin Sainrith to Player'), +(31432, 0, 0, 'Destroy our raw materials, will you? Well, the master has a special plan in mind for you... ', 12, 0, 100, 460, 0, 0, 32171, 'Ghostwing to Player'); + +DELETE FROM `waypoints` WHERE `entry`=31432; +INSERT INTO `waypoints` (`entry`, `pointid`, `position_x`, `position_y`, `position_z`, `point_comment`) VALUES +(31432, 1, 6644.43, 3222.912, 823.0705, 'Ghostwing'), +(31432, 2, 6690.65, 3177.279, 860.5705, 'Ghostwing'); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=59091; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 1, 59091, 0, 0, 31, 0, 3, 31432, 0, 0, 0, 0, '', 'Ride Ghostwing'); diff --git a/sql/updates/world/2016_03_04_00_world.sql b/sql/updates/world/2016_03_04_00_world.sql new file mode 100644 index 00000000000..f338d6d0043 --- /dev/null +++ b/sql/updates/world/2016_03_04_00_world.sql @@ -0,0 +1,32 @@ +/* Sunken Temple - Support for quest 3447: Secret of the Circle */ +SET @GO_GUID := 5521; +SET @ALTAR := 148836; +SET @LIGHT := 148883; +SET @ATAL_ALARION := 8580; +SET @ATALAI_IDOL := 148838; + +-- Altar of Hakkar +UPDATE `gossip_menu_option` SET `action_menu_id`=1302 WHERE `menu_id`=1288; +-- SAI: Add Pattern of lights +UPDATE `gameobject_template` SET `AIName`='SmartGameObjectAI' WHERE `entry`=@ALTAR; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ALTAR AND `source_type`=1 AND `id`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ALTAR*100 AND `source_type`=9 AND `id` BETWEEN 0 AND 5; +INSERT INTO `smart_scripts` (`entryorguid`,`source_type`,`id`,`link`,`event_type`,`event_phase_mask`,`event_chance`,`event_flags`,`event_param1`,`event_param2`,`event_param3`,`event_param4`,`action_type`,`action_param1`,`action_param2`,`action_param3`,`action_param4`,`action_param5`,`action_param6`,`target_type`,`target_param1`,`target_param2`,`target_param3`,`target_x`,`target_y`,`target_z`,`target_o`,`comment`) VALUES +(@ALTAR,1,0,0,62,0,100,0,1288,0,0,0,80,@ALTAR*100,0,0,0,0,0,1,0,0,0,0,0,0,0, 'On gossip option select run script'), +(@ALTAR*100,9,0,0,1,0,100,0,0,0,0,0,50,@LIGHT,3,0,0,0,0,8,0,0,0,-515.553,95.25821,-148.7401,-1.500983, 'Script - Summon Temp GO'), +(@ALTAR*100,9,1,0,1,0,100,0,3000,3000,0,0,50,@LIGHT,3,0,0,0,0,8,0,0,0,-419.8487,94.48368,-148.7401,-1.500983, 'Script - Summon Temp GO'), +(@ALTAR*100,9,2,0,1,0,100,0,3000,3000,0,0,50,@LIGHT,3,0,0,0,0,8,0,0,0,-491.4003,135.9698,-148.7401,-1.500983, 'Script - Summon Temp GO'), +(@ALTAR*100,9,3,0,1,0,100,0,3000,3000,0,0,50,@LIGHT,3,0,0,0,0,8,0,0,0,-491.4909,53.48179,-148.7401,-1.500983, 'Script - Summon Temp GO'), +(@ALTAR*100,9,4,0,1,0,100,0,3000,3000,0,0,50,@LIGHT,3,0,0,0,0,8,0,0,0,-443.8549,136.1007,-148.7401,-1.500983, 'Script - Summon Temp GO'), +(@ALTAR*100,9,5,0,1,0,100,0,3000,3000,0,0,50,@LIGHT,3,0,0,0,0,8,0,0,0,-443.4171,53.83124,-148.7401,-1.500983, 'Script - Summon Temp GO'); + +-- Mini-boss Atal'alarion <Guardian of the Idol> and GameObject Idol of Hakkar +DELETE FROM `creature` WHERE `guid`=34521 AND `id`=@ATAL_ALARION; -- spawned by script + +DELETE FROM `gameobject` WHERE `guid`=@GO_GUID AND `id`=@ATALAI_IDOL; -- spawned but hidden until creature die +INSERT INTO `gameobject` (`guid`,`id`,`map`,`zoneid`,`areaid`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`rotation0`,`rotation1`,`rotation2`,`rotation3`,`spawntimesecs`,`animprogress`,`state`,`VerifiedBuild`) VALUES +(@GO_GUID,@ATALAI_IDOL,109,0,0,3,1,-476.2693,94.41199,-189.7297,1.588249,0,0,0,1,-1,255,1,12340); + +DELETE FROM `smart_scripts` WHERE `entryorguid`=@ATAL_ALARION AND `source_type`=0 AND `id`=7; +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 +(@ATAL_ALARION,0,7,0,6,0,100,0,0,0,0,0,70,7200,0,0,0,0,0,14,@GO_GUID,@ATALAI_IDOL,0,0,0,0,0, 'Atal''alarion - On Just Died - Respawn Idol of Hakkar'); diff --git a/sql/updates/world/2016_03_04_01_world.sql b/sql/updates/world/2016_03_04_01_world.sql new file mode 100644 index 00000000000..b02c2eb4e79 --- /dev/null +++ b/sql/updates/world/2016_03_04_01_world.sql @@ -0,0 +1,2 @@ +-- +UPDATE `gameobject` SET `spawnMask`=1 WHERE `guid`=5521; diff --git a/sql/updates/world/2016_03_04_02_world_335.sql b/sql/updates/world/2016_03_04_02_world_335.sql new file mode 100644 index 00000000000..db8ca3a9178 --- /dev/null +++ b/sql/updates/world/2016_03_04_02_world_335.sql @@ -0,0 +1,20 @@ +-- new gossip_menu_option entries for Quest 6566 What The Wind Carries +DELETE FROM `gossip_menu_option` WHERE `menu_id` IN (3664,3665,3666,3667,3668,3669,3670); +INSERT INTO `gossip_menu_option` (`menu_id`,`id`,`option_icon`,`option_text`,`OptionBroadcastTextID`,`option_id`,`npc_option_npcflag`,`action_menu_id`,`action_poi_id`,`box_coded`,`box_money`,`box_text`,`BoxBroadcastTextID`) VALUES +(3664,0,0,'Please share your wisdom with me, Warchief.',8308,1,1,3665,0,0,0,'',0), +(3665,0,0,'What discoveries?',8310,1,1,3666,0,0,0,'',0), +(3666,0,0,'Usurper?',8312,1,1,3667,0,0,0,'',0), +(3667,0,0,'With all due respect, Warchief - why not allow them to be destroyed? Does this not strengthen our position?',8314,1,1,3668,0,0,0,'',0), +(3668,0,0,'I... I did not think of it that way, Warchief.',8316,1,1,3669,0,0,0,'',0), +(3669,0,0,'I live only to serve, Warchief! My life is empty and meaningless without your guidance.',8318,1,1,3670,0,0,0,'',0), +(3670,0,0,'Of course, Warchief!',8320,1,1,3664,0,0,0,'',0); + +-- link gossip_menu_option menu_id to npc_text ID via gossip_menu (3664,4477 already exists) +DELETE FROM `gossip_menu` WHERE `entry` IN (3665,3666,3667,3668,3669,3670); +INSERT INTO `gossip_menu` (`entry`,`text_id`) VALUES +(3665,5733), +(3666,5734), +(3667,5735), +(3668,5736), +(3669,5737), +(3670,5738); diff --git a/sql/updates/world/2016_03_04_03_world.sql b/sql/updates/world/2016_03_04_03_world.sql new file mode 100644 index 00000000000..4d148adde55 --- /dev/null +++ b/sql/updates/world/2016_03_04_03_world.sql @@ -0,0 +1,4 @@ +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=18 AND `SourceEntry` IN (63989,63997,63998); +DELETE FROM `npc_spellclick_spells` WHERE `npc_entry`=34072; +INSERT INTO `npc_spellclick_spells` (`npc_entry`, `spell_id`, `cast_flags`, `user_type`) VALUES +(34072, 51347, 3, 0); diff --git a/sql/updates/world/2016_03_05_00_world.sql b/sql/updates/world/2016_03_05_00_world.sql new file mode 100644 index 00000000000..8dde060140d --- /dev/null +++ b/sql/updates/world/2016_03_05_00_world.sql @@ -0,0 +1,34 @@ +UPDATE `creature_template` SET `AIName`='SmartAI',`InhabitType`=4,`VehicleId`=113 WHERE `entry`=32292; + +DELETE FROM `smart_scripts` WHERE `entryorguid` IN(32236,32292) AND `source_type`=0 ; +DELETE FROM `smart_scripts` WHERE `entryorguid` IN(3229200) AND `source_type`=9 ; + +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(32292, 0, 0, 1, 54, 0, 100, 0, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Aldur''thar Sentry - On Just Summoned - Store target'), +(32292, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 19, 32236, 0, 0, 0, 0, 0, 0, 'Aldur''thar Sentry - On Just Summoned - Move to Target'), +(32292, 0, 2, 0, 1, 0, 100, 1, 1500, 1500, 0, 0, 45, 1, 1, 0, 0, 0, 0, 19, 32236, 0, 0, 0, 0, 0, 0, 'Aldur''thar Sentry - OOC - Set Data on target'), +(32292, 0, 3, 0, 8, 0, 100, 1, 46598, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 19, 23837, 0, 0, 0, 0, 0, 0, 'Aldur''thar Sentry - On Spellhit - Move to Target'), +(32292, 0, 4, 0, 75, 0, 100, 1, 0, 23837, 2, 15000, 80, 3229200, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Aldur''thar Sentry - On Creature in Range - Run Script'), +(32236, 0, 0, 0, 0, 0, 100, 0, 0, 0, 3000, 5000, 11, 32000, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Dark Subjugator - IC - Cast Mind Seer'), +(32236, 0, 1, 0, 0, 0, 100, 0, 0, 3000, 5000, 6000, 11, 32026, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 'Dark Subjugator - IC - Cast Pain Spike'), +(32236, 0, 2, 3, 8, 0, 100, 0, 5513, 0, 60000, 60000, 64, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Dark Subjugator - On Spellhit Orb of Illusion - Store Targetlist'), +(32236, 0, 3, 4,61, 0, 100, 0, 0, 0, 0, 0, 11, 4329, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Dark Subjugator - On Spellhit Orb of Illusion - Cast Drag and Drop: Dark Subjugator Transform'), +(32236, 0, 4, 5,61, 0, 100, 0, 0, 0, 0, 0, 4, 15131, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Dark Subjugator - Linked with Previous Event - Play Sound'), +(32236, 0, 5, 6,61, 0, 100, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Dark Subjugator - Linked with Previous Event - Turn random movement off'), +(32236, 0, 6, 7,61, 0, 100, 0, 0, 0, 0, 0, 18, 768, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Dark Subjugator - Linked with Previous Event - Set immune'), +(32236, 0, 7, 8,61, 0, 100, 0, 0, 0, 0, 0, 11, 4328, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Dark Subjugator - Linked with Previous Event - Cast Drag and Drop: Summon Aldur''thar Sentry'), +(32236, 0, 8, 9,61, 0, 100, 0, 0, 0, 0, 0, 1, 0, 3000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Dark Subjugator - On Spellhit - Say'), +(32236, 0, 9, 10,61, 0, 100, 0, 0, 0, 0, 0, 33, 32229, 0, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 0, 0, 'Dark Subjugator - Linked with Previous Event - Kill Credit'), +(32236, 0, 10, 0,61, 0, 100, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Dark Subjugator - Linked with Previous Event - Evade'), +(32236, 0, 11, 0,8, 0, 100, 0, 46598, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Dark Subjugator - On Spellhit - Say'), +(32236, 0, 12, 13,38, 0, 100, 0, 2, 2, 0, 0, 4, 15128, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Dark Subjugator - On Data Set - Play Sound'), +(32236, 0, 13, 0,61, 0, 100, 0, 2, 2, 0, 0, 41, 5000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Dark Subjugator - On Data Set - Despawn After 5 seconds'), +(32236, 0, 14, 0,38, 0, 100, 0, 1, 1, 0, 0, 11, 46598, 0, 0, 0, 0, 0, 19, 32292, 0, 0, 0, 0, 0, 0, 'Dark Subjugator - On Data Set - Cast Ride Vehicle Hardcoded'), +(3229200, 9, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 46, 20, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Aldur''thar Sentry - Script - Move forward'), +(3229200, 9, 1, 0, 0, 0, 100, 0, 2000, 2000, 0, 0, 11, 50630, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Aldur''thar Sentry - On reached WP2 - Cast Eject All Passengers'), +(3229200, 9, 2, 0, 0, 0, 100, 0, 0, 0, 0, 0, 45, 2, 2, 0, 0, 0, 0, 19, 32236, 0, 0, 0, 0, 0, 0, 'Aldur''thar Sentry - On reached WP2 - Set Data'), +(3229200, 9, 3, 0, 0, 0, 100, 0, 0, 0, 0, 0, 41, 2000, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Aldur''thar Sentry - On reached WP2 - Despawn After 5 seconds'); + +DELETE FROM `npc_spellclick_spells` WHERE `npc_entry`= 32292; +INSERT INTO `npc_spellclick_spells` (`npc_entry`,`spell_id`,`cast_flags`,`user_type`) VALUES +(32292, 46598, 1, 0); diff --git a/sql/updates/world/2016_03_06_00_world.sql b/sql/updates/world/2016_03_06_00_world.sql new file mode 100644 index 00000000000..e991023e514 --- /dev/null +++ b/sql/updates/world/2016_03_06_00_world.sql @@ -0,0 +1,3 @@ +DELETE FROM `gameobject` WHERE `guid` IN(62187,62190,62198); +UPDATE `smart_scripts` SET `target_type`=7 WHERE `entryorguid`=11448 AND `source_type`=0 AND `id`=2 AND `link`=0; +UPDATE `gameobject` SET `phaseMask`=64 WHERE `guid`IN(16974,16976,99723); diff --git a/sql/updates/world/2016_03_06_01_world.sql b/sql/updates/world/2016_03_06_01_world.sql new file mode 100644 index 00000000000..183121d6735 --- /dev/null +++ b/sql/updates/world/2016_03_06_01_world.sql @@ -0,0 +1,7 @@ +UPDATE `smart_scripts` SET `link`=1 WHERE `entryorguid`IN (28064,28304,28305) AND `source_type`=0 AND `id`=0 AND `link`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid`IN (28064,28304,28305) AND `source_type`=0 AND `id`=1; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(28064, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 51249, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Drakkari Pedestal 01 - On Spellhit \'Place Banner\' - Cast Summon Agent Crusade Banner'), +(28304, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 51249, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Drakkari Pedestal 02 - On Spellhit \'Place Banner\' - Cast Summon Agent Crusade Banner'), +(28305, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 51249, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Drakkari Pedestal 02 - On Spellhit \'Place Banner\' - Cast Summon Agent Crusade Banner'); +UPDATE `creature` SET `spawndist`=0, `MovementType`=0 WHERE `guid` IN(109153,109501,110958); diff --git a/sql/updates/world/2016_03_07_00_world.sql b/sql/updates/world/2016_03_07_00_world.sql new file mode 100644 index 00000000000..b9df4d07bb9 --- /dev/null +++ b/sql/updates/world/2016_03_07_00_world.sql @@ -0,0 +1,10 @@ +-- +UPDATE `gameobject` SET `spawntimesecs`= 2 WHERE `guid` IN +(9175, -- Deserter Propaganda +40667, -- The Book of Ur +40774, -- Tool Kit +40775, -- Damaged Diving Gear +66308, -- New Avalon Patrol Schedule +66377, -- Empty Cauldron +66378, -- Iron Chain +66384); -- New Avalon Registry diff --git a/sql/updates/world/2016_03_07_01_world.sql b/sql/updates/world/2016_03_07_01_world.sql new file mode 100644 index 00000000000..d74f4296903 --- /dev/null +++ b/sql/updates/world/2016_03_07_01_world.sql @@ -0,0 +1,112 @@ +-- +-- Spelling, grammar and typo corrections, `trinity_string`, branch 3.3.5: +-- +UPDATE `trinity_string` SET `content_default`= "The command %s uses the following subcommands:%s" WHERE `entry`= 8; +UPDATE `trinity_string` SET `content_default`= "The following GMs are active on this server:" WHERE `entry`= 16; +UPDATE `trinity_string` SET `content_default`= "%s's flying command failed." WHERE `entry`= 21; +UPDATE `trinity_string` SET `content_default`= "Up to %u expansions are allowed now." WHERE `entry`= 61; +UPDATE `trinity_string` SET `content_default`= "One or more parameters contain incorrect values." WHERE `entry`= 62; +UPDATE `trinity_string` SET `content_default`= "Wrong parameter, id: %u does not exist." WHERE `entry`= 63; +UPDATE `trinity_string` SET `content_default`= "%s is appearing at your location." WHERE `entry`= 114; +UPDATE `trinity_string` SET `content_default`= "GUID %i, faction is %i, flags is %i, npcflag is %i, dynflag is %i." WHERE `entry`= 128; +UPDATE `trinity_string` SET `content_default`= "You changed GUID=%i's Faction to %i, flags to %i, npcflag to %i, dynflag to %i." WHERE `entry`= 130; +UPDATE `trinity_string` SET `content_default`= "You set all speeds of %s from normal to %2.2f." WHERE `entry`= 137; +UPDATE `trinity_string` SET `content_default`= "%s set all your speeds from normal to %2.2f." WHERE `entry`= 138; +UPDATE `trinity_string` SET `content_default`= "You set the speed of %s from normal to %2.2f." WHERE `entry`= 139; +UPDATE `trinity_string` SET `content_default`= "%s set your speed from normal to %2.2f." WHERE `entry`= 140; +UPDATE `trinity_string` SET `content_default`= "You set the swim speed of %s from normal to %2.2f." WHERE `entry`= 141; +UPDATE `trinity_string` SET `content_default`= "%s set your swim speed from normal to %2.2f." WHERE `entry`= 142; +UPDATE `trinity_string` SET `content_default`= "You set the backwards run speed of %s from normal to %2.2f." WHERE `entry`= 143; +UPDATE `trinity_string` SET `content_default`= "%s set your backwards run speed from normal to %2.2f." WHERE `entry`= 144; +UPDATE `trinity_string` SET `content_default`= "You set the fly speed of %s from normal to %2.2f." WHERE `entry`= 145; +UPDATE `trinity_string` SET `content_default`= "%s set your fly speed from normal to %2.2f." WHERE `entry`= 146; +UPDATE `trinity_string` SET `content_default`= "You set the size of %s to %2.2f." WHERE `entry`= 147; +UPDATE `trinity_string` SET `content_default`= "You take all the copper from %s." WHERE `entry`= 153; +UPDATE `trinity_string` SET `content_default`= "You play the sound %u." WHERE `entry`= 159; +UPDATE `trinity_string` SET `content_default`= "The following locations were found:\n%s" WHERE `entry`= 168; +UPDATE `trinity_string` SET `content_default`= "You tried to play the sound %u, but it does not exist." WHERE `entry`= 170; +UPDATE `trinity_string` SET `content_default`= "You can't teleport yourself to yourself!" WHERE `entry`= 171; +UPDATE `trinity_string` SET `content_default`= "You changed the runic power of %s to %i/%i." WHERE `entry`= 173; +UPDATE `trinity_string` SET `content_default`= "Error, a name can only contain the characters A-Z and a-z." WHERE `entry`= 203; +UPDATE `trinity_string` SET `content_default`= "Item '%u' (with extended cost %u) is already in the vendor list." WHERE `entry`= 210; +UPDATE `trinity_string` SET `content_default`= "Spells will be reset for all players at login. Relogging is strongly recommended!" WHERE `entry`= 218; +UPDATE `trinity_string` SET `content_default`= "Talents will be reset for all players at login. Relogging is strongly recommended!" WHERE `entry`= 219; +UPDATE `trinity_string` SET `content_default`= "No waypoints found in the database." WHERE `entry`= 239; +UPDATE `trinity_string` SET `content_default`= "Warning: Could not delete WP with ID: %d from the world" WHERE `entry`= 242; +UPDATE `trinity_string` SET `content_default`= "Invalid target map or coordinates (X: %f Y: %f MapId: %u)" WHERE `entry`= 263; +UPDATE `trinity_string` SET `content_default`= "Invalid zone coordinates (X: %f Y: %f AreaId: %u)" WHERE `entry`= 264; +UPDATE `trinity_string` SET `content_default`= "Game Object (GUID: %u) is referenced by nonexistent creature %u in GO list, can't be deleted." WHERE `entry`= 274; +UPDATE `trinity_string` SET `content_default`= "You can't kick yourself, log out instead." WHERE `entry`= 281; +UPDATE `trinity_string` SET `content_default`= "Show new ticket: ON" WHERE `entry`= 291; +UPDATE `trinity_string` SET `content_default`= "Show new ticket: OFF" WHERE `entry`= 292; +UPDATE `trinity_string` SET `content_default`= "%s's honor points were set to %u." WHERE `entry`= 299; +UPDATE `trinity_string` SET `content_default`= "Extended item cost %u does not exist." WHERE `entry`= 331; +UPDATE `trinity_string` SET `content_default`= "You repair all of %s's items." WHERE `entry`= 336; +UPDATE `trinity_string` SET `content_default`= "All your items were repaired by %s." WHERE `entry`= 337; +UPDATE `trinity_string` SET `content_default`= "Game Object (Entry: %u) contains invalid data and can't be spawned." WHERE `entry`= 348; +UPDATE `trinity_string` SET `content_default`= "Title %u (%s) set as current selected title for player %s." WHERE `entry`= 355; +UPDATE `trinity_string` SET `content_default`= "Current selected title for player %s is now reset to not known." WHERE `entry`= 356; +UPDATE `trinity_string` SET `content_default`= "Security level of account %s changed to %i." WHERE `entry`= 401; +UPDATE `trinity_string` SET `content_default`= "Your security level is too low for this action." WHERE `entry`= 403; +UPDATE `trinity_string` SET `content_default`= "Account %s does not exist." WHERE `entry`= 413; +UPDATE `trinity_string` SET `content_default`= "Account %s has never been banned." WHERE `entry`= 416; +UPDATE `trinity_string` SET `content_default`= "You learned all crafts, skills and recipes." WHERE `entry`= 433; +UPDATE `trinity_string` SET `content_default`= "Graveyard #%u is already linked to zone #%u (current)." WHERE `entry`= 450; +UPDATE `trinity_string` SET `content_default`= "Graveyard #%u can not be linked to subzone or nonexistent zone #%u (internal error)." WHERE `entry`= 452; +UPDATE `trinity_string` SET `content_default`= "No faction found in Graveyard with id= #%u, please update your database." WHERE `entry`= 454; +UPDATE `trinity_string` SET `content_default`= "Invalid team, please update your database." WHERE `entry`= 455; +UPDATE `trinity_string` SET `content_default`= "Quest %u is started from an item. Add the item to your inventory and start the quest normally: .additem %u" WHERE `entry`= 472; +UPDATE `trinity_string` SET `content_default`= "Player %s must have the skill %u (%s) before using this command." WHERE `entry`= 485; +UPDATE `trinity_string` SET `content_default`= "Target(%s) already knows that spell." WHERE `entry`= 489; +UPDATE `trinity_string` SET `content_default`= "You have already unlearnt that spell." WHERE `entry`= 491; +UPDATE `trinity_string` SET `content_default`= "That player is already in a guild." WHERE `entry`= 500; +UPDATE `trinity_string` SET `content_default`= "The guild was NOT created. Check if that guild already exists." WHERE `entry`= 501; +UPDATE `trinity_string` SET `content_default`= "No items from the itemset '%u' were found." WHERE `entry`= 502; +UPDATE `trinity_string` SET `content_default`= "Item '%i' '%s' added to slot %i." WHERE `entry`= 506; +UPDATE `trinity_string` SET `content_default`= "NPC currently selected by player:\nDB GUID: %u, current GUID: %u.\nFaction: %u.\nnpcFlags: %u.\nEntry: %u.\nDisplayID: %u (Native: %u)." WHERE `entry`= 539; +UPDATE `trinity_string` SET `content_default`= "%s no longer has any explored zones." WHERE `entry`= 552; +UPDATE `trinity_string` SET `content_default`= "Found nearby creatures (distance %f): %u" WHERE `entry`= 556; +UPDATE `trinity_string` SET `content_default`= "%s leveled you up to (%i)." WHERE `entry`= 557; +UPDATE `trinity_string` SET `content_default`= "%s leveled you down to (%i)." WHERE `entry`= 558; +UPDATE `trinity_string` SET `content_default`= "%s has reset your level progress." WHERE `entry`= 559; +UPDATE `trinity_string` SET `content_default`= "The value index %u is too big for %u (count: %u)." WHERE `entry`= 564; +UPDATE `trinity_string` SET `content_default`= "The selected player or creature does not have a victim." WHERE `entry`= 579; +UPDATE `trinity_string` SET `content_default`= "Player %s has learned all default spells for race/class and spell rewards from completed quests." WHERE `entry`= 580; +UPDATE `trinity_string` SET `content_default`= "Found nearby gameobjects (distance %f): %u" WHERE `entry`= 581; +UPDATE `trinity_string` SET `content_default`= "SpawnTime: Full:%s Remaining:%s" WHERE `entry`= 582; +UPDATE `trinity_string` SET `content_default`= "No event found." WHERE `entry`= 584; +UPDATE `trinity_string` SET `content_default`= "The event does not exist." WHERE `entry`= 585; +UPDATE `trinity_string` SET `content_default`= "The event %u is already active." WHERE `entry`= 587; +UPDATE `trinity_string` SET `content_default`= "The event %u is not active." WHERE `entry`= 588; +UPDATE `trinity_string` SET `content_default`= "You have learned all spells from the craft: %s" WHERE `entry`= 592; +UPDATE `trinity_string` SET `content_default`= "Item(s) can not be equipped or stored in the inventory due to a problem." WHERE `entry`= 706; +UPDATE `trinity_string` SET `content_default`= "An email address is required to change your password." WHERE `entry`= 881; +UPDATE `trinity_string` SET `content_default`= "The account %s was NOT deleted (the SQL file format was probably updated)." WHERE `entry`= 1002; +UPDATE `trinity_string` SET `content_default`= "The account %s was NOT deleted (unknown error)." WHERE `entry`= 1003; +UPDATE `trinity_string` SET `content_default`= "An account name can NOT be longer than 16 characters (client limit). The account was NOT created." WHERE `entry`= 1005; +UPDATE `trinity_string` SET `content_default`= "An account with this name already exists!" WHERE `entry`= 1006; +UPDATE `trinity_string` SET `content_default`= "The account %s was NOT created (the SQL file format was probably updated)." WHERE `entry`= 1007; +UPDATE `trinity_string` SET `content_default`= "The account %s was NOT created (unknown error)." WHERE `entry`= 1008; +UPDATE `trinity_string` SET `content_default`= "The character '%s' (GUID: %u Account %u) can NOT be restored: The account does not exist!" WHERE `entry`= 1023; +UPDATE `trinity_string` SET `content_default`= "The character '%s' (GUID: %u Account %u) can NOT be restored: The account character list is full!" WHERE `entry`= 1024; +UPDATE `trinity_string` SET `content_default`= "The character '%s' (GUID: %u Account %u) can NOT be restored: The name is already in use!" WHERE `entry`= 1025; +UPDATE `trinity_string` SET `content_default`= "The account %s (Id: %u) is allowed to use up to %u expansion(s) now." WHERE `entry`= 1100; +UPDATE `trinity_string` SET `content_default`= "The account %s (%u) has reached maximum amount of allowed characters (client limitation)." WHERE `entry`= 1113; +UPDATE `trinity_string` SET `content_default`= "The dump file contains damaged data!" WHERE `entry`= 1114; +UPDATE `trinity_string` SET `content_default`= "The character guid %u is already in use!" WHERE `entry`= 1117; +UPDATE `trinity_string` SET `content_default`= "You changed the gender of %s to %s." WHERE `entry`= 1120; +UPDATE `trinity_string` SET `content_default`= "Your gender was changed to %s by %s." WHERE `entry`= 1121; +UPDATE `trinity_string` SET `content_default`= "No pet found." WHERE `entry`= 1123; +UPDATE `trinity_string` SET `content_default`= "Wrong pet type." WHERE `entry`= 1124; +UPDATE `trinity_string` SET `content_default`= "Your pet has learned all talents." WHERE `entry`= 1125; +UPDATE `trinity_string` SET `content_default`= "The talents of %s's pet were reset." WHERE `entry`= 1127; +UPDATE `trinity_string` SET `content_default`= "Unable to dump deleted characters, aborting." WHERE `entry`= 1130; +UPDATE `trinity_string` SET `content_default`= "All configs are reloaded from the configuration file(s)." WHERE `entry`= 1157; +UPDATE `trinity_string` SET `content_default`= "Invalid name specified. The name must be a name of an online Game Master." WHERE `entry`= 2012; +UPDATE `trinity_string` SET `content_default`= "You cannot unassign tickets from staff members with a higher security level than yourself." WHERE `entry`= 2015; +UPDATE `trinity_string` SET `content_default`= "It might be amusing, but no... you cant freeze yourself." WHERE `entry`= 5001; +UPDATE `trinity_string` SET `content_default`= "Invalid input, check the name of the target." WHERE `entry`= 5002; +UPDATE `trinity_string` SET `content_default`= "You can't teleport yourself to yourself!" WHERE `entry`= 5011; +UPDATE `trinity_string` SET `content_default`= "No reason given." WHERE `entry`= 5035; +UPDATE `trinity_string` SET `content_default`= "You are outdoors." WHERE `entry`= 5042; +UPDATE `trinity_string` SET `content_default`= "You are indoors." WHERE `entry`= 5043; diff --git a/sql/updates/world/2016_03_09_00_world.sql b/sql/updates/world/2016_03_09_00_world.sql new file mode 100644 index 00000000000..d3ebf1af0ff --- /dev/null +++ b/sql/updates/world/2016_03_09_00_world.sql @@ -0,0 +1,38 @@ +UPDATE `creature_template` SET `ainame`='SmartAI', `scriptname`='' WHERE `entry` IN(4968,23704); +DELETE FROM `smart_scripts` WHERE `entryorguid` IN(4968,23704) AND `source_type`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid` IN(2370400) AND `source_type`=9; + +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(4968, 0, 0, 1, 62, 0, 100, 0, 2465, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Lady Jaina Proudmoore - On Gossip Select - Close Gossip'), +(4968, 0, 1, 2, 61, 0, 100, 0, 0, 0, 0, 0, 1, 6, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Lady Jaina Proudmoore - On Gossip Select - Say Line 6'), +(4968, 0, 2, 0, 61, 0, 100, 0, 0, 0, 0, 0, 11, 23122, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Lady Jaina Proudmoore - On Gossip Select - Cast Jaina''s Autograph'), +(4968, 0, 3, 4, 20, 0, 100, 0, 11142, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Lady Jaina Proudmoore - On Quest Reward (Survey Alcaz Island - Face player'), +(4968, 0, 4, 5, 61, 0, 100, 0, 0, 0, 0, 0, 1, 0, 5000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lady Jaina Proudmoore - On Quest Reward (Survey Alcaz Island - Say Line 0'), -- 04:20:13.000 +(4968, 0, 5, 0, 61, 0, 100, 0, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lady Jaina Proudmoore - On Quest Reward (Survey Alcaz Island - Set NPC Flags'), +(4968, 0, 6, 0, 52, 0, 100, 0, 0, 4968, 0, 0, 1, 1, 7000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lady Jaina Proudmoore - On Text Over Line 0 - Say Line 1'), -- 04:20:18.000 +(4968, 0, 7, 0, 52, 0, 100, 0, 1, 4968, 0, 0, 1, 2, 6000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lady Jaina Proudmoore - On Text Over Line 1 - Say Line 2'), -- 04:20:25.000 +(4968, 0, 8, 0, 52, 0, 100, 0, 2, 4968, 0, 0, 1, 3, 7000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lady Jaina Proudmoore - On Text Over Line 2 - Say Line 3'), -- 04:20:31.000 +(4968, 0, 9, 0, 52, 0, 100, 0, 3, 4968, 0, 0, 1, 4, 6000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lady Jaina Proudmoore - On Text Over Line 3 - Say Line 4'), -- 04:20:38.000 +(4968, 0, 10, 0, 52, 0, 100, 0, 4, 4968, 0, 0, 1, 5, 5000, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lady Jaina Proudmoore - On Text Over Line 4 - Say Line 5'), -- 04:20:44.000 +(4968, 0, 11, 12, 52, 0, 100, 0, 5, 4968, 0, 0, 81, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lady Jaina Proudmoore - On Text Over Line 5 - Set Npc Flag'), +(4968, 0, 12, 0, 61, 0, 100, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 'Lady Jaina Proudmoore - On Text Over Line 5 - Evade'), +(23704, 0, 0, 1, 62, 0, 100, 0, 8782, 0, 0, 0, 11, 42295, 2, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Cassa Crimsonwing - On Gossip Option 0 Selected - Cast Spell 42295'), +(23704, 0, 1, 0, 61, 0, 100, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'Cassa Crimsonwing - On Linked Actions - Close Gossip'); + +DELETE FROM `gossip_menu_option` WHERE `menu_id`=2465; +INSERT INTO `gossip_menu_option` (`menu_id`, `id`, `option_icon`, `option_text`, `OptionBroadcastTextID`, `option_id`, `npc_option_npcflag`, `action_menu_id`, `action_poi_id`, `box_coded`, `box_money`, `box_text`, `BoxBroadcastTextID`) VALUES +(2465, 0, 0, 'Lady Jaina, this may sound like an odd request... but I have a young ward who is quite shy. You are a hero to him, and he asked me to get your autograph.', 9663, 1, 1, 0, 0, 0, 0, '', 0); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=15 AND `SourceGroup`=2465; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(15, 2465, 0, 0, 0, 9, 0, 558, 0, 0, 0, 0, 0, '', 'Lady Jaina Proudmoore Shows gossip option 2465 if player has quest Jaina''s Autograph'); + +DELETE FROM `creature_text` WHERE `entry`=4968; +INSERT INTO `creature_text` (`entry`, `groupid`, `id`, `text`, `type`, `language`, `probability`, `emote`, `duration`, `sound`, `BroadcastTextID`, `comment`) VALUES +(4968, 0, 0, 'Perhaps I should explain...', 12, 0, 100, 1, 0, 0, 33092, 'Lady Jaina Proudmoore to Player'), +(4968, 1, 0, 'I had arranged for a secret summit between Warchief Thrall and King Wrynn, here in Theramore.', 12, 0, 100, 1, 0, 0, 33093, 'Lady Jaina Proudmoore to Player'), +(4968, 2, 0, 'The king was to travel here by ship, in secret. But the ship never arrived, and King Wrynn disappeared.', 12, 0, 100, 1, 0, 0, 33094, 'Lady Jaina Proudmoore to Player'), +(4968, 3, 0, 'Your help enabled us to connect the Defias to the mastermind behind the abduction, Onyxia, who was posing as a member of the royal court.', 12, 0, 100, 1, 0, 0, 33095, 'Lady Jaina Proudmoore to Player'), +(4968, 4, 0, 'Meanwhile, the king managed to escape his captors, and returned to Stormwind to deal with Onyxia.', 12, 0, 100, 1, 0, 0, 33096, 'Lady Jaina Proudmoore to Player'), +(4968, 5, 0, 'I will send word that you have discovered the link to the Defias. I was a fool to think them broken with the defeat of Edwin Van Cleef, and King Wrynn will want to make an example of all who remain.', 12, 0, 100, 1, 0, 0, 33097, 'Lady Jaina Proudmoore to Player'), +(4968, 6, 0, 'Why... that is very sweet of you. I gather that you are volunteering time for Children''s Week, yes $c? Well, you are to be commended. It is imperative that we remember those less fortunate - especially the children.$B$BI''d be happy to sign an autograph. Here you go.', 12, 0, 100, 1, 0, 0, 9665, 'Lady Jaina Proudmoore to Player'); diff --git a/sql/updates/world/2016_03_10_00_world.sql b/sql/updates/world/2016_03_10_00_world.sql new file mode 100644 index 00000000000..e3170b27499 --- /dev/null +++ b/sql/updates/world/2016_03_10_00_world.sql @@ -0,0 +1,4 @@ +DELETE FROM `creature_text` WHERE `entry`=4968 AND `groupid`=6 AND `id`=0; +DELETE FROM `smart_scripts` WHERE `entryorguid`=4968 AND `source_type`=0 AND `id` IN(1,2); +UPDATE `smart_scripts` SET `link`=0 WHERE `entryorguid`=4968 AND `source_type`=0 AND `id`=0 AND `link`=1; +UPDATE `gossip_menu_option` SET `action_menu_id`=5850 WHERE `menu_id`=2465 AND `id`=0; diff --git a/sql/updates/world/2016_03_10_01_world.sql b/sql/updates/world/2016_03_10_01_world.sql new file mode 100644 index 00000000000..80b23be82c2 --- /dev/null +++ b/sql/updates/world/2016_03_10_01_world.sql @@ -0,0 +1,4 @@ +DELETE FROM `spell_area` WHERE `spell`=42316 AND `area`=2079 AND `quest_start`=11142 AND `aura_spell`=0 AND `racemask`=1101 AND `gender`=2; +DELETE FROM `spell_linked_spell` WHERE `spell_trigger` = -42385; +INSERT INTO `spell_linked_spell` (`spell_trigger`,`spell_effect`,`type`,`comment`) VALUES +(-42385, 42316, 0, 'On remove Alcaz Survey Aura - cast Alcaz Survey Credit'); diff --git a/sql/updates/world/2016_03_12_2015_11_14_00_world.sql b/sql/updates/world/2016_03_12_2015_11_14_00_world.sql new file mode 100644 index 00000000000..b3e49eb1114 --- /dev/null +++ b/sql/updates/world/2016_03_12_2015_11_14_00_world.sql @@ -0,0 +1,3 @@ +DELETE FROM `trinity_string` WHERE `entry`=186; +INSERT INTO `trinity_string` (`entry`, `content_default`) VALUES +(186, 'TransMapID: %u TransOffsetX: %f TransOffsetY: %f TransOffsetZ: %f TransOffsetO: %f (Transport ID: %u %s)'); diff --git a/sql/updates/world/2016_03_13_00_world.sql b/sql/updates/world/2016_03_13_00_world.sql new file mode 100644 index 00000000000..0c45636d945 --- /dev/null +++ b/sql/updates/world/2016_03_13_00_world.sql @@ -0,0 +1,3 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_sindragosa_ice_tomb_target'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(69712, 'spell_sindragosa_ice_tomb_target'); diff --git a/sql/updates/world/2016_03_13_01_world.sql b/sql/updates/world/2016_03_13_01_world.sql new file mode 100644 index 00000000000..12bc205f125 --- /dev/null +++ b/sql/updates/world/2016_03_13_01_world.sql @@ -0,0 +1,106 @@ +-- Fix quests Incense for the Festival Scorchlings and Incense for the Summer Scorchlings +DELETE FROM `creature_queststarter` WHERE `quest`=11964; +-- SAI for Festival Talespinner +UPDATE `creature_template` SET `AIName`= 'SmartAI' WHERE `entry`=16818; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=16818; +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 +(16818,0,0,0,19,0,100,0,11966,0,0,0,11,46826,0,0,0,0,0,7,0,0,0,0,0,0,0,'Festival Talespinner - On target quest accepted - Cast Flame Keeper Breadcrumb'); +-- SAI for Festival Loremaster +UPDATE `creature_template` SET `AIName`= 'SmartAI' WHERE `entry`=16817; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=16817; +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 +(16817,0,0,0,19,0,100,0,11964,0,0,0,11,46825,0,0,0,0,0,7,0,0,0,0,0,0,0,'Festival Loremaster - On target quest accepted - Cast Flame Warden Breadcrumb'); +-- Whisp of Ragnaros flag not selectable +UPDATE `creature_template` SET `unit_flags`=33554432 WHERE `entry`=26502; +-- SAI for Festival Schorchling +UPDATE `creature_template` SET `AIName`= 'SmartAI' WHERE `entry`=26520; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=26520; +DELETE FROM `smart_scripts` WHERE `source_type`=9 AND `entryorguid`=2652000; +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 +(26520,0,0,0,8,0,100,0,47104,0,0,0,80,2652000,0,0,0,0,0,1,0,0,0,0,0,0,0,'Festival Scorchling - On spell hit - Run script '), +(2652000,9,1,0,0,0,100,0,0,0,0,0,1,0,2000,0,0,0,0,21,3,0,0,0,0,0,0,'Festival Scorchling - Action list - Say text 0'), +(2652000,9,2,0,0,0,100,0,1000,1000,0,0,1,1,1000,0,0,0,0,1,0,0,0,0,0,0,0,'Festival Scorchling - Action list - Say text 1'), +(2652000,9,3,0,0,0,100,0,2000,2000,0,0,11,47114,0,0,0,0,0,1,0,0,0,0,0,0,0,'Festival Scorchling - Action list - Cast grow'), +(2652000,9,4,0,0,0,100,0,0,0,0,0,1,2,2000,0,0,0,0,1,0,0,0,0,0,0,0,'Festival Scorchling - Action list - Say text 2'), +(2652000,9,5,0,0,0,100,0,3000,3000,0,0,11,47114,0,0,0,0,0,1,0,0,0,0,0,0,0,'Festival Scorchling - Action list - Cast grow'), +(2652000,9,6,0,0,0,100,0,0,0,0,0,1,3,2000,0,0,0,0,1,0,0,0,0,0,0,0,'Festival Scorchling - Action list - Say text 3'), +(2652000,9,7,0,0,0,100,0,3000,3000,0,0,11,47114,0,0,0,0,0,1,0,0,0,0,0,0,0,'Festival Scorchling - Action list - Cast grow'), +(2652000,9,8,0,0,0,100,0,0,0,0,0,1,4,2000,0,0,0,0,1,0,0,0,0,0,0,0,'Festival Scorchling - Action list - Say text 4'), +(2652000,9,9,0,0,0,100,0,1000,1000,0,0,1,5,1000,0,0,0,0,1,0,0,0,0,0,0,0,'Festival Scorchling - Action list - Say text 5'), +(2652000,9,10,0,0,0,100,0,2000,2000,0,0,11,47114,0,0,0,0,0,1,0,0,0,0,0,0,0,'Festival Scorchling - Action list - Cast grow'), +(2652000,9,11,0,0,0,100,0,0,0,0,0,1,6,2000,0,0,0,0,1,0,0,0,0,0,0,0,'Festival Scorchling - Action list - Say text 6'), +(2652000,9,12,0,0,0,100,0,3000,3000,0,0,11,47114,0,0,0,0,0,1,0,0,0,0,0,0,0,'Festival Scorchling - Action list - Cast grow'), +(2652000,9,13,0,0,0,100,0,0,0,0,0,1,7,2000,0,0,0,0,1,0,0,0,0,0,0,0,'Festival Scorchling - Action list - Say text 7'), +(2652000,9,14,0,0,0,100,0,0,0,0,0,11,47120,0,0,0,0,0,1,0,0,0,0,0,0,0,'Festival Scorchling - Action list - Summon Whisp of Ragnaros'), +(2652000,9,15,0,0,0,100,0,0,0,0,0,75,45889,0,0,0,0,0,11,26502,10,0,0,0,0,0,'Festival Scorchling - Action list - Aura Scorchling Blast'), +(2652000,9,16,0,0,0,100,0,3000,3000,0,0,11,47114,0,0,0,0,0,1,0,0,0,0,0,0,0,'Festival Scorchling - Action list - Cast grow'), +(2652000,9,17,0,0,0,100,0,0,0,0,0,41,0,0,0,0,0,0,11,26502,10,0,0,0,0,0,'Festival Scorchling - Action list - Despawn Whisp of Ragnaros '), +(2652000,9,18,0,0,0,100,0,0,0,0,0,1,8,2000,0,0,0,0,1,0,0,0,0,0,0,0,'Festival Scorchling - Action list - Say text 8'), +(2652000,9,19,0,0,0,100,0,0,0,0,0,11,47114,0,0,0,0,0,1,0,0,0,0,0,0,0,'Festival Scorchling - Action list - Cast grow'), +(2652000,9,20,0,0,0,100,0,0,0,0,0,1,9,1000,0,0,0,0,1,0,0,0,0,0,0,0,'Festival Scorchling - Action list - Say text 9'), +(2652000,9,21,0,0,0,100,0,1000,1000,0,0,11,46660,0,0,0,0,0,1,0,0,0,0,0,0,0,'Festival Scorchling - Action list - Cast Extinguished'), +(2652000,9,22,0,0,0,100,0,0,0,0,0,28,47114,0,0,0,0,0,1,0,0,0,0,0,0,0,'Festival Scorchling - Action list - Remove aura from grow'), +(2652000,9,23,0,0,0,100,0,3000,3000,0,0,1,10,2000,0,0,0,0,1,0,0,0,0,0,0,0,'Festival Scorchling - Action list - Say text 10'); +-- Festival Scorchling texts +DELETE FROM `creature_text` WHERE `entry`= 26520; +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`,`BroadcastTextId`) VALUES +(26520,0,0,'Thank you again, $n, for this delectable incense.',12,0,100,1,1000,0,'Festival Scorchling',25699), +(26520,1,0,'%s devours the incense. It\'s ravenous!',16,0,100,1,1000,0,'Festival Scorchling',25717), +(26520,2,0,'So good! So packed with energy!',12,0,100,1,1000,0,'Festival Scorchling',25718), +(26520,3,0,'It has everything a growing scorchling needs!',12,0,100,1,1000,0,'Festival Scorchling',25719), +(26520,4,0,'I can feel the power SURGING within me!',12,0,100,1,1000,0,'Festival Scorchling',25730), +(26520,5,0,'%s bellows with laughter!',16,0,100,1,1000,0,'Festival Scorchling',25720), +(26520,6,0,'Now! Finally! Our plans can take effect!',12,0,100,1,1000,0,'Festival Scorchling',25721), +(26520,7,0,'KNEEL, LITTLE MORTAL! KNEEL BEFORE THE MIGHT OF THE HERALD OF RAGNAROS!',12,0,100,1,1000,0,'Festival Scorchling',25722), +(26520,8,0,'YOU WILL ALL PERISH IN FLAMES!',12,0,100,1,1000,0,'Festival Scorchling',25723), +(26520,9,0,'%s blinks...',16,0,100,1,1000,0,'Festival Scorchling',25724), +(26520,10,0,'Ah. I was merely jesting...',12,0,100,1,1000,0,'Festival Scorchling',25725); +-- SAI for Summer Schorchling +UPDATE `creature_template` SET `AIName`= 'SmartAI' WHERE `entry`=26401; +DELETE FROM `smart_scripts` WHERE `source_type`=0 AND `entryorguid`=26401; +DELETE FROM `smart_scripts` WHERE `source_type`=9 AND `entryorguid`=2640100; +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 +(26401,0,0,0,8,0,100,0,47104,0,0,0,80,2640100,0,0,0,0,0,1,0,0,0,0,0,0,0,'Summer Scorchling - On spell hit - Start script'), +(2640100,9,1,0,0,0,100,0,0,0,0,0,1,0,2000,0,0,0,0,21,3,0,0,0,0,0,0,'Summer Scorchling - Action list - Say text 0'), +(2640100,9,2,0,0,0,100,0,1000,1000,0,0,1,1,1000,0,0,0,0,1,0,0,0,0,0,0,0,'Summer Scorchling - Action list - Say text 1'), +(2640100,9,3,0,0,0,100,0,2000,2000,0,0,11,47114,0,0,0,0,0,1,0,0,0,0,0,0,0,'Summer Scorchling - Action list - Cast grow'), +(2640100,9,4,0,0,0,100,0,0,0,0,0,1,2,2000,0,0,0,0,1,0,0,0,0,0,0,0,'Summer Scorchling - Action list - Say text 2'), +(2640100,9,5,0,0,0,100,0,3000,3000,0,0,11,47114,0,0,0,0,0,1,0,0,0,0,0,0,0,'Actionlist - Action 5 - Cast grow'), +(2640100,9,6,0,0,0,100,0,0,0,0,0,1,3,2000,0,0,0,0,1,0,0,0,0,0,0,0,'Summer Scorchling - Action list - Say text 3'), +(2640100,9,7,0,0,0,100,0,3000,3000,0,0,11,47114,0,0,0,0,0,1,0,0,0,0,0,0,0,'Summer Scorchling - Action list - Cast grow'), +(2640100,9,8,0,0,0,100,0,0,0,0,0,1,4,2000,0,0,0,0,1,0,0,0,0,0,0,0,'Summer Scorchling - Action list - Say text 4'), +(2640100,9,9,0,0,0,100,0,1000,1000,0,0,1,5,1000,0,0,0,0,1,0,0,0,0,0,0,0,'Summer Scorchling - Action list - Say text 5'), +(2640100,9,10,0,0,0,100,0,2000,2000,0,0,11,47114,0,0,0,0,0,1,0,0,0,0,0,0,0,'Summer Scorchling - Action list - Cast grow'), +(2640100,9,11,0,0,0,100,0,0,0,0,0,1,6,2000,0,0,0,0,1,0,0,0,0,0,0,0,'Summer Scorchling - Action list - Say text 6'), +(2640100,9,12,0,0,0,100,0,3000,3000,0,0,11,47114,0,0,0,0,0,1,0,0,0,0,0,0,0,'Summer Scorchling - Action list - Cast grow'), +(2640100,9,13,0,0,0,100,0,0,0,0,0,1,7,2000,0,0,0,0,1,0,0,0,0,0,0,0,'Summer Scorchling - Action list - Say text 7'), +(2640100,9,14,0,0,0,100,0,0,0,0,0,11,47120,0,0,0,0,0,1,0,0,0,0,0,0,0,'Summer Scorchling - Action list - Summon Whisp of Ragnaros'), +(2640100,9,15,0,0,0,100,0,0,0,0,0,75,45889,0,0,0,0,0,11,26502,10,0,0,0,0,0,'Summer Scorchling - Action list - Aura Scorchling Blast'), +(2640100,9,16,0,0,0,100,0,3000,3000,0,0,11,47114,0,0,0,0,0,1,0,0,0,0,0,0,0,'Summer Scorchling - Action list - Cast grow'), +(2640100,9,17,0,0,0,100,0,0,0,0,0,41,0,0,0,0,0,0,11,26502,10,0,0,0,0,0,'Summer Scorchling - Action list - Despawn Whisp of Ragnaros '), +(2640100,9,18,0,0,0,100,0,0,0,0,0,1,8,2000,0,0,0,0,1,0,0,0,0,0,0,0,'Summer Scorchling - Action list - Say text 8'), +(2640100,9,19,0,0,0,100,0,0,0,0,0,11,47114,0,0,0,0,0,1,0,0,0,0,0,0,0,'Summer Scorchling - Action list - Cast grow'), +(2640100,9,20,0,0,0,100,0,0,0,0,0,1,9,1000,0,0,0,0,1,0,0,0,0,0,0,0,'Summer Scorchling - Action list - Say text 9'), +(2640100,9,21,0,0,0,100,0,1000,1000,0,0,11,46660,0,0,0,0,0,1,0,0,0,0,0,0,0,'Summer Scorchling - Action list - Cast Extinguished'), +(2640100,9,22,0,0,0,100,0,0,0,0,0,28,47114,0,0,0,0,0,1,0,0,0,0,0,0,0,'Summer Scorchling - Action list - Remove aura from grow'), +(2640100,9,23,0,0,0,100,0,3000,3000,0,0,1,10,2000,0,0,0,0,1,0,0,0,0,0,0,0,'Summer Scorchling - Action list - Say text 10'); +-- Summer Scorchling texts +DELETE FROM `creature_text` WHERE `entry`= 26401; +INSERT INTO `creature_text` (`entry`,`groupid`,`id`,`text`,`type`,`language`,`probability`,`emote`,`duration`,`sound`,`comment`,`BroadcastTextId`) VALUES +(26401,0,0,'Thank you again, $n, for this delectable incense.',12,0,100,1,1000,0,'Summer Scorchling',25699), +(26401,1,0,'%s devours the incense. It\'s ravenous!',16,0,100,1,1000,0,'Summer Scorchling',25717), +(26401,2,0,'So good! So packed with energy!',12,0,100,1,1000,0,'Summer Scorchling',25718), +(26401,3,0,'It has everything a growing scorchling needs!',12,0,100,1,1000,0,'Summer Scorchling',25719), +(26401,4,0,'I can feel the power SURGING within me!',12,0,100,1,1000,0,'Summer Scorchling',25730), +(26401,5,0,'%s bellows with laughter!',16,0,100,1,1000,0,'Summer Scorchling',25720), +(26401,6,0,'Now! Finally! Our plans can take effect!',12,0,100,1,1000,0,'Summer Scorchling',25721), +(26401,7,0,'KNEEL, LITTLE MORTAL! KNEEL BEFORE THE MIGHT OF THE HERALD OF RAGNAROS!',12,0,100,1,1000,0,'Summer Scorchling',25722), +(26401,8,0,'YOU WILL ALL PERISH IN FLAMES!',12,0,100,1,1000,0,'Summer Scorchling',25723), +(26401,9,0,'%s blinks...',16,0,100,1,1000,0,'Summer Scorchling',25724), +(26401,10,0,'Ah. I was merely jesting...',12,0,100,1,1000,0,'Summer Scorchling',25725); + +-- Add conditions for spell Scorchling Gets Incense +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry`=47104; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition` ,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(13,1,47104,0,1,31,0,3,26520,0,0,0,'','Scorchling gets incense can hit Festival Scorchling'), +(13,1,47104,0,2,31,0,3,26401,0,0,0,'','Scorchling gets incense can hit Summer Scorchling'); diff --git a/sql/updates/world/2016_03_15_00_world.sql b/sql/updates/world/2016_03_15_00_world.sql new file mode 100644 index 00000000000..69e2e3a873b --- /dev/null +++ b/sql/updates/world/2016_03_15_00_world.sql @@ -0,0 +1,4 @@ +SET @ENTRY := 62266; +DELETE FROM `disables` WHERE `sourceType`=0 AND `entry` = @ENTRY; +INSERT INTO `disables` (`sourceType`, `entry`, `flags`, `params_0`, `params_1`, `comment`) VALUES +(0,@ENTRY,64,0,0,'Disable LOS for Spell Trigger 3 adds'); diff --git a/src/common/Collision/Models/GameObjectModel.h b/src/common/Collision/Models/GameObjectModel.h index 9d8687233c1..7834f53c63a 100644 --- a/src/common/Collision/Models/GameObjectModel.h +++ b/src/common/Collision/Models/GameObjectModel.h @@ -84,4 +84,6 @@ private: std::unique_ptr<GameObjectModelOwnerBase> owner; }; +void LoadGameObjectModelList(std::string const& dataPath); + #endif // _GAMEOBJECT_MODEL_H diff --git a/src/common/Configuration/BuiltInConfig.cpp b/src/common/Configuration/BuiltInConfig.cpp new file mode 100644 index 00000000000..c2fc3b91766 --- /dev/null +++ b/src/common/Configuration/BuiltInConfig.cpp @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "BuiltInConfig.h" +#include "Config.h" +#include "GitRevision.h" + +template<typename Fn> +static std::string GetStringWithDefaultValueFromFunction( + std::string const& key, Fn getter) +{ + std::string const value = sConfigMgr->GetStringDefault(key, ""); + return value.empty() ? getter() : value; +} + +std::string BuiltInConfig::GetCMakeCommand() +{ + return GetStringWithDefaultValueFromFunction( + "CMakeCommand", GitRevision::GetCMakeCommand); +} + +std::string BuiltInConfig::GetBuildDirectory() +{ + return GetStringWithDefaultValueFromFunction( + "BuildDirectory", GitRevision::GetBuildDirectory); +} + +std::string BuiltInConfig::GetSourceDirectory() +{ + return GetStringWithDefaultValueFromFunction( + "SourceDirectory", GitRevision::GetSourceDirectory); +} + +std::string BuiltInConfig::GetMySQLExecutable() +{ + return GetStringWithDefaultValueFromFunction( + "MySQLExecutable", GitRevision::GetMySQLExecutable); +} diff --git a/src/common/Configuration/BuiltInConfig.h b/src/common/Configuration/BuiltInConfig.h new file mode 100644 index 00000000000..4ae4ed40189 --- /dev/null +++ b/src/common/Configuration/BuiltInConfig.h @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef BUILT_IN_CONFIG_H +#define BUILT_IN_CONFIG_H + +#include <string> + +/// Provides helper functions to access built-in values +/// which can be overwritten in config +namespace BuiltInConfig +{ + /// Returns the CMake command when any is specified in the config, + /// returns the built-in path otherwise + std::string GetCMakeCommand(); + /// Returns the build directory path when any is specified in the config, + /// returns the built-in one otherwise + std::string GetBuildDirectory(); + /// Returns the source directory path when any is specified in the config, + /// returns the built-in one otherwise + std::string GetSourceDirectory(); + /// Returns the path to the mysql executable (`mysql`) when any is specified + /// in the config, returns the built-in one otherwise + std::string GetMySQLExecutable(); + +} // namespace BuiltInConfig + +#endif // BUILT_IN_CONFIG_H diff --git a/src/common/Configuration/Config.cpp b/src/common/Configuration/Config.cpp index 6ac04615315..fba438dbd33 100644 --- a/src/common/Configuration/Config.cpp +++ b/src/common/Configuration/Config.cpp @@ -56,12 +56,18 @@ bool ConfigMgr::LoadInitial(std::string const& file, std::string& error) return true; } +ConfigMgr* ConfigMgr::instance() +{ + static ConfigMgr instance; + return &instance; +} + bool ConfigMgr::Reload(std::string& error) { return LoadInitial(_filename, error); } -std::string ConfigMgr::GetStringDefault(std::string const& name, const std::string& def) +std::string ConfigMgr::GetStringDefault(std::string const& name, const std::string& def) const { std::string value = _config.get<std::string>(ptree::path_type(name, '/'), def); @@ -70,7 +76,7 @@ std::string ConfigMgr::GetStringDefault(std::string const& name, const std::stri return value; } -bool ConfigMgr::GetBoolDefault(std::string const& name, bool def) +bool ConfigMgr::GetBoolDefault(std::string const& name, bool def) const { try { @@ -84,12 +90,12 @@ bool ConfigMgr::GetBoolDefault(std::string const& name, bool def) } } -int ConfigMgr::GetIntDefault(std::string const& name, int def) +int ConfigMgr::GetIntDefault(std::string const& name, int def) const { return _config.get<int>(ptree::path_type(name, '/'), def); } -float ConfigMgr::GetFloatDefault(std::string const& name, float def) +float ConfigMgr::GetFloatDefault(std::string const& name, float def) const { return _config.get<float>(ptree::path_type(name, '/'), def); } diff --git a/src/common/Configuration/Config.h b/src/common/Configuration/Config.h index 5b04212ed7c..6882517b509 100644 --- a/src/common/Configuration/Config.h +++ b/src/common/Configuration/Config.h @@ -33,18 +33,14 @@ public: /// Method used only for loading main configuration files (authserver.conf and worldserver.conf) bool LoadInitial(std::string const& file, std::string& error); - static ConfigMgr* instance() - { - static ConfigMgr instance; - return &instance; - } + static ConfigMgr* instance(); bool Reload(std::string& error); - std::string GetStringDefault(std::string const& name, const std::string& def); - bool GetBoolDefault(std::string const& name, bool def); - int GetIntDefault(std::string const& name, int def); - float GetFloatDefault(std::string const& name, float def); + std::string GetStringDefault(std::string const& name, const std::string& def) const; + bool GetBoolDefault(std::string const& name, bool def) const; + int GetIntDefault(std::string const& name, int def) const; + float GetFloatDefault(std::string const& name, float def) const; std::string const& GetFilename(); std::list<std::string> GetKeysByString(std::string const& name); diff --git a/src/common/Debugging/Errors.cpp b/src/common/Debugging/Errors.cpp index 1ec66ff6d59..2ce00229e53 100644 --- a/src/common/Debugging/Errors.cpp +++ b/src/common/Debugging/Errors.cpp @@ -96,4 +96,11 @@ void Abort(char const* file, int line, char const* function) exit(1); } +void AbortHandler(int /*sigval*/) +{ + // nothing useful to log here, no way to pass args + *((volatile int*)NULL) = 0; + exit(1); +} + } // namespace Trinity diff --git a/src/common/Debugging/Errors.h b/src/common/Debugging/Errors.h index 38e311a6b13..37d247ada82 100644 --- a/src/common/Debugging/Errors.h +++ b/src/common/Debugging/Errors.h @@ -34,6 +34,8 @@ namespace Trinity void Warning(char const* file, int line, char const* function, char const* message); + DECLSPEC_NORETURN void AbortHandler(int sigval) ATTR_NORETURN; + } // namespace Trinity #if COMPILER == COMPILER_MICROSOFT diff --git a/src/common/GitRevision.cpp b/src/common/GitRevision.cpp index d0719c09959..5343fbd6531 100644 --- a/src/common/GitRevision.cpp +++ b/src/common/GitRevision.cpp @@ -17,6 +17,16 @@ char const* GitRevision::GetBranch() return _BRANCH; } +char const* GitRevision::GetCMakeCommand() +{ + return _CMAKE_COMMAND; +} + +char const* GitRevision::GetBuildDirectory() +{ + return _BUILD_DIRECTORY; +} + char const* GitRevision::GetSourceDirectory() { return _SOURCE_DIRECTORY; @@ -66,13 +76,3 @@ char const* GitRevision::GetProductVersionStr() { return VER_PRODUCTVERSION_STR; } - -char const* GitRevision::GetCompilerCFlags() -{ - return COMPILER_C_FLAGS; -} - -char const* GitRevision::GetCompilerCXXFlags() -{ - return COMPILER_CXX_FLAGS; -} diff --git a/src/common/GitRevision.h b/src/common/GitRevision.h index 8d2764ba861..7fddcb7605a 100644 --- a/src/common/GitRevision.h +++ b/src/common/GitRevision.h @@ -25,6 +25,8 @@ namespace GitRevision char const* GetHash(); char const* GetDate(); char const* GetBranch(); + char const* GetCMakeCommand(); + char const* GetBuildDirectory(); char const* GetSourceDirectory(); char const* GetMySQLExecutable(); char const* GetFullDatabase(); @@ -33,8 +35,6 @@ namespace GitRevision char const* GetLegalCopyrightStr(); char const* GetFileVersionStr(); char const* GetProductVersionStr(); - char const* GetCompilerCFlags(); - char const* GetCompilerCXXFlags(); } #endif diff --git a/src/common/Logging/Log.cpp b/src/common/Logging/Log.cpp index 4bd0487343d..f7a84fb8b47 100644 --- a/src/common/Logging/Log.cpp +++ b/src/common/Logging/Log.cpp @@ -214,13 +214,13 @@ void Log::ReadLoggersFromConfig() AppenderConsole* appender = new AppenderConsole(NextAppenderId(), "Console", LOG_LEVEL_DEBUG, APPENDER_FLAGS_NONE, ExtraAppenderArgs()); appenders[appender->getId()] = appender; - Logger& logger = loggers[LOGGER_ROOT]; - logger.Create(LOGGER_ROOT, LOG_LEVEL_ERROR); - logger.addAppender(appender->getId(), appender); + Logger& rootLogger = loggers[LOGGER_ROOT]; + rootLogger.Create(LOGGER_ROOT, LOG_LEVEL_ERROR); + rootLogger.addAppender(appender->getId(), appender); - logger = loggers["server"]; - logger.Create("server", LOG_LEVEL_ERROR); - logger.addAppender(appender->getId(), appender); + Logger& serverLogger = loggers["server"]; + serverLogger.Create("server", LOG_LEVEL_INFO); + serverLogger.addAppender(appender->getId(), appender); } } @@ -320,6 +320,12 @@ void Log::Close() appenders.clear(); } +Log* Log::instance() +{ + static Log instance; + return &instance; +} + void Log::Initialize(boost::asio::io_service* ioService) { if (ioService) @@ -331,6 +337,13 @@ void Log::Initialize(boost::asio::io_service* ioService) LoadFromConfig(); } +void Log::SetSynchronous() +{ + delete _strand; + _strand = nullptr; + _ioService = nullptr; +} + void Log::LoadFromConfig() { Close(); diff --git a/src/common/Logging/Log.h b/src/common/Logging/Log.h index a90481ad5d2..062f14d525c 100644 --- a/src/common/Logging/Log.h +++ b/src/common/Logging/Log.h @@ -44,13 +44,10 @@ class Log public: - static Log* instance() - { - static Log instance; - return &instance; - } + static Log* instance(); void Initialize(boost::asio::io_service* ioService); + void SetSynchronous(); // Not threadsafe - should only be called from main() after all threads are joined void LoadFromConfig(); void Close(); bool ShouldLog(std::string const& type, LogLevel level) const; diff --git a/src/server/shared/Service/ServiceWin32.cpp b/src/common/Platform/ServiceWin32.cpp index b6a1682993b..3c34f3e322c 100644 --- a/src/server/shared/Service/ServiceWin32.cpp +++ b/src/common/Platform/ServiceWin32.cpp @@ -261,4 +261,3 @@ bool WinServiceRun() return true; } #endif - diff --git a/src/server/shared/Service/ServiceWin32.h b/src/common/Platform/ServiceWin32.h index 3d67bfe5445..b892ba4e3b6 100644 --- a/src/server/shared/Service/ServiceWin32.h +++ b/src/common/Platform/ServiceWin32.h @@ -26,4 +26,3 @@ bool WinServiceRun(); #endif // _WIN32_SERVICE_ #endif // _WIN32 - diff --git a/src/common/Threading/LockedQueue.h b/src/common/Threading/LockedQueue.h index c6faaaf81ca..21a29d7e53b 100644 --- a/src/common/Threading/LockedQueue.h +++ b/src/common/Threading/LockedQueue.h @@ -57,6 +57,14 @@ public: unlock(); } + //! Adds items back to front of the queue + template<class Iterator> + void readd(Iterator begin, Iterator end) + { + std::lock_guard<std::mutex> lock(_lock); + _queue.insert(_queue.begin(), begin, end); + } + //! Gets the next result in the queue, if any. bool next(T& result) { diff --git a/src/common/Threading/MPSCQueue.h b/src/common/Threading/MPSCQueue.h new file mode 100644 index 00000000000..09648b844be --- /dev/null +++ b/src/common/Threading/MPSCQueue.h @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef MPSCQueue_h__ +#define MPSCQueue_h__ + +#include <atomic> +#include <utility> + +// C++ implementation of Dmitry Vyukov's lock free MPSC queue +// http://www.1024cores.net/home/lock-free-algorithms/queues/non-intrusive-mpsc-node-based-queue +template<typename T> +class MPSCQueue +{ +public: + MPSCQueue() : _head(new Node()), _tail(_head.load(std::memory_order_relaxed)) + { + Node* front = _head.load(std::memory_order_relaxed); + front->Next.store(nullptr, std::memory_order_relaxed); + } + + ~MPSCQueue() + { + T* output; + while (this->Dequeue(output)) + ; + + Node* front = _head.load(std::memory_order_relaxed); + delete front; + } + + void Enqueue(T* input) + { + Node* node = new Node(input); + Node* prevHead = _head.exchange(node, std::memory_order_acq_rel); + prevHead->Next.store(node, std::memory_order_release); + } + + bool Dequeue(T*& result) + { + Node* tail = _tail.load(std::memory_order_relaxed); + Node* next = tail->Next.load(std::memory_order_acquire); + if (!next) + return false; + + result = next->Data; + _tail.store(next, std::memory_order_release); + delete tail; + return true; + } + +private: + struct Node + { + Node() = default; + explicit Node(T* data) : Data(data) { Next.store(nullptr, std::memory_order_relaxed); } + + T* Data; + std::atomic<Node*> Next; + }; + + std::atomic<Node*> _head; + std::atomic<Node*> _tail; + + MPSCQueue(MPSCQueue const&) = delete; + MPSCQueue& operator=(MPSCQueue const&) = delete; +}; + +#endif // MPSCQueue_h__ diff --git a/src/common/Utilities/Random.cpp b/src/common/Utilities/Random.cpp index cc013110b01..31318e8f52d 100644 --- a/src/common/Utilities/Random.cpp +++ b/src/common/Utilities/Random.cpp @@ -61,6 +61,14 @@ float frand(float min, float max) return float(GetRng()->Random() * (max - min) + min); } +Milliseconds randtime(Milliseconds const& min, Milliseconds const& max) +{ + long long diff = max.count() - min.count(); + ASSERT(diff >= 0); + ASSERT(diff <= (uint32)-1); + return min + Milliseconds(urand(0, diff)); +} + uint32 rand32() { return GetRng()->BRandom(); diff --git a/src/common/Utilities/Random.h b/src/common/Utilities/Random.h index 5610651a83b..5dea6117f97 100644 --- a/src/common/Utilities/Random.h +++ b/src/common/Utilities/Random.h @@ -19,6 +19,7 @@ #define Random_h__ #include "Define.h" +#include "Duration.h" #include <limits> #include <random> @@ -34,6 +35,9 @@ uint32 urandms(uint32 min, uint32 max); /* Return a random number in the range 0 .. UINT32_MAX. */ uint32 rand32(); +/* Return a random time in the range min..max (up to millisecond precision). Only works for values where millisecond difference is a valid uint32. */ +Milliseconds randtime(Milliseconds const& min, Milliseconds const& max); + /* Return a random number in the range min..max */ float frand(float min, float max); diff --git a/src/common/Utilities/StringFormat.h b/src/common/Utilities/StringFormat.h index d85523bc11f..e21b1024e87 100644 --- a/src/common/Utilities/StringFormat.h +++ b/src/common/Utilities/StringFormat.h @@ -19,7 +19,7 @@ #ifndef TRINITYCORE_STRING_FORMAT_H #define TRINITYCORE_STRING_FORMAT_H -#include "format.h" +#include "cppformat/format.h" namespace Trinity { diff --git a/src/common/Utilities/Util.cpp b/src/common/Utilities/Util.cpp index 1360253294f..ddc07505942 100644 --- a/src/common/Utilities/Util.cpp +++ b/src/common/Utilities/Util.cpp @@ -487,6 +487,17 @@ void vutf8printf(FILE* out, const char *str, va_list* ap) #endif } +bool Utf8ToUpperOnlyLatin(std::string& utf8String) +{ + std::wstring wstr; + if (!Utf8toWStr(utf8String, wstr)) + return false; + + std::transform(wstr.begin(), wstr.end(), wstr.begin(), wcharToUpperOnlyLatin); + + return WStrToUtf8(wstr, utf8String); +} + std::string ByteArrayToHexStr(uint8 const* bytes, uint32 arrayLen, bool reverse /* = false */) { int32 init = 0; diff --git a/src/common/Utilities/Util.h b/src/common/Utilities/Util.h index ab5cabca8d2..a3e3f21466e 100644 --- a/src/common/Utilities/Util.h +++ b/src/common/Utilities/Util.h @@ -310,6 +310,7 @@ bool consoleToUtf8(const std::string& conStr, std::string& utf8str); bool Utf8FitTo(const std::string& str, std::wstring const& search); void utf8printf(FILE* out, const char *str, ...); void vutf8printf(FILE* out, const char *str, va_list* ap); +bool Utf8ToUpperOnlyLatin(std::string& utf8String); bool IsIPAddress(char const* ipaddress); diff --git a/src/server/CMakeLists.txt b/src/server/CMakeLists.txt index 9a454696ca8..283b8e98721 100644 --- a/src/server/CMakeLists.txt +++ b/src/server/CMakeLists.txt @@ -18,10 +18,15 @@ if(CMAKE_COMPILER_IS_GNUCXX AND NOT MINGW) add_definitions(-fno-delete-null-pointer-checks) endif() -set(sources_windows_Debugging - ${CMAKE_SOURCE_DIR}/src/common/Debugging/WheatyExceptionReport.cpp - ${CMAKE_SOURCE_DIR}/src/common/Debugging/WheatyExceptionReport.h -) +if(WIN32) + set(sources_windows + ${CMAKE_SOURCE_DIR}/src/common/Debugging/WheatyExceptionReport.cpp + ${CMAKE_SOURCE_DIR}/src/common/Debugging/WheatyExceptionReport.h + ${CMAKE_SOURCE_DIR}/src/common/Platform/ServiceWin32.cpp + ${CMAKE_SOURCE_DIR}/src/common/Platform/ServiceWin32.h + ) +endif(WIN32) + add_subdirectory(database) add_subdirectory(shared) add_subdirectory(game) diff --git a/src/server/authserver/CMakeLists.txt b/src/server/authserver/CMakeLists.txt index c11deec39bb..d9923fa1a73 100644 --- a/src/server/authserver/CMakeLists.txt +++ b/src/server/authserver/CMakeLists.txt @@ -31,7 +31,7 @@ set(authserver_SRCS if( WIN32 ) set(authserver_SRCS ${authserver_SRCS} - ${sources_windows_Debugging} + ${sources_windows} ) if ( MSVC ) set(authserver_SRCS @@ -54,9 +54,12 @@ include_directories( ${CMAKE_SOURCE_DIR}/src/common/Logging ${CMAKE_SOURCE_DIR}/src/common/Threading ${CMAKE_SOURCE_DIR}/src/common/Utilities + ${CMAKE_SOURCE_DIR}/src/common/Platform ${CMAKE_SOURCE_DIR}/src/server/database ${CMAKE_SOURCE_DIR}/src/server/database/Database ${CMAKE_SOURCE_DIR}/src/server/database/Logging + ${CMAKE_SOURCE_DIR}/src/server/database/Updater + ${CMAKE_SOURCE_DIR}/src/server/shared ${CMAKE_SOURCE_DIR}/src/server/shared/Networking ${CMAKE_SOURCE_DIR}/src/server/shared/Packets ${CMAKE_SOURCE_DIR}/src/server/shared/Service @@ -79,10 +82,10 @@ if( NOT WIN32 ) endif() target_link_libraries(authserver - common shared - format database + common + cppformat ${MYSQL_LIBRARY} ${OPENSSL_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} diff --git a/src/server/authserver/Main.cpp b/src/server/authserver/Main.cpp index 0618ec437b6..a53187ad737 100644 --- a/src/server/authserver/Main.cpp +++ b/src/server/authserver/Main.cpp @@ -76,10 +76,11 @@ boost::asio::deadline_timer* _dbPingTimer; uint32 _dbPingInterval; boost::asio::deadline_timer* _banExpiryCheckTimer; uint32 _banExpiryCheckInterval; -LoginDatabaseWorkerPool LoginDatabase; int main(int argc, char** argv) { + signal(SIGABRT, &Trinity::AbortHandler); + std::string configFile = _TRINITY_REALM_CONFIG; std::string configService; auto vm = GetConsoleArguments(argc, argv, configFile, configService); @@ -134,7 +135,7 @@ int main(int argc, char** argv) // Get the list of realms for the server sRealmList->Initialize(*_ioService, sConfigMgr->GetIntDefault("RealmsStateUpdateDelay", 20)); - if (sRealmList->size() == 0) + if (sRealmList->GetRealms().empty()) { TC_LOG_ERROR("server.authserver", "No valid realms specified."); StopDB(); @@ -194,6 +195,8 @@ int main(int argc, char** argv) sAuthSocketMgr.StopNetwork(); + sRealmList->Close(); + // Close the Database Pool and library StopDB(); diff --git a/src/server/authserver/Realms/RealmList.cpp b/src/server/authserver/Realms/RealmList.cpp index 53aeff6133b..f1b25d8554d 100644 --- a/src/server/authserver/Realms/RealmList.cpp +++ b/src/server/authserver/Realms/RealmList.cpp @@ -16,69 +16,62 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include <boost/asio/ip/tcp.hpp> #include "Common.h" -#include "RealmList.h" #include "Database/DatabaseEnv.h" +#include "RealmList.h" +#include <boost/asio/ip/tcp.hpp> namespace boost { namespace asio { namespace ip { class address; } } } -RealmList::RealmList() : m_UpdateInterval(0), m_NextUpdateTime(time(NULL)), _resolver(nullptr) { } +RealmList::RealmList() : _updateInterval(0), _updateTimer(nullptr), _resolver(nullptr) { } RealmList::~RealmList() { delete _resolver; + delete _updateTimer; } // Load the realm list from the database void RealmList::Initialize(boost::asio::io_service& ioService, uint32 updateInterval) { + _updateInterval = updateInterval; + _updateTimer = new boost::asio::deadline_timer(ioService); _resolver = new boost::asio::ip::tcp::resolver(ioService); - m_UpdateInterval = updateInterval; // Get the content of the realmlist table in the database - UpdateRealms(true); + UpdateRealms(true, boost::system::error_code()); } -void RealmList::UpdateRealm(uint32 id, const std::string& name, ip::address const& address, ip::address const& localAddr, - ip::address const& localSubmask, uint16 port, uint8 icon, RealmFlags flag, uint8 timezone, AccountTypes allowedSecurityLevel, float population, uint32 build) +void RealmList::Close() { - // Create new if not exist or update existed - Realm& realm = m_realms[name]; - - realm.m_ID = id; - realm.name = name; - realm.icon = icon; - realm.flag = flag; - realm.timezone = timezone; - realm.allowedSecurityLevel = allowedSecurityLevel; - realm.populationLevel = population; - - // Append port to IP address. + _updateTimer->cancel(); +} +void RealmList::UpdateRealm(RealmHandle const& id, uint32 build, const std::string& name, ip::address const& address, ip::address const& localAddr, + ip::address const& localSubmask, uint16 port, uint8 icon, RealmFlags flag, uint8 timezone, AccountTypes allowedSecurityLevel, + float population) +{ + // Create new if not exist or update existed + Realm& realm = _realms[id]; + + realm.Id = id; + realm.Build = build; + realm.Name = name; + realm.Type = icon; + realm.Flags = flag; + realm.Timezone = timezone; + realm.AllowedSecurityLevel = allowedSecurityLevel; + realm.PopulationLevel = population; realm.ExternalAddress = address; realm.LocalAddress = localAddr; realm.LocalSubnetMask = localSubmask; - realm.port = port; - realm.gamebuild = build; + realm.Port = port; } -void RealmList::UpdateIfNeed() +void RealmList::UpdateRealms(bool init, boost::system::error_code const& error) { - // maybe disabled or updated recently - if (!m_UpdateInterval || m_NextUpdateTime > time(NULL)) + if (error) return; - m_NextUpdateTime = time(NULL) + m_UpdateInterval; - - // Clears Realm list - m_realms.clear(); - - // Get the content of the realmlist table in the database - UpdateRealms(); -} - -void RealmList::UpdateRealms(bool init) -{ TC_LOG_INFO("server.authserver", "Updating Realm List..."); PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_REALMLIST); @@ -130,17 +123,23 @@ void RealmList::UpdateRealms(bool init) uint16 port = fields[5].GetUInt16(); uint8 icon = fields[6].GetUInt8(); + if (icon == REALM_TYPE_FFA_PVP) + icon = REALM_TYPE_PVP; + if (icon >= MAX_CLIENT_REALM_TYPE) + icon = REALM_TYPE_NORMAL; RealmFlags flag = RealmFlags(fields[7].GetUInt8()); uint8 timezone = fields[8].GetUInt8(); uint8 allowedSecurityLevel = fields[9].GetUInt8(); float pop = fields[10].GetFloat(); uint32 build = fields[11].GetUInt32(); - UpdateRealm(realmId, name, externalAddress, localAddress, localSubmask, port, icon, flag, timezone, - (allowedSecurityLevel <= SEC_ADMINISTRATOR ? AccountTypes(allowedSecurityLevel) : SEC_ADMINISTRATOR), pop, build); + RealmHandle id{ realmId }; + + UpdateRealm(id, build, name, externalAddress, localAddress, localSubmask, port, icon, flag, + timezone, (allowedSecurityLevel <= SEC_ADMINISTRATOR ? AccountTypes(allowedSecurityLevel) : SEC_ADMINISTRATOR), pop); if (init) - TC_LOG_INFO("server.authserver", "Added realm \"%s\" at %s:%u.", name.c_str(), m_realms[name].ExternalAddress.to_string().c_str(), port); + TC_LOG_INFO("server.authserver", "Added realm \"%s\" at %s:%u.", name.c_str(), externalAddress.to_string().c_str(), port); } catch (std::exception& ex) { @@ -150,4 +149,19 @@ void RealmList::UpdateRealms(bool init) } while (result->NextRow()); } + + if (_updateInterval) + { + _updateTimer->expires_from_now(boost::posix_time::seconds(_updateInterval)); + _updateTimer->async_wait(std::bind(&RealmList::UpdateRealms, this, false, std::placeholders::_1)); + } +} + +Realm const* RealmList::GetRealm(RealmHandle const& id) const +{ + auto itr = _realms.find(id); + if (itr != _realms.end()) + return &itr->second; + + return NULL; } diff --git a/src/server/authserver/Realms/RealmList.h b/src/server/authserver/Realms/RealmList.h index cc5c88c01f2..e35975b215a 100644 --- a/src/server/authserver/Realms/RealmList.h +++ b/src/server/authserver/Realms/RealmList.h @@ -19,48 +19,20 @@ #ifndef _REALMLIST_H #define _REALMLIST_H +#include "Common.h" +#include "Realm/Realm.h" #include <boost/asio/ip/address.hpp> #include <boost/asio/ip/tcp.hpp> #include <boost/asio/io_service.hpp> -#include "Common.h" +#include <boost/asio/deadline_timer.hpp> using namespace boost::asio; -enum RealmFlags -{ - REALM_FLAG_NONE = 0x00, - REALM_FLAG_INVALID = 0x01, - REALM_FLAG_OFFLINE = 0x02, - REALM_FLAG_SPECIFYBUILD = 0x04, - REALM_FLAG_UNK1 = 0x08, - REALM_FLAG_UNK2 = 0x10, - REALM_FLAG_RECOMMENDED = 0x20, - REALM_FLAG_NEW = 0x40, - REALM_FLAG_FULL = 0x80 -}; - -// Storage object for a realm -struct Realm -{ - ip::address ExternalAddress; - ip::address LocalAddress; - ip::address LocalSubnetMask; - uint16 port; - std::string name; - uint8 icon; - RealmFlags flag; - uint8 timezone; - uint32 m_ID; - AccountTypes allowedSecurityLevel; - float populationLevel; - uint32 gamebuild; -}; - /// Storage object for the list of realms on the server class RealmList { public: - typedef std::map<std::string, Realm> RealmMap; + typedef std::map<RealmHandle, Realm> RealmMap; static RealmList* instance() { @@ -71,25 +43,21 @@ public: ~RealmList(); void Initialize(boost::asio::io_service& ioService, uint32 updateInterval); + void Close(); - void UpdateIfNeed(); - - void AddRealm(const Realm& NewRealm) { m_realms[NewRealm.name] = NewRealm; } - - RealmMap::const_iterator begin() const { return m_realms.begin(); } - RealmMap::const_iterator end() const { return m_realms.end(); } - uint32 size() const { return m_realms.size(); } + RealmMap const& GetRealms() const { return _realms; } + Realm const* GetRealm(RealmHandle const& id) const; private: RealmList(); - void UpdateRealms(bool init = false); - void UpdateRealm(uint32 id, const std::string& name, ip::address const& address, ip::address const& localAddr, - ip::address const& localSubmask, uint16 port, uint8 icon, RealmFlags flag, uint8 timezone, AccountTypes allowedSecurityLevel, float population, uint32 build); + void UpdateRealms(bool init, boost::system::error_code const& error); + void UpdateRealm(RealmHandle const& id, uint32 build, const std::string& name, ip::address const& address, ip::address const& localAddr, + ip::address const& localSubmask, uint16 port, uint8 icon, RealmFlags flag, uint8 timezone, AccountTypes allowedSecurityLevel, float population); - RealmMap m_realms; - uint32 m_UpdateInterval; - time_t m_NextUpdateTime; + RealmMap _realms; + uint32 _updateInterval; + boost::asio::deadline_timer* _updateTimer; boost::asio::ip::tcp::resolver* _resolver; }; diff --git a/src/server/authserver/Server/AuthSession.cpp b/src/server/authserver/Server/AuthSession.cpp index 519cd1f19f7..982aca58eee 100644 --- a/src/server/authserver/Server/AuthSession.cpp +++ b/src/server/authserver/Server/AuthSession.cpp @@ -146,6 +146,11 @@ void AccountInfo::LoadResult(Field* fields) IsBanned = fields[6].GetUInt64() != 0; IsPermanenetlyBanned = fields[7].GetUInt64() != 0; SecurityLevel = AccountTypes(fields[8].GetUInt8()); + + // Use our own uppercasing of the account name instead of using UPPER() in mysql query + // This is how the account was created in the first place and changing it now would result in breaking + // login for all accounts having accented characters in their name + Utf8ToUpperOnlyLatin(Login); } AuthSession::AuthSession(tcp::socket&& socket) : Socket(std::move(socket)), @@ -274,10 +279,7 @@ void AuthSession::SendPacket(ByteBuffer& packet) { MessageBuffer buffer; buffer.Write(packet.contents(), packet.size()); - - std::unique_lock<std::mutex> guard(_writeLock); - - QueuePacket(std::move(buffer), guard); + QueuePacket(std::move(buffer)); } } @@ -847,7 +849,7 @@ tcp::endpoint const GetAddressForClient(Realm const& realm, ip::address const& c realmIp = realm.ExternalAddress; } - tcp::endpoint endpoint(realmIp, realm.port); + tcp::endpoint endpoint(realmIp, realm.Port); // Return external IP return endpoint; @@ -883,22 +885,19 @@ void AuthSession::RealmListCallback(PreparedQueryResult result) } while (result->NextRow()); } - // Update realm list if need - sRealmList->UpdateIfNeed(); - // Circle through realms in the RealmList and construct the return packet (including # of user characters in each realm) ByteBuffer pkt; size_t RealmListSize = 0; - for (RealmList::RealmMap::const_iterator i = sRealmList->begin(); i != sRealmList->end(); ++i) + for (RealmList::RealmMap::value_type const& i : sRealmList->GetRealms()) { - const Realm &realm = i->second; + const Realm &realm = i.second; // don't work with realms which not compatible with the client - bool okBuild = ((_expversion & POST_BC_EXP_FLAG) && realm.gamebuild == _build) || ((_expversion & PRE_BC_EXP_FLAG) && !AuthHelper::IsPreBCAcceptedClientBuild(realm.gamebuild)); + bool okBuild = ((_expversion & POST_BC_EXP_FLAG) && realm.Build == _build) || ((_expversion & PRE_BC_EXP_FLAG) && !AuthHelper::IsPreBCAcceptedClientBuild(realm.Build)); // No SQL injection. id of realm is controlled by the database. - uint32 flag = realm.flag; - RealmBuildInfo const* buildInfo = AuthHelper::GetBuildInfo(realm.gamebuild); + uint32 flag = realm.Flags; + RealmBuildInfo const* buildInfo = AuthHelper::GetBuildInfo(realm.Build); if (!okBuild) { if (!buildInfo) @@ -910,7 +909,7 @@ void AuthSession::RealmListCallback(PreparedQueryResult result) if (!buildInfo) flag &= ~REALM_FLAG_SPECIFYBUILD; - std::string name = i->first; + std::string name = realm.Name; if (_expversion & PRE_BC_EXP_FLAG && flag & REALM_FLAG_SPECIFYBUILD) { std::ostringstream ss; @@ -918,19 +917,19 @@ void AuthSession::RealmListCallback(PreparedQueryResult result) name = ss.str(); } - uint8 lock = (realm.allowedSecurityLevel > _accountInfo.SecurityLevel) ? 1 : 0; + uint8 lock = (realm.AllowedSecurityLevel > _accountInfo.SecurityLevel) ? 1 : 0; - pkt << uint8(realm.icon); // realm type + pkt << uint8(realm.Type); // realm type if (_expversion & POST_BC_EXP_FLAG) // only 2.x and 3.x clients pkt << uint8(lock); // if 1, then realm locked pkt << uint8(flag); // RealmFlags pkt << name; pkt << boost::lexical_cast<std::string>(GetAddressForClient(realm, GetRemoteIpAddress())); - pkt << float(realm.populationLevel); - pkt << uint8(characterCounts[realm.m_ID]); - pkt << uint8(realm.timezone); // realm category + pkt << float(realm.PopulationLevel); + pkt << uint8(characterCounts[realm.Id.Realm]); + pkt << uint8(realm.Timezone); // realm category if (_expversion & POST_BC_EXP_FLAG) // 2.x and 3.x clients - pkt << uint8(realm.m_ID); + pkt << uint8(realm.Id.Realm); else pkt << uint8(0x0); // 1.12.1 and 1.12.2 clients diff --git a/src/server/authserver/Server/AuthSocketMgr.h b/src/server/authserver/Server/AuthSocketMgr.h index fa96502663f..a16b7d405b9 100644 --- a/src/server/authserver/Server/AuthSocketMgr.h +++ b/src/server/authserver/Server/AuthSocketMgr.h @@ -21,8 +21,6 @@ #include "SocketMgr.h" #include "AuthSession.h" -void OnSocketAccept(tcp::socket&& sock); - class AuthSocketMgr : public SocketMgr<AuthSession> { typedef SocketMgr<AuthSession> BaseSocketMgr; @@ -39,7 +37,7 @@ public: if (!BaseSocketMgr::StartNetwork(service, bindIp, port)) return false; - _acceptor->AsyncAcceptManaged(&OnSocketAccept); + _acceptor->AsyncAcceptWithCallback<&AuthSocketMgr::OnSocketAccept>(); return true; } @@ -48,14 +46,13 @@ protected: { return new NetworkThread<AuthSession>[1]; } + + static void OnSocketAccept(tcp::socket&& sock, uint32 threadIndex) + { + Instance().OnSocketOpen(std::forward<tcp::socket>(sock), threadIndex); + } }; #define sAuthSocketMgr AuthSocketMgr::Instance() -void OnSocketAccept(tcp::socket&& sock) -{ - sAuthSocketMgr.OnSocketOpen(std::forward<tcp::socket>(sock)); -} - - #endif // AuthSocketMgr_h__ diff --git a/src/server/authserver/authserver.conf.dist b/src/server/authserver/authserver.conf.dist index 82c3cd47148..a97d75b3f57 100644 --- a/src/server/authserver/authserver.conf.dist +++ b/src/server/authserver/authserver.conf.dist @@ -138,6 +138,26 @@ WrongPass.Logging = 0 BanExpiryCheckInterval = 60 # +# SourceDirectory +# Description: The path to your TrinityCore source directory. +# If the path is left empty, the built-in CMAKE_SOURCE_DIR is used. +# Example: "../TrinityCore" +# Default: "" + +SourceDirectory = "" + +# +# MySQLExecutable +# Description: The path to your mysql cli binary. +# If the path is left empty, built-in path from cmake is used. +# Example: "C:/Program Files/MySQL/MySQL Server 5.6/bin/mysql.exe" +# "mysql.exe" +# "/usr/bin/mysql" +# Default: "" + +MySQLExecutable = "" + +# ################################################################################################### ################################################################################################### @@ -181,26 +201,6 @@ LoginDatabase.WorkerThreads = 1 Updates.EnableDatabases = 0 # -# Updates.SourcePath -# Description: The path to your TrinityCore source directory. -# If the path is left empty, built-in CMAKE_SOURCE_DIR is used. -# Example: "../TrinityCore" -# Default: "" - -Updates.SourcePath = "" - -# -# Updates.MySqlCLIPath -# Description: The path to your mysql cli binary. -# If the path is left empty, built-in path from cmake is used. -# Example: "C:/Program Files/MySQL/MySQL Server 5.6/bin/mysql.exe" -# "mysql.exe" -# "/usr/bin/mysql" -# Default: "" - -Updates.MySqlCLIPath = "" - -# # Updates.AutoSetup # Description: Auto populate empty databases. # Default: 1 - (Enabled) diff --git a/src/server/database/Database/DatabaseEnv.cpp b/src/server/database/Database/DatabaseEnv.cpp new file mode 100644 index 00000000000..3b2e632e4fb --- /dev/null +++ b/src/server/database/Database/DatabaseEnv.cpp @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "DatabaseEnv.h" + +WorldDatabaseWorkerPool WorldDatabase; +CharacterDatabaseWorkerPool CharacterDatabase; +LoginDatabaseWorkerPool LoginDatabase; diff --git a/src/server/database/Database/DatabaseEnv.h b/src/server/database/Database/DatabaseEnv.h index cc8355a1302..c9a7672ac57 100644 --- a/src/server/database/Database/DatabaseEnv.h +++ b/src/server/database/Database/DatabaseEnv.h @@ -38,9 +38,11 @@ #include "Implementation/CharacterDatabase.h" #include "Implementation/WorldDatabase.h" +/// Accessor to the world database extern WorldDatabaseWorkerPool WorldDatabase; +/// Accessor to the character database extern CharacterDatabaseWorkerPool CharacterDatabase; +/// Accessor to the realm/login database extern LoginDatabaseWorkerPool LoginDatabase; #endif - diff --git a/src/server/database/Database/DatabaseLoader.cpp b/src/server/database/Database/DatabaseLoader.cpp index 92d8730cd12..6a8e86ffca9 100644 --- a/src/server/database/Database/DatabaseLoader.cpp +++ b/src/server/database/Database/DatabaseLoader.cpp @@ -32,7 +32,7 @@ DatabaseLoader& DatabaseLoader::AddDatabase(DatabaseWorkerPool<T>& pool, std::st { bool const updatesEnabledForThis = DBUpdater<T>::IsEnabled(_updateFlags); - _open.push(std::make_pair([this, name, updatesEnabledForThis, &pool]() -> bool + _open.push([this, name, updatesEnabledForThis, &pool]() -> bool { std::string const dbString = sConfigMgr->GetStringDefault(name + "DatabaseInfo", ""); if (dbString.empty()) @@ -71,12 +71,13 @@ DatabaseLoader& DatabaseLoader::AddDatabase(DatabaseWorkerPool<T>& pool, std::st return false; } } + // Add the close operation + _close.push([&pool] + { + pool.Close(); + }); return true; - }, - [&pool]() - { - pool.Close(); - })); + }); // Populate and update only if updates are enabled for this pool if (updatesEnabledForThis) @@ -137,38 +138,7 @@ bool DatabaseLoader::Load() bool DatabaseLoader::OpenDatabases() { - while (!_open.empty()) - { - std::pair<Predicate, std::function<void()>> const load = _open.top(); - if (load.first()) - _close.push(load.second); - else - { - // Close all loaded databases - while (!_close.empty()) - { - _close.top()(); - _close.pop(); - } - return false; - } - - _open.pop(); - } - return true; -} - -// Processes the elements of the given stack until a predicate returned false. -bool DatabaseLoader::Process(std::stack<Predicate>& stack) -{ - while (!stack.empty()) - { - if (!stack.top()()) - return false; - - stack.pop(); - } - return true; + return Process(_open); } bool DatabaseLoader::PopulateDatabases() @@ -186,6 +156,27 @@ bool DatabaseLoader::PrepareStatements() return Process(_prepare); } +bool DatabaseLoader::Process(std::queue<Predicate>& queue) +{ + while (!queue.empty()) + { + if (!queue.front()()) + { + // Close all open databases which have a registered close operation + while (!_close.empty()) + { + _close.top()(); + _close.pop(); + } + + return false; + } + + queue.pop(); + } + return true; +} + template DatabaseLoader& DatabaseLoader::AddDatabase<LoginDatabaseConnection>(DatabaseWorkerPool<LoginDatabaseConnection>& pool, std::string const& name); template diff --git a/src/server/database/Database/DatabaseLoader.h b/src/server/database/Database/DatabaseLoader.h index da92cf85a9f..d3812eb060d 100644 --- a/src/server/database/Database/DatabaseLoader.h +++ b/src/server/database/Database/DatabaseLoader.h @@ -19,10 +19,11 @@ #define DatabaseLoader_h__ #include "DatabaseWorkerPool.h" -#include "DatabaseEnv.h" +#include "DBUpdater.h" -#include <stack> #include <functional> +#include <stack> +#include <queue> // A helper class to initiate all database worker pools, // handles updating, delays preparing of statements and cleans up on failure. @@ -56,16 +57,18 @@ private: bool PrepareStatements(); using Predicate = std::function<bool()>; + using Closer = std::function<void()>; - static bool Process(std::stack<Predicate>& stack); + // Invokes all functions in the given queue and closes the databases on errors. + // Returns false when there was an error. + bool Process(std::queue<Predicate>& queue); std::string const _logger; bool const _autoSetup; uint32 const _updateFlags; - std::stack<std::pair<Predicate, std::function<void()>>> _open; - std::stack<std::function<void()>> _close; - std::stack<Predicate> _populate, _update, _prepare; + std::queue<Predicate> _open, _populate, _update, _prepare; + std::stack<Closer> _close; }; #endif // DatabaseLoader_h__ diff --git a/src/server/database/Database/DatabaseWorkerPool.cpp b/src/server/database/Database/DatabaseWorkerPool.cpp new file mode 100644 index 00000000000..5d914b6e0e8 --- /dev/null +++ b/src/server/database/Database/DatabaseWorkerPool.cpp @@ -0,0 +1,322 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "DatabaseWorkerPool.h" +#include "DatabaseEnv.h" + +#define MIN_MYSQL_SERVER_VERSION 50100u +#define MIN_MYSQL_CLIENT_VERSION 50100u + +template <class T> +DatabaseWorkerPool<T>::DatabaseWorkerPool() + : _queue(new ProducerConsumerQueue<SQLOperation*>()), + _async_threads(0), _synch_threads(0) +{ + WPFatal(mysql_thread_safe(), "Used MySQL library isn't thread-safe."); + WPFatal(mysql_get_client_version() >= MIN_MYSQL_CLIENT_VERSION, "TrinityCore does not support MySQL versions below 5.1"); + WPFatal(mysql_get_client_version() == MYSQL_VERSION_ID, "Used MySQL library version (%s) does not match the version used to compile TrinityCore (%s).", + mysql_get_client_info(), MYSQL_SERVER_VERSION); +} + +template <class T> +void DatabaseWorkerPool<T>::SetConnectionInfo(std::string const& infoString, + uint8 const asyncThreads, uint8 const synchThreads) +{ + _connectionInfo = Trinity::make_unique<MySQLConnectionInfo>(infoString); + + _async_threads = asyncThreads; + _synch_threads = synchThreads; +} + +template <class T> +uint32 DatabaseWorkerPool<T>::Open() +{ + WPFatal(_connectionInfo.get(), "Connection info was not set!"); + + TC_LOG_INFO("sql.driver", "Opening DatabasePool '%s'. " + "Asynchronous connections: %u, synchronous connections: %u.", + GetDatabaseName(), _async_threads, _synch_threads); + + uint32 error = OpenConnections(IDX_ASYNC, _async_threads); + + if (error) + return error; + + error = OpenConnections(IDX_SYNCH, _synch_threads); + + if (!error) + { + TC_LOG_INFO("sql.driver", "DatabasePool '%s' opened successfully. " SZFMTD + " total connections running.", GetDatabaseName(), + (_connections[IDX_SYNCH].size() + _connections[IDX_ASYNC].size())); + } + + return error; +} + +template <class T> +void DatabaseWorkerPool<T>::Close() +{ + TC_LOG_INFO("sql.driver", "Closing down DatabasePool '%s'.", GetDatabaseName()); + + //! Closes the actualy MySQL connection. + _connections[IDX_ASYNC].clear(); + + TC_LOG_INFO("sql.driver", "Asynchronous connections on DatabasePool '%s' terminated. " + "Proceeding with synchronous connections.", + GetDatabaseName()); + + //! Shut down the synchronous connections + //! There's no need for locking the connection, because DatabaseWorkerPool<>::Close + //! should only be called after any other thread tasks in the core have exited, + //! meaning there can be no concurrent access at this point. + _connections[IDX_SYNCH].clear(); + + TC_LOG_INFO("sql.driver", "All connections on DatabasePool '%s' closed.", GetDatabaseName()); +} + +template <class T> +bool DatabaseWorkerPool<T>::PrepareStatements() +{ + for (auto& connections : _connections) + for (auto& connection : connections) + { + connection->LockIfReady(); + if (!connection->PrepareStatements()) + { + connection->Unlock(); + Close(); + return false; + } + else + connection->Unlock(); + } + + return true; +} + +template <class T> +QueryResult DatabaseWorkerPool<T>::Query(const char* sql, T* connection /*= nullptr*/) +{ + if (!connection) + connection = GetFreeConnection(); + + ResultSet* result = connection->Query(sql); + connection->Unlock(); + if (!result || !result->GetRowCount() || !result->NextRow()) + { + delete result; + return QueryResult(NULL); + } + + return QueryResult(result); +} + +template <class T> +PreparedQueryResult DatabaseWorkerPool<T>::Query(PreparedStatement* stmt) +{ + auto connection = GetFreeConnection(); + PreparedResultSet* ret = connection->Query(stmt); + connection->Unlock(); + + //! Delete proxy-class. Not needed anymore + delete stmt; + + if (!ret || !ret->GetRowCount()) + { + delete ret; + return PreparedQueryResult(NULL); + } + + return PreparedQueryResult(ret); +} + +template <class T> +QueryResultFuture DatabaseWorkerPool<T>::AsyncQuery(const char* sql) +{ + BasicStatementTask* task = new BasicStatementTask(sql, true); + // Store future result before enqueueing - task might get already processed and deleted before returning from this method + QueryResultFuture result = task->GetFuture(); + Enqueue(task); + return result; +} + +template <class T> +PreparedQueryResultFuture DatabaseWorkerPool<T>::AsyncQuery(PreparedStatement* stmt) +{ + PreparedStatementTask* task = new PreparedStatementTask(stmt, true); + // Store future result before enqueueing - task might get already processed and deleted before returning from this method + PreparedQueryResultFuture result = task->GetFuture(); + Enqueue(task); + return result; +} + +template <class T> +QueryResultHolderFuture DatabaseWorkerPool<T>::DelayQueryHolder(SQLQueryHolder* holder) +{ + SQLQueryHolderTask* task = new SQLQueryHolderTask(holder); + // Store future result before enqueueing - task might get already processed and deleted before returning from this method + QueryResultHolderFuture result = task->GetFuture(); + Enqueue(task); + return result; +} + +template <class T> +void DatabaseWorkerPool<T>::CommitTransaction(SQLTransaction transaction) +{ +#ifdef TRINITY_DEBUG + //! Only analyze transaction weaknesses in Debug mode. + //! Ideally we catch the faults in Debug mode and then correct them, + //! so there's no need to waste these CPU cycles in Release mode. + switch (transaction->GetSize()) + { + case 0: + TC_LOG_DEBUG("sql.driver", "Transaction contains 0 queries. Not executing."); + return; + case 1: + TC_LOG_DEBUG("sql.driver", "Warning: Transaction only holds 1 query, consider removing Transaction context in code."); + break; + default: + break; + } +#endif // TRINITY_DEBUG + + Enqueue(new TransactionTask(transaction)); +} + +template <class T> +void DatabaseWorkerPool<T>::DirectCommitTransaction(SQLTransaction& transaction) +{ + T* connection = GetFreeConnection(); + int errorCode = connection->ExecuteTransaction(transaction); + if (!errorCode) + { + connection->Unlock(); // OK, operation succesful + return; + } + + //! Handle MySQL Errno 1213 without extending deadlock to the core itself + /// @todo More elegant way + if (errorCode == ER_LOCK_DEADLOCK) + { + uint8 loopBreaker = 5; + for (uint8 i = 0; i < loopBreaker; ++i) + { + if (!connection->ExecuteTransaction(transaction)) + break; + } + } + + //! Clean up now. + transaction->Cleanup(); + + connection->Unlock(); +} + +template <class T> +void DatabaseWorkerPool<T>::EscapeString(std::string& str) +{ + if (str.empty()) + return; + + char* buf = new char[str.size() * 2 + 1]; + EscapeString(buf, str.c_str(), str.size()); + str = buf; + delete[] buf; +} + +template <class T> +void DatabaseWorkerPool<T>::KeepAlive() +{ + //! Ping synchronous connections + for (auto& connection : _connections[IDX_SYNCH]) + { + if (connection->LockIfReady()) + { + connection->Ping(); + connection->Unlock(); + } + } + + //! Assuming all worker threads are free, every worker thread will receive 1 ping operation request + //! If one or more worker threads are busy, the ping operations will not be split evenly, but this doesn't matter + //! as the sole purpose is to prevent connections from idling. + auto const count = _connections[IDX_ASYNC].size(); + for (uint8 i = 0; i < count; ++i) + Enqueue(new PingOperation); +} + +template <class T> +uint32 DatabaseWorkerPool<T>::OpenConnections(InternalIndex type, uint8 numConnections) +{ + for (uint8 i = 0; i < numConnections; ++i) + { + // Create the connection + auto connection = [&] { + switch (type) + { + case IDX_ASYNC: + return Trinity::make_unique<T>(_queue.get(), *_connectionInfo); + case IDX_SYNCH: + return Trinity::make_unique<T>(*_connectionInfo); + default: + ABORT(); + } + }(); + + if (uint32 error = connection->Open()) + { + // Failed to open a connection or invalid version, abort and cleanup + _connections[type].clear(); + return error; + } + else if (mysql_get_server_version(connection->GetHandle()) < MIN_MYSQL_SERVER_VERSION) + { + TC_LOG_ERROR("sql.driver", "TrinityCore does not support MySQL versions below 5.1"); + return 1; + } + else + { + _connections[type].push_back(std::move(connection)); + } + } + + // Everything is fine + return 0; +} + +template <class T> +T* DatabaseWorkerPool<T>::GetFreeConnection() +{ + uint8 i = 0; + auto const num_cons = _connections[IDX_SYNCH].size(); + T* connection = nullptr; + //! Block forever until a connection is free + for (;;) + { + connection = _connections[IDX_SYNCH][++i % num_cons].get(); + //! Must be matched with t->Unlock() or you will get deadlocks + if (connection->LockIfReady()) + break; + } + + return connection; +} + +template class DatabaseWorkerPool<LoginDatabaseConnection>; +template class DatabaseWorkerPool<WorldDatabaseConnection>; +template class DatabaseWorkerPool<CharacterDatabaseConnection>; diff --git a/src/server/database/Database/DatabaseWorkerPool.h b/src/server/database/Database/DatabaseWorkerPool.h index d5a254647eb..d883366237f 100644 --- a/src/server/database/Database/DatabaseWorkerPool.h +++ b/src/server/database/Database/DatabaseWorkerPool.h @@ -32,9 +32,7 @@ #include <mysqld_error.h> #include <memory> - -#define MIN_MYSQL_SERVER_VERSION 50100u -#define MIN_MYSQL_CLIENT_VERSION 50100u +#include <array> class PingOperation : public SQLOperation { @@ -59,97 +57,21 @@ class DatabaseWorkerPool public: /* Activity state */ - DatabaseWorkerPool() : _queue(new ProducerConsumerQueue<SQLOperation*>()), - _async_threads(0), _synch_threads(0) - { - memset(_connectionCount, 0, sizeof(_connectionCount)); - _connections.resize(IDX_SIZE); - - WPFatal(mysql_thread_safe(), "Used MySQL library isn't thread-safe."); - WPFatal(mysql_get_client_version() >= MIN_MYSQL_CLIENT_VERSION, "TrinityCore does not support MySQL versions below 5.1"); - WPFatal(mysql_get_client_version() == MYSQL_VERSION_ID, "Used MySQL library version (%s) does not match the version used to compile TrinityCore (%s).", - mysql_get_client_info(), MYSQL_SERVER_VERSION); - } + DatabaseWorkerPool(); ~DatabaseWorkerPool() { _queue->Cancel(); } - void SetConnectionInfo(std::string const& infoString, uint8 const asyncThreads, uint8 const synchThreads) - { - _connectionInfo.reset(new MySQLConnectionInfo(infoString)); - - _async_threads = asyncThreads; - _synch_threads = synchThreads; - } - - uint32 Open() - { - WPFatal(_connectionInfo.get(), "Connection info was not set!"); - - TC_LOG_INFO("sql.driver", "Opening DatabasePool '%s'. Asynchronous connections: %u, synchronous connections: %u.", - GetDatabaseName(), _async_threads, _synch_threads); - - uint32 error = OpenConnections(IDX_ASYNC, _async_threads); - - if (error) - return error; - - error = OpenConnections(IDX_SYNCH, _synch_threads); - - if (!error) - { - TC_LOG_INFO("sql.driver", "DatabasePool '%s' opened successfully. %u total connections running.", GetDatabaseName(), - (_connectionCount[IDX_SYNCH] + _connectionCount[IDX_ASYNC])); - } - - return error; - } - - void Close() - { - TC_LOG_INFO("sql.driver", "Closing down DatabasePool '%s'.", GetDatabaseName()); + void SetConnectionInfo(std::string const& infoString, uint8 const asyncThreads, uint8 const synchThreads); - for (uint8 i = 0; i < _connectionCount[IDX_ASYNC]; ++i) - { - T* t = _connections[IDX_ASYNC][i]; - t->Close(); //! Closes the actualy MySQL connection. - } + uint32 Open(); - TC_LOG_INFO("sql.driver", "Asynchronous connections on DatabasePool '%s' terminated. Proceeding with synchronous connections.", - GetDatabaseName()); - - //! Shut down the synchronous connections - //! There's no need for locking the connection, because DatabaseWorkerPool<>::Close - //! should only be called after any other thread tasks in the core have exited, - //! meaning there can be no concurrent access at this point. - for (uint8 i = 0; i < _connectionCount[IDX_SYNCH]; ++i) - _connections[IDX_SYNCH][i]->Close(); - - TC_LOG_INFO("sql.driver", "All connections on DatabasePool '%s' closed.", GetDatabaseName()); - } + void Close(); //! Prepares all prepared statements - bool PrepareStatements() - { - for (uint8 i = 0; i < IDX_SIZE; ++i) - for (uint32 c = 0; c < _connectionCount[i]; ++c) - { - T* t = _connections[i][c]; - t->LockIfReady(); - if (!t->PrepareStatements()) - { - t->Unlock(); - Close(); - return false; - } - else - t->Unlock(); - } - - return true; - } + bool PrepareStatements(); inline MySQLConnectionInfo const* GetConnectionInfo() const { @@ -201,9 +123,9 @@ class DatabaseWorkerPool if (!sql) return; - T* t = GetFreeConnection(); - t->Execute(sql); - t->Unlock(); + T* connection = GetFreeConnection(); + connection->Execute(sql); + connection->Unlock(); } //! Directly executes a one-way SQL operation in string format -with variable args-, that will block the calling thread until finished. @@ -221,9 +143,9 @@ class DatabaseWorkerPool //! Statement must be prepared with the CONNECTION_SYNCH flag. void DirectExecute(PreparedStatement* stmt) { - T* t = GetFreeConnection(); - t->Execute(stmt); - t->Unlock(); + T* connection = GetFreeConnection(); + connection->Execute(stmt); + connection->Unlock(); //! Delete proxy-class. Not needed anymore delete stmt; @@ -235,21 +157,7 @@ class DatabaseWorkerPool //! Directly executes an SQL query in string format that will block the calling thread until finished. //! Returns reference counted auto pointer, no need for manual memory management in upper level code. - QueryResult Query(const char* sql, T* conn = nullptr) - { - if (!conn) - conn = GetFreeConnection(); - - ResultSet* result = conn->Query(sql); - conn->Unlock(); - if (!result || !result->GetRowCount() || !result->NextRow()) - { - delete result; - return QueryResult(NULL); - } - - return QueryResult(result); - } + QueryResult Query(const char* sql, T* connection = nullptr); //! Directly executes an SQL query in string format -with variable args- that will block the calling thread until finished. //! Returns reference counted auto pointer, no need for manual memory management in upper level code. @@ -276,23 +184,7 @@ class DatabaseWorkerPool //! Directly executes an SQL query in prepared format that will block the calling thread until finished. //! Returns reference counted auto pointer, no need for manual memory management in upper level code. //! Statement must be prepared with CONNECTION_SYNCH flag. - PreparedQueryResult Query(PreparedStatement* stmt) - { - T* t = GetFreeConnection(); - PreparedResultSet* ret = t->Query(stmt); - t->Unlock(); - - //! Delete proxy-class. Not needed anymore - delete stmt; - - if (!ret || !ret->GetRowCount()) - { - delete ret; - return PreparedQueryResult(NULL); - } - - return PreparedQueryResult(ret); - } + PreparedQueryResult Query(PreparedStatement* stmt); /** Asynchronous query (with resultset) methods. @@ -300,14 +192,7 @@ class DatabaseWorkerPool //! Enqueues a query in string format that will set the value of the QueryResultFuture return object as soon as the query is executed. //! The return value is then processed in ProcessQueryCallback methods. - QueryResultFuture AsyncQuery(const char* sql) - { - BasicStatementTask* task = new BasicStatementTask(sql, true); - // Store future result before enqueueing - task might get already processed and deleted before returning from this method - QueryResultFuture result = task->GetFuture(); - Enqueue(task); - return result; - } + QueryResultFuture AsyncQuery(const char* sql); //! Enqueues a query in string format -with variable args- that will set the value of the QueryResultFuture return object as soon as the query is executed. //! The return value is then processed in ProcessQueryCallback methods. @@ -320,27 +205,13 @@ class DatabaseWorkerPool //! Enqueues a query in prepared format that will set the value of the PreparedQueryResultFuture return object as soon as the query is executed. //! The return value is then processed in ProcessQueryCallback methods. //! Statement must be prepared with CONNECTION_ASYNC flag. - PreparedQueryResultFuture AsyncQuery(PreparedStatement* stmt) - { - PreparedStatementTask* task = new PreparedStatementTask(stmt, true); - // Store future result before enqueueing - task might get already processed and deleted before returning from this method - PreparedQueryResultFuture result = task->GetFuture(); - Enqueue(task); - return result; - } + PreparedQueryResultFuture AsyncQuery(PreparedStatement* stmt); //! Enqueues a vector of SQL operations (can be both adhoc and prepared) that will set the value of the QueryResultHolderFuture //! return object as soon as the query is executed. //! The return value is then processed in ProcessQueryCallback methods. //! Any prepared statements added to this holder need to be prepared with the CONNECTION_ASYNC flag. - QueryResultHolderFuture DelayQueryHolder(SQLQueryHolder* holder) - { - SQLQueryHolderTask* task = new SQLQueryHolderTask(holder); - // Store future result before enqueueing - task might get already processed and deleted before returning from this method - QueryResultHolderFuture result = task->GetFuture(); - Enqueue(task); - return result; - } + QueryResultHolderFuture DelayQueryHolder(SQLQueryHolder* holder); /** Transaction context methods. @@ -354,57 +225,11 @@ class DatabaseWorkerPool //! Enqueues a collection of one-way SQL operations (can be both adhoc and prepared). The order in which these operations //! were appended to the transaction will be respected during execution. - void CommitTransaction(SQLTransaction transaction) - { - #ifdef TRINITY_DEBUG - //! Only analyze transaction weaknesses in Debug mode. - //! Ideally we catch the faults in Debug mode and then correct them, - //! so there's no need to waste these CPU cycles in Release mode. - switch (transaction->GetSize()) - { - case 0: - TC_LOG_DEBUG("sql.driver", "Transaction contains 0 queries. Not executing."); - return; - case 1: - TC_LOG_DEBUG("sql.driver", "Warning: Transaction only holds 1 query, consider removing Transaction context in code."); - break; - default: - break; - } - #endif // TRINITY_DEBUG - - Enqueue(new TransactionTask(transaction)); - } + void CommitTransaction(SQLTransaction transaction); //! Directly executes a collection of one-way SQL operations (can be both adhoc and prepared). The order in which these operations //! were appended to the transaction will be respected during execution. - void DirectCommitTransaction(SQLTransaction& transaction) - { - T* con = GetFreeConnection(); - int errorCode = con->ExecuteTransaction(transaction); - if (!errorCode) - { - con->Unlock(); // OK, operation succesful - return; - } - - //! Handle MySQL Errno 1213 without extending deadlock to the core itself - /// @todo More elegant way - if (errorCode == ER_LOCK_DEADLOCK) - { - uint8 loopBreaker = 5; - for (uint8 i = 0; i < loopBreaker; ++i) - { - if (!con->ExecuteTransaction(transaction)) - break; - } - } - - //! Clean up now. - transaction->Cleanup(); - - con->Unlock(); - } + void DirectCommitTransaction(SQLTransaction& transaction); //! Method used to execute prepared statements in a diverse context. //! Will be wrapped in a transaction if valid object is present, otherwise executed standalone. @@ -441,90 +266,21 @@ class DatabaseWorkerPool } //! Apply escape string'ing for current collation. (utf8) - void EscapeString(std::string& str) - { - if (str.empty()) - return; - - char* buf = new char[str.size() * 2 + 1]; - EscapeString(buf, str.c_str(), str.size()); - str = buf; - delete[] buf; - } + void EscapeString(std::string& str); //! Keeps all our MySQL connections alive, prevent the server from disconnecting us. - void KeepAlive() - { - //! Ping synchronous connections - for (uint8 i = 0; i < _connectionCount[IDX_SYNCH]; ++i) - { - T* t = _connections[IDX_SYNCH][i]; - if (t->LockIfReady()) - { - t->Ping(); - t->Unlock(); - } - } - - //! Assuming all worker threads are free, every worker thread will receive 1 ping operation request - //! If one or more worker threads are busy, the ping operations will not be split evenly, but this doesn't matter - //! as the sole purpose is to prevent connections from idling. - for (size_t i = 0; i < _connections[IDX_ASYNC].size(); ++i) - Enqueue(new PingOperation); - } + void KeepAlive(); private: - uint32 OpenConnections(InternalIndex type, uint8 numConnections) - { - _connections[type].resize(numConnections); - for (uint8 i = 0; i < numConnections; ++i) - { - T* t; - - if (type == IDX_ASYNC) - t = new T(_queue.get(), *_connectionInfo); - else if (type == IDX_SYNCH) - t = new T(*_connectionInfo); - else - ABORT(); - - _connections[type][i] = t; - ++_connectionCount[type]; - - uint32 error = t->Open(); - - if (!error) - { - if (mysql_get_server_version(t->GetHandle()) < MIN_MYSQL_SERVER_VERSION) - { - TC_LOG_ERROR("sql.driver", "TrinityCore does not support MySQL versions below 5.1"); - error = 1; - } - } - - // Failed to open a connection or invalid version, abort and cleanup - if (error) - { - while (_connectionCount[type] != 0) - { - t = _connections[type][i--]; - delete t; - --_connectionCount[type]; - } - return error; - } - } - - // Everything is fine - return 0; - } + uint32 OpenConnections(InternalIndex type, uint8 numConnections); unsigned long EscapeString(char *to, const char *from, unsigned long length) { if (!to || !from || !length) return 0; - return mysql_real_escape_string(_connections[IDX_SYNCH][0]->GetHandle(), to, from, length); + return mysql_real_escape_string( + _connections[IDX_SYNCH].front()->GetHandle(), to, from, length); } void Enqueue(SQLOperation* op) @@ -534,22 +290,7 @@ class DatabaseWorkerPool //! Gets a free connection in the synchronous connection pool. //! Caller MUST call t->Unlock() after touching the MySQL context to prevent deadlocks. - T* GetFreeConnection() - { - uint8 i = 0; - size_t num_cons = _connectionCount[IDX_SYNCH]; - T* t = NULL; - //! Block forever until a connection is free - for (;;) - { - t = _connections[IDX_SYNCH][++i % num_cons]; - //! Must be matched with t->Unlock() or you will get deadlocks - if (t->LockIfReady()) - break; - } - - return t; - } + T* GetFreeConnection(); char const* GetDatabaseName() const { @@ -558,9 +299,7 @@ class DatabaseWorkerPool //! Queue shared by async worker threads. std::unique_ptr<ProducerConsumerQueue<SQLOperation*>> _queue; - std::vector<std::vector<T*>> _connections; - //! Counter of MySQL connections; - uint32 _connectionCount[IDX_SIZE]; + std::array<std::vector<std::unique_ptr<T>>, IDX_SIZE> _connections; std::unique_ptr<MySQLConnectionInfo> _connectionInfo; uint8 _async_threads, _synch_threads; }; diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index ab68aca2a8c..ce01b0eb245 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -42,11 +42,11 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_SEL_MAIL_LIST_INFO, "SELECT id, sender, (SELECT name FROM characters WHERE guid = sender) AS sendername, receiver, (SELECT name FROM characters WHERE guid = receiver) AS receivername, " "subject, deliver_time, expire_time, money, has_items FROM mail WHERE receiver = ? ", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_MAIL_LIST_ITEMS, "SELECT itemEntry,count FROM item_instance WHERE guid = ?", CONNECTION_SYNCH); - PrepareStatement(CHAR_SEL_ENUM, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.playerBytes, c.playerBytes2, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " + PrepareStatement(CHAR_SEL_ENUM, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid " "FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? LEFT JOIN guild_member AS gm ON c.guid = gm.guid " "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? AND c.deleteInfos_Name IS NULL ORDER BY c.guid", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_ENUM_DECLINED_NAME, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.playerBytes, c.playerBytes2, c.level, c.zone, c.map, " + PrepareStatement(CHAR_SEL_ENUM_DECLINED_NAME, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.level, c.zone, c.map, " "c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, " "cb.guid, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? " "LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid LEFT JOIN guild_member AS gm ON c.guid = gm.guid " @@ -64,7 +64,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_BATTLEGROUND_RANDOM, "DELETE FROM character_battleground_random WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_BATTLEGROUND_RANDOM, "INSERT INTO character_battleground_random (guid) VALUES (?)", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_CHARACTER, "SELECT guid, account, name, race, class, gender, level, xp, money, playerBytes, playerBytes2, playerFlags, " + PrepareStatement(CHAR_SEL_CHARACTER, "SELECT guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, bankSlots, restState, playerFlags, " "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, " @@ -351,7 +351,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_LFG_DATA, "DELETE FROM lfg_data WHERE guid = ?", CONNECTION_ASYNC); // Player saving - PrepareStatement(CHAR_INS_CHARACTER, "INSERT INTO characters (guid, account, name, race, class, gender, level, xp, money, playerBytes, playerBytes2, playerFlags, " + PrepareStatement(CHAR_INS_CHARACTER, "INSERT INTO characters (guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, bankSlots, restState, 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, " @@ -359,8 +359,8 @@ void CharacterDatabaseConnection::DoPrepareStatements() "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, 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=?," + "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_UPD_CHARACTER, "UPDATE characters SET name=?,race=?,class=?,gender=?,level=?,xp=?,money=?,skin=?,face=?,hairStyle=?,hairColor=?,facialStyle=?,bankSlots=?,restState=?,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=?," @@ -407,7 +407,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_CHAR_INSTANCE_BY_INSTANCE_GUID, "DELETE FROM character_instance WHERE guid = ? AND instance = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_CHAR_INSTANCE, "UPDATE character_instance SET instance = ?, permanent = ?, extendState = ? WHERE guid = ? AND instance = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_CHAR_INSTANCE, "INSERT INTO character_instance (guid, instance, permanent, extendState) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); - PrepareStatement(CHAR_UPD_GENDER_PLAYERBYTES, "UPDATE characters SET gender = ?, playerBytes = ?, playerBytes2 = ? WHERE guid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_UPD_GENDER_AND_APPEARANCE, "UPDATE characters SET gender = ?, skin = ?, face = ?, hairStyle = ?, hairColor = ?, facialStyle = ? WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHARACTER_SKILL, "DELETE FROM character_skills WHERE guid = ? AND skill = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_ADD_CHARACTER_SOCIAL_FLAGS, "UPDATE character_social SET flags = flags | ? WHERE guid = ? AND friend = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_REM_CHARACTER_SOCIAL_FLAGS, "UPDATE character_social SET flags = flags & ~ ? WHERE guid = ? AND friend = ?", CONNECTION_ASYNC); @@ -440,7 +440,6 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_SEL_CHAR_OLD_CHARS, "SELECT guid, deleteInfos_Account FROM characters WHERE deleteDate IS NOT NULL AND deleteDate < ?", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_ARENA_TEAM_ID_BY_PLAYER_GUID, "SELECT arena_team_member.arenateamid FROM arena_team_member JOIN arena_team ON arena_team_member.arenateamid = arena_team.arenateamid WHERE guid = ? AND type = ? LIMIT 1", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_MAIL, "SELECT id, messageType, sender, receiver, subject, body, has_items, expire_time, deliver_time, money, cod, checked, stationery, mailTemplateId FROM mail WHERE receiver = ? ORDER BY id DESC", CONNECTION_SYNCH); - PrepareStatement(CHAR_SEL_CHAR_PLAYERBYTES2, "SELECT playerBytes2 FROM characters WHERE guid = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_CHAR_GUID_BY_NAME, "SELECT guid FROM characters WHERE name = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_DEL_CHAR_AURA_FROZEN, "DELETE FROM character_aura WHERE spell = 9454 AND guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHAR_INVENTORY_COUNT_ITEM, "SELECT COUNT(itemEntry) FROM character_inventory ci INNER JOIN item_instance ii ON ii.guid = ci.item WHERE itemEntry = ?", CONNECTION_SYNCH); diff --git a/src/server/database/Database/Implementation/CharacterDatabase.h b/src/server/database/Database/Implementation/CharacterDatabase.h index 19d4a609e77..e1c0238efe6 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.h +++ b/src/server/database/Database/Implementation/CharacterDatabase.h @@ -334,7 +334,7 @@ enum CharacterDatabaseStatements CHAR_DEL_CHAR_INSTANCE_BY_INSTANCE_GUID, CHAR_UPD_CHAR_INSTANCE, CHAR_INS_CHAR_INSTANCE, - CHAR_UPD_GENDER_PLAYERBYTES, + CHAR_UPD_GENDER_AND_APPEARANCE, CHAR_DEL_CHARACTER_SKILL, CHAR_UPD_ADD_CHARACTER_SOCIAL_FLAGS, CHAR_UPD_REM_CHARACTER_SOCIAL_FLAGS, @@ -371,7 +371,6 @@ enum CharacterDatabaseStatements CHAR_SEL_CHAR_OLD_CHARS, CHAR_SEL_ARENA_TEAM_ID_BY_PLAYER_GUID, CHAR_SEL_MAIL, - CHAR_SEL_CHAR_PLAYERBYTES2, CHAR_SEL_CHAR_GUID_BY_NAME, CHAR_DEL_CHAR_AURA_FROZEN, CHAR_SEL_CHAR_INVENTORY_COUNT_ITEM, diff --git a/src/server/database/Database/Implementation/LoginDatabase.cpp b/src/server/database/Database/Implementation/LoginDatabase.cpp index 2749c08594f..4f056e2686d 100644 --- a/src/server/database/Database/Implementation/LoginDatabase.cpp +++ b/src/server/database/Database/Implementation/LoginDatabase.cpp @@ -37,7 +37,7 @@ void LoginDatabaseConnection::DoPrepareStatements() PrepareStatement(LOGIN_DEL_ACCOUNT_BANNED, "DELETE FROM account_banned WHERE id = ?", CONNECTION_ASYNC); PrepareStatement(LOGIN_UPD_VS, "UPDATE account SET v = ?, s = ? WHERE username = ?", CONNECTION_ASYNC); PrepareStatement(LOGIN_UPD_LOGONPROOF, "UPDATE account SET sessionkey = ?, last_ip = ?, last_login = NOW(), locale = ?, failed_logins = 0, os = ? WHERE username = ?", CONNECTION_SYNCH); - PrepareStatement(LOGIN_SEL_LOGONCHALLENGE, "SELECT a.id, UPPER(a.username), a.locked, a.lock_country, a.last_ip, a.failed_logins, ab.unbandate > UNIX_TIMESTAMP() OR ab.unbandate = ab.bandate, " + PrepareStatement(LOGIN_SEL_LOGONCHALLENGE, "SELECT a.id, a.username, a.locked, a.lock_country, a.last_ip, a.failed_logins, ab.unbandate > UNIX_TIMESTAMP() OR ab.unbandate = ab.bandate, " "ab.unbandate = ab.bandate, aa.gmlevel, a.token_key, a.sha_pass_hash, a.v, a.s " "FROM account a LEFT JOIN account_access aa ON a.id = aa.id LEFT JOIN account_banned ab ON ab.id = a.id AND ab.active = 1 WHERE a.username = ?", CONNECTION_ASYNC); PrepareStatement(LOGIN_SEL_RECONNECTCHALLENGE, "SELECT a.id, UPPER(a.username), a.locked, a.lock_country, a.last_ip, a.failed_logins, ab.unbandate > UNIX_TIMESTAMP() OR ab.unbandate = ab.bandate, " diff --git a/src/server/database/Database/MySQLConnection.cpp b/src/server/database/Database/MySQLConnection.cpp index 41dd61d3c3a..93d2a35f310 100644 --- a/src/server/database/Database/MySQLConnection.cpp +++ b/src/server/database/Database/MySQLConnection.cpp @@ -37,7 +37,6 @@ MySQLConnection::MySQLConnection(MySQLConnectionInfo& connInfo) : m_reconnecting(false), m_prepareError(false), m_queue(NULL), -m_worker(NULL), m_Mysql(NULL), m_connectionInfo(connInfo), m_connectionFlags(CONNECTION_SYNCH) { } @@ -50,24 +49,26 @@ m_Mysql(NULL), m_connectionInfo(connInfo), m_connectionFlags(CONNECTION_ASYNC) { - m_worker = new DatabaseWorker(m_queue, this); + m_worker = Trinity::make_unique<DatabaseWorker>(m_queue, this); } MySQLConnection::~MySQLConnection() { - delete m_worker; - - for (size_t i = 0; i < m_stmts.size(); ++i) - delete m_stmts[i]; - - if (m_Mysql) - mysql_close(m_Mysql); + Close(); } void MySQLConnection::Close() { - /// Only close us if we're not operating - delete this; + // Stop the worker thread before the statements are cleared + m_worker.reset(); + + m_stmts.clear(); + + if (m_Mysql) + { + mysql_close(m_Mysql); + m_Mysql = nullptr; + } } uint32 MySQLConnection::Open() @@ -412,7 +413,7 @@ int MySQLConnection::ExecuteTransaction(SQLTransaction& transaction) MySQLPreparedStatement* MySQLConnection::GetPreparedStatement(uint32 index) { ASSERT(index < m_stmts.size()); - MySQLPreparedStatement* ret = m_stmts[index]; + MySQLPreparedStatement* ret = m_stmts[index].get(); if (!ret) TC_LOG_ERROR("sql.sql", "Could not fetch prepared statement %u on database `%s`, connection type: %s.", index, m_connectionInfo.database.c_str(), (m_connectionFlags & CONNECTION_ASYNC) ? "asynchronous" : "synchronous"); @@ -424,16 +425,12 @@ void MySQLConnection::PrepareStatement(uint32 index, const char* sql, Connection { m_queries.insert(PreparedStatementMap::value_type(index, std::make_pair(sql, flags))); - // For reconnection case - if (m_reconnecting) - delete m_stmts[index]; - // Check if specified query should be prepared on this connection // i.e. don't prepare async statements on synchronous connections // to save memory that will not be used. if (!(m_connectionFlags & flags)) { - m_stmts[index] = NULL; + m_stmts[index].reset(); return; } @@ -455,8 +452,7 @@ void MySQLConnection::PrepareStatement(uint32 index, const char* sql, Connection } else { - MySQLPreparedStatement* mStmt = new MySQLPreparedStatement(stmt); - m_stmts[index] = mStmt; + m_stmts[index] = Trinity::make_unique<MySQLPreparedStatement>(stmt); } } } @@ -477,7 +473,7 @@ PreparedResultSet* MySQLConnection::Query(PreparedStatement* stmt) return new PreparedResultSet(stmt->m_stmt->GetSTMT(), result, rowCount, fieldCount); } -bool MySQLConnection::_HandleMySQLErrno(uint32 errNo) +bool MySQLConnection::_HandleMySQLErrno(uint32 errNo, uint8 attempts /*= 5*/) { switch (errNo) { @@ -486,9 +482,21 @@ bool MySQLConnection::_HandleMySQLErrno(uint32 errNo) case CR_INVALID_CONN_HANDLE: case CR_SERVER_LOST_EXTENDED: { + if (m_Mysql) + { + TC_LOG_ERROR("sql.sql", "Lost the connection to the MySQL server!"); + + mysql_close(GetHandle()); + m_Mysql = nullptr; + } + + /*no break*/ + } + case CR_CONN_HOST_ERROR: + { + TC_LOG_INFO("sql.sql", "Attempting to reconnect to the MySQL server..."); + m_reconnecting = true; - uint64 oldThreadId = mysql_thread_id(GetHandle()); - mysql_close(GetHandle()); uint32 const lErrno = Open(); if (!lErrno) @@ -496,24 +504,37 @@ bool MySQLConnection::_HandleMySQLErrno(uint32 errNo) // Don't remove 'this' pointer unless you want to skip loading all prepared statements... if (!this->PrepareStatements()) { - TC_LOG_ERROR("sql.sql", "Could not re-prepare statements!"); - Close(); - return false; + TC_LOG_FATAL("sql.sql", "Could not re-prepare statements!"); + std::this_thread::sleep_for(std::chrono::seconds(10)); + std::abort(); } - TC_LOG_INFO("sql.sql", "Connection to the MySQL server is active."); - if (oldThreadId != mysql_thread_id(GetHandle())) - TC_LOG_INFO("sql.sql", "Successfully reconnected to %s @%s:%s (%s).", - m_connectionInfo.database.c_str(), m_connectionInfo.host.c_str(), m_connectionInfo.port_or_socket.c_str(), - (m_connectionFlags & CONNECTION_ASYNC) ? "asynchronous" : "synchronous"); + TC_LOG_INFO("sql.sql", "Successfully reconnected to %s @%s:%s (%s).", + m_connectionInfo.database.c_str(), m_connectionInfo.host.c_str(), m_connectionInfo.port_or_socket.c_str(), + (m_connectionFlags & CONNECTION_ASYNC) ? "asynchronous" : "synchronous"); m_reconnecting = false; return true; } - // It's possible this attempted reconnect throws 2006 at us. To prevent crazy recursive calls, sleep here. - std::this_thread::sleep_for(std::chrono::seconds(3)); // Sleep 3 seconds - return _HandleMySQLErrno(lErrno); // Call self (recursive) + if ((--attempts) == 0) + { + // Shut down the server when the mysql server isn't + // reachable for some time + TC_LOG_FATAL("sql.sql", "Failed to reconnect to the MySQL server, " + "terminating the server to prevent data corruption!"); + + // We could also initiate a shutdown through using std::raise(SIGTERM) + std::this_thread::sleep_for(std::chrono::seconds(10)); + std::abort(); + } + else + { + // It's possible this attempted reconnect throws 2006 at us. + // To prevent crazy recursive calls, sleep here. + std::this_thread::sleep_for(std::chrono::seconds(3)); // Sleep 3 seconds + return _HandleMySQLErrno(lErrno, attempts); // Call self (recursive) + } } case ER_LOCK_DEADLOCK: diff --git a/src/server/database/Database/MySQLConnection.h b/src/server/database/Database/MySQLConnection.h index a981caa607e..a0b908593df 100644 --- a/src/server/database/Database/MySQLConnection.h +++ b/src/server/database/Database/MySQLConnection.h @@ -116,18 +116,18 @@ class MySQLConnection virtual void DoPrepareStatements() = 0; protected: - std::vector<MySQLPreparedStatement*> m_stmts; //! PreparedStatements storage + std::vector<std::unique_ptr<MySQLPreparedStatement>> m_stmts; //! PreparedStatements storage PreparedStatementMap m_queries; //! Query storage bool m_reconnecting; //! Are we reconnecting? bool m_prepareError; //! Was there any error while preparing statements? private: - bool _HandleMySQLErrno(uint32 errNo); + bool _HandleMySQLErrno(uint32 errNo, uint8 attempts = 5); private: ProducerConsumerQueue<SQLOperation*>* m_queue; //! Queue shared with other asynchronous connections. - DatabaseWorker* m_worker; //! Core worker task. - MYSQL * m_Mysql; //! MySQL Handle. + std::unique_ptr<DatabaseWorker> m_worker; //! Core worker task. + MYSQL* m_Mysql; //! MySQL Handle. MySQLConnectionInfo& m_connectionInfo; //! Connection info (used for logging) ConnectionFlags m_connectionFlags; //! Connection flags (for preparing relevant statements) std::mutex m_Mutex; diff --git a/src/server/database/Updater/DBUpdater.cpp b/src/server/database/Updater/DBUpdater.cpp index 170954a86f4..b18d6c67612 100644 --- a/src/server/database/Updater/DBUpdater.cpp +++ b/src/server/database/Updater/DBUpdater.cpp @@ -21,6 +21,7 @@ #include "UpdateFetcher.h" #include "DatabaseLoader.h" #include "Config.h" +#include "BuiltInConfig.h" #include <fstream> #include <iostream> @@ -35,23 +36,17 @@ using namespace boost::process; using namespace boost::process::initializers; using namespace boost::iostreams; -std::string DBUpdaterUtil::GetMySqlCli() +std::string DBUpdaterUtil::GetCorrectedMySQLExecutable() { if (!corrected_path().empty()) return corrected_path(); else - { - std::string const entry = sConfigMgr->GetStringDefault("Updates.MySqlCLIPath", ""); - if (!entry.empty()) - return entry; - else - return GitRevision::GetMySQLExecutable(); - } + return BuiltInConfig::GetMySQLExecutable(); } bool DBUpdaterUtil::CheckExecutable() { - boost::filesystem::path exe(GetMySqlCli()); + boost::filesystem::path exe(GetCorrectedMySQLExecutable()); if (!exists(exe)) { exe.clear(); @@ -85,16 +80,6 @@ std::string& DBUpdaterUtil::corrected_path() return path; } -template<class T> -std::string DBUpdater<T>::GetSourceDirectory() -{ - std::string const entry = sConfigMgr->GetStringDefault("Updates.SourcePath", ""); - if (!entry.empty()) - return entry; - else - return GitRevision::GetSourceDirectory(); -} - // Auth Database template<> std::string DBUpdater<LoginDatabaseConnection>::GetConfigEntry() @@ -111,7 +96,8 @@ std::string DBUpdater<LoginDatabaseConnection>::GetTableName() template<> std::string DBUpdater<LoginDatabaseConnection>::GetBaseFile() { - return DBUpdater<LoginDatabaseConnection>::GetSourceDirectory() + "/sql/base/auth_database.sql"; + return BuiltInConfig::GetSourceDirectory() + + "/sql/base/auth_database.sql"; } template<> @@ -169,7 +155,8 @@ std::string DBUpdater<CharacterDatabaseConnection>::GetTableName() template<> std::string DBUpdater<CharacterDatabaseConnection>::GetBaseFile() { - return DBUpdater<CharacterDatabaseConnection>::GetSourceDirectory() + "/sql/base/characters_database.sql"; + return BuiltInConfig::GetSourceDirectory() + + "/sql/base/characters_database.sql"; } template<> @@ -239,7 +226,7 @@ bool DBUpdater<T>::Update(DatabaseWorkerPool<T>& pool) TC_LOG_INFO("sql.updates", "Updating %s database...", DBUpdater<T>::GetTableName().c_str()); - Path const sourceDirectory(GetSourceDirectory()); + Path const sourceDirectory(BuiltInConfig::GetSourceDirectory()); if (!is_directory(sourceDirectory)) { @@ -410,7 +397,7 @@ void DBUpdater<T>::ApplyFile(DatabaseWorkerPool<T>& pool, std::string const& hos boost::process::pipe errPipe = create_pipe(); child c = execute(run_exe( - boost::filesystem::absolute(DBUpdaterUtil::GetMySqlCli()).generic_string()), + boost::filesystem::absolute(DBUpdaterUtil::GetCorrectedMySQLExecutable()).generic_string()), set_args(args), bind_stdin(source), throw_on_error(), bind_stdout(file_descriptor_sink(outPipe.sink, close_handle)), bind_stderr(file_descriptor_sink(errPipe.sink, close_handle))); diff --git a/src/server/database/Updater/DBUpdater.h b/src/server/database/Updater/DBUpdater.h index c9792ffe060..dbb897d2527 100644 --- a/src/server/database/Updater/DBUpdater.h +++ b/src/server/database/Updater/DBUpdater.h @@ -57,7 +57,7 @@ struct UpdateResult class DBUpdaterUtil { public: - static std::string GetMySqlCli(); + static std::string GetCorrectedMySQLExecutable(); static bool CheckExecutable(); @@ -71,8 +71,6 @@ class DBUpdater public: using Path = boost::filesystem::path; - static std::string GetSourceDirectory(); - static inline std::string GetConfigEntry(); static inline std::string GetTableName(); diff --git a/src/server/database/Updater/UpdateFetcher.cpp b/src/server/database/Updater/UpdateFetcher.cpp index fd0dbdd4b5a..2d60cdb92ef 100644 --- a/src/server/database/Updater/UpdateFetcher.cpp +++ b/src/server/database/Updater/UpdateFetcher.cpp @@ -137,24 +137,33 @@ UpdateFetcher::AppliedFileStorage UpdateFetcher::ReceiveAppliedFiles() const return map; } -UpdateFetcher::SQLUpdate UpdateFetcher::ReadSQLUpdate(boost::filesystem::path const& file) const +std::string UpdateFetcher::ReadSQLUpdate(boost::filesystem::path const& file) const { std::ifstream in(file.c_str()); - WPFatal(in.is_open(), "Could not read an update file."); + if (!in.is_open()) + { + TC_LOG_FATAL("sql.updates", "Failed to open the sql update \"%s\" for reading! " + "Stopping the server to keep the database integrity, " + "try to identify and solve the issue or disabled the database updater.", + file.generic_string().c_str()); - auto const start_pos = in.tellg(); - in.ignore(std::numeric_limits<std::streamsize>::max()); - auto const char_count = in.gcount(); - in.seekg(start_pos); + throw UpdateException("Opening the sql update failed!"); + } - SQLUpdate const update(new std::string(char_count, char{})); + auto update = [&in] { + std::ostringstream ss; + ss << in.rdbuf(); + return ss.str(); + }(); - in.read(&(*update)[0], update->size()); in.close(); return update; } -UpdateResult UpdateFetcher::Update(bool const redundancyChecks, bool const allowRehash, bool const archivedRedundancy, int32 const cleanDeadReferencesMaxCount) const +UpdateResult UpdateFetcher::Update(bool const redundancyChecks, + bool const allowRehash, + bool const archivedRedundancy, + int32 const cleanDeadReferencesMaxCount) const { LocaleFileStorage const available = GetFileList(); AppliedFileStorage applied = ReceiveAppliedFiles(); @@ -200,11 +209,9 @@ UpdateResult UpdateFetcher::Update(bool const redundancyChecks, bool const allow } } - // Read update from file - SQLUpdate const update = ReadSQLUpdate(availableQuery.first); - // Calculate hash - std::string const hash = CalculateHash(update); + std::string const hash = + CalculateHash(ReadSQLUpdate(availableQuery.first)); UpdateMode mode = MODE_APPLY; @@ -327,11 +334,11 @@ UpdateResult UpdateFetcher::Update(bool const redundancyChecks, bool const allow return UpdateResult(importedUpdates, countRecentUpdates, countArchivedUpdates); } -std::string UpdateFetcher::CalculateHash(SQLUpdate const& query) const +std::string UpdateFetcher::CalculateHash(std::string const& query) const { // Calculate a Sha1 hash based on query content. unsigned char digest[SHA_DIGEST_LENGTH]; - SHA1((unsigned char*)query->c_str(), query->length(), (unsigned char*)&digest); + SHA1((unsigned char*)query.c_str(), query.length(), (unsigned char*)&digest); return ByteArrayToHexStr(digest, SHA_DIGEST_LENGTH); } diff --git a/src/server/database/Updater/UpdateFetcher.h b/src/server/database/Updater/UpdateFetcher.h index 22a0d08c7f8..c87efea2b02 100644 --- a/src/server/database/Updater/UpdateFetcher.h +++ b/src/server/database/Updater/UpdateFetcher.h @@ -103,16 +103,16 @@ private: typedef std::unordered_map<std::string, std::string> HashToFileNameStorage; typedef std::unordered_map<std::string, AppliedFileEntry> AppliedFileStorage; typedef std::vector<UpdateFetcher::DirectoryEntry> DirectoryStorage; - typedef std::shared_ptr<std::string> SQLUpdate; LocaleFileStorage GetFileList() const; - void FillFileListRecursively(Path const& path, LocaleFileStorage& storage, State const state, uint32 const depth) const; + void FillFileListRecursively(Path const& path, LocaleFileStorage& storage, + State const state, uint32 const depth) const; DirectoryStorage ReceiveIncludedDirectories() const; AppliedFileStorage ReceiveAppliedFiles() const; - SQLUpdate ReadSQLUpdate(Path const& file) const; - std::string CalculateHash(SQLUpdate const& query) const; + std::string ReadSQLUpdate(Path const& file) const; + std::string CalculateHash(std::string const& query) const; uint32 Apply(Path const& path) const; diff --git a/src/server/game/AI/CoreAI/PetAI.cpp b/src/server/game/AI/CoreAI/PetAI.cpp index 8acf6b9c9dc..66b1253069c 100644 --- a/src/server/game/AI/CoreAI/PetAI.cpp +++ b/src/server/game/AI/CoreAI/PetAI.cpp @@ -150,14 +150,14 @@ void PetAI::UpdateAI(uint32 diff) if (me->GetCharmInfo() && me->GetSpellHistory()->HasGlobalCooldown(spellInfo)) continue; + // check spell cooldown + if (!me->GetSpellHistory()->IsReady(spellInfo)) + continue; + if (spellInfo->IsPositive()) { if (spellInfo->CanBeUsedInCombat()) { - // check spell cooldown & school lock - if (!me->GetSpellHistory()->IsReady(spellInfo)) - continue; - // Check if we're in combat or commanded to attack if (!me->IsInCombat() && !me->GetCharmInfo()->IsCommandAttack()) continue; diff --git a/src/server/game/AI/CoreAI/UnitAI.cpp b/src/server/game/AI/CoreAI/UnitAI.cpp index a3a5e7f7663..844bd45ffeb 100644 --- a/src/server/game/AI/CoreAI/UnitAI.cpp +++ b/src/server/game/AI/CoreAI/UnitAI.cpp @@ -259,36 +259,6 @@ void UnitAI::FillAISpellInfo() } } -//Enable PlayerAI when charmed -void PlayerAI::OnCharmed(bool apply) -{ - me->IsAIEnabled = apply; -} - -void SimpleCharmedAI::UpdateAI(const uint32 /*diff*/) -{ - Creature* charmer = me->GetCharmer()->ToCreature(); - - //kill self if charm aura has infinite duration - if (charmer->IsInEvadeMode()) - { - Unit::AuraEffectList const& auras = me->GetAuraEffectsByType(SPELL_AURA_MOD_CHARM); - for (Unit::AuraEffectList::const_iterator iter = auras.begin(); iter != auras.end(); ++iter) - if ((*iter)->GetCasterGUID() == charmer->GetGUID() && (*iter)->GetBase()->IsPermanent()) - { - charmer->Kill(me); - return; - } - } - - if (!charmer->IsInCombat()) - me->GetMotionMaster()->MoveFollow(charmer, PET_FOLLOW_DIST, me->GetFollowAngle()); - - Unit* target = me->GetVictim(); - if (!target || !charmer->IsValidAttackTarget(target)) - AttackStart(charmer->SelectNearestTargetInAttackDistance()); -} - SpellTargetSelector::SpellTargetSelector(Unit* caster, uint32 spellId) : _caster(caster), _spellInfo(sSpellMgr->GetSpellForDifficultyFromSpell(sSpellMgr->GetSpellInfo(spellId), caster)) { @@ -340,5 +310,8 @@ bool NonTankTargetSelector::operator()(Unit const* target) const if (_playerOnly && target->GetTypeId() != TYPEID_PLAYER) return false; + if (HostileReference* currentVictim = _source->getThreatManager().getCurrentVictim()) + return target->GetGUID() != currentVictim->getUnitGuid(); + return target != _source->GetVictim(); } diff --git a/src/server/game/AI/CoreAI/UnitAI.h b/src/server/game/AI/CoreAI/UnitAI.h index 5dc5946b226..f5a0066a5e3 100644 --- a/src/server/game/AI/CoreAI/UnitAI.h +++ b/src/server/game/AI/CoreAI/UnitAI.h @@ -107,11 +107,11 @@ struct SpellTargetSelector : public std::unary_function<Unit*, bool> struct NonTankTargetSelector : public std::unary_function<Unit*, bool> { public: - NonTankTargetSelector(Creature* source, bool playerOnly = true) : _source(source), _playerOnly(playerOnly) { } + NonTankTargetSelector(Unit* source, bool playerOnly = true) : _source(source), _playerOnly(playerOnly) { } bool operator()(Unit const* target) const; private: - Creature const* _source; + Unit* _source; bool _playerOnly; }; @@ -268,21 +268,4 @@ class UnitAI UnitAI& operator=(UnitAI const& right) = delete; }; -class PlayerAI : public UnitAI -{ - protected: - Player* const me; - public: - explicit PlayerAI(Player* player) : UnitAI((Unit*)player), me(player) { } - - void OnCharmed(bool apply) override; -}; - -class SimpleCharmedAI : public PlayerAI -{ - public: - void UpdateAI(uint32 diff) override; - SimpleCharmedAI(Player* player): PlayerAI(player) { } -}; - #endif diff --git a/src/server/game/AI/CreatureAI.h b/src/server/game/AI/CreatureAI.h index 239fda577a7..e009e2ed0b6 100644 --- a/src/server/game/AI/CreatureAI.h +++ b/src/server/game/AI/CreatureAI.h @@ -28,6 +28,7 @@ class WorldObject; class Unit; class Creature; class Player; +class PlayerAI; class SpellInfo; #define TIME_INTERVAL_LOOK 5000 @@ -186,6 +187,11 @@ class CreatureAI : public UnitAI virtual bool CanSeeAlways(WorldObject const* /*obj*/) { return false; } + // Called when a player is charmed by the creature + // If a PlayerAI* is returned, that AI is placed on the player instead of the default charm AI + // Object destruction is handled by Unit::RemoveCharmedBy + virtual PlayerAI* GetAIForCharmedPlayer(Player* /*who*/) { return nullptr; } + // intended for encounter design/debugging. do not use for other purposes. expensive. int32 VisualizeBoundary(uint32 duration, Unit* owner=nullptr, bool fill=false) const; virtual bool CheckInRoom(); diff --git a/src/server/game/AI/PlayerAI/PlayerAI.cpp b/src/server/game/AI/PlayerAI/PlayerAI.cpp new file mode 100644 index 00000000000..680ecfb9414 --- /dev/null +++ b/src/server/game/AI/PlayerAI/PlayerAI.cpp @@ -0,0 +1,226 @@ +/* + * Copyright (C) 2016-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "PlayerAI.h" +#include "SpellAuras.h" +#include "SpellAuraEffects.h" + +enum Spells +{ + /* Generic */ + SPELL_AUTO_SHOT = 75, + SPELL_SHOOT = 3018, + SPELL_THROW = 2764, + SPELL_SHOOT_WAND = 5019, + + /* Paladin */ + PASSIVE_ILLUMINATION = 20215, + + /* Priest */ + SPELL_SOUL_WARDING = 63574, + SPELL_SPIRIT_REDEMPTION = 20711, + SPELL_SHADOWFORM = 15473, + + /* Shaman */ + SPELL_TIDAL_FORCE = 582, + SPELL_MANA_TIDE_TOTEM = 590, + SPELL_SHA_NATURE_SWIFT = 591, + SPELL_STORMSTRIKE = 17364, + + /* Druid */ + SPELL_MOONKIN_FORM = 24858, + SPELL_SWIFTMEND = 18562, + SPELL_DRU_NATURE_SWIFT = 17116, + SPELL_TREE_OF_LIFE = 33891 +}; + +bool PlayerAI::IsPlayerHealer(Player const* who) +{ + switch (who->getClass()) + { + case CLASS_WARRIOR: + case CLASS_HUNTER: + case CLASS_ROGUE: + case CLASS_DEATH_KNIGHT: + case CLASS_MAGE: + case CLASS_WARLOCK: + default: + return false; + case CLASS_PALADIN: + return who->HasSpell(PASSIVE_ILLUMINATION); + case CLASS_PRIEST: + return who->HasSpell(SPELL_SOUL_WARDING) || who->HasSpell(SPELL_SPIRIT_REDEMPTION); + case CLASS_SHAMAN: + return who->HasSpell(SPELL_MANA_TIDE_TOTEM) || who->HasSpell(SPELL_SHA_NATURE_SWIFT) || who->HasSpell(SPELL_TIDAL_FORCE); + case CLASS_DRUID: + return who->HasSpell(SPELL_SWIFTMEND) || who->HasSpell(SPELL_DRU_NATURE_SWIFT) || who->HasSpell(SPELL_TREE_OF_LIFE); + } +} + +bool PlayerAI::IsPlayerRangedAttacker(Player const* who) +{ + switch (who->getClass()) + { + case CLASS_WARRIOR: + case CLASS_PALADIN: + case CLASS_ROGUE: + case CLASS_DEATH_KNIGHT: + default: + return false; + case CLASS_MAGE: + case CLASS_WARLOCK: + return true; + case CLASS_HUNTER: + { + // check if we have a ranged weapon equipped + Item const* rangedSlot = who->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_RANGED); + if (ItemTemplate const* rangedTemplate = rangedSlot ? rangedSlot->GetTemplate() : nullptr) + if ((1 << rangedTemplate->SubClass) & ITEM_SUBCLASS_MASK_WEAPON_RANGED) + return true; + return false; + } + case CLASS_PRIEST: + return who->HasSpell(SPELL_SHADOWFORM); + case CLASS_SHAMAN: + return !who->HasSpell(SPELL_STORMSTRIKE); + case CLASS_DRUID: + return who->HasSpell(SPELL_MOONKIN_FORM); + } +} + +void PlayerAI::DoRangedAttackIfReady() +{ + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + if (!me->isAttackReady(RANGED_ATTACK)) + return; + + Unit* victim = me->GetVictim(); + if (!victim) + return; + + uint32 rangedAttackSpell = 0; + + Item const* rangedItem = me->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_RANGED); + if (ItemTemplate const* rangedTemplate = rangedItem ? rangedItem->GetTemplate() : nullptr) + { + switch (rangedTemplate->SubClass) + { + case ITEM_SUBCLASS_WEAPON_BOW: + case ITEM_SUBCLASS_WEAPON_GUN: + case ITEM_SUBCLASS_WEAPON_CROSSBOW: + rangedAttackSpell = SPELL_SHOOT; + break; + case ITEM_SUBCLASS_WEAPON_THROWN: + rangedAttackSpell = SPELL_THROW; + break; + case ITEM_SUBCLASS_WEAPON_WAND: + rangedAttackSpell = SPELL_SHOOT_WAND; + break; + } + } + + if (!rangedAttackSpell) + return; + + me->CastSpell(victim, rangedAttackSpell, TRIGGERED_CAST_DIRECTLY); + me->resetAttackTimer(RANGED_ATTACK); +} + +void PlayerAI::DoAutoAttackIfReady() +{ + if (IsRangedAttacker()) + DoRangedAttackIfReady(); + else + DoMeleeAttackIfReady(); +} + +struct UncontrolledTargetSelectPredicate : public std::unary_function<Unit*, bool> +{ + bool operator()(Unit const* target) const + { + return !target->HasBreakableByDamageCrowdControlAura(); + } +}; +Unit* SimpleCharmedPlayerAI::SelectAttackTarget() const +{ + if (Unit* charmer = me->GetCharmer()) + return charmer->IsAIEnabled ? charmer->GetAI()->SelectTarget(SELECT_TARGET_RANDOM, 0, UncontrolledTargetSelectPredicate()) : charmer->GetVictim(); + return nullptr; +} + +void SimpleCharmedPlayerAI::UpdateAI(const uint32 /*diff*/) +{ + Creature* charmer = me->GetCharmer() ? me->GetCharmer()->ToCreature() : nullptr; + if (!charmer) + return; + + //kill self if charm aura has infinite duration + if (charmer->IsInEvadeMode()) + { + Player::AuraEffectList const& auras = me->GetAuraEffectsByType(SPELL_AURA_MOD_CHARM); + for (Player::AuraEffectList::const_iterator iter = auras.begin(); iter != auras.end(); ++iter) + if ((*iter)->GetCasterGUID() == charmer->GetGUID() && (*iter)->GetBase()->IsPermanent()) + { + me->Kill(me); + return; + } + } + + if (charmer->IsInCombat()) + { + Unit* target = me->GetVictim(); + if (!target || !charmer->IsValidAttackTarget(target) || target->HasBreakableByDamageCrowdControlAura()) + { + target = SelectAttackTarget(); + if (!target) + return; + + if (IsRangedAttacker()) + AttackStartCaster(target, 28.0f); + else + AttackStart(target); + } + DoAutoAttackIfReady(); + } + else + { + me->AttackStop(); + me->CastStop(); + me->StopMoving(); + me->GetMotionMaster()->Clear(); + me->GetMotionMaster()->MoveFollow(charmer, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); + } +} + +void SimpleCharmedPlayerAI::OnCharmed(bool apply) +{ + if (apply) + { + me->CastStop(); + me->AttackStop(); + } + else + { + me->CastStop(); + me->AttackStop(); + // @todo only voluntary movement (don't cancel stuff like death grip or charge mid-animation) + me->GetMotionMaster()->Clear(); + me->StopMoving(); + } +} diff --git a/src/server/game/AI/PlayerAI/PlayerAI.h b/src/server/game/AI/PlayerAI/PlayerAI.h new file mode 100644 index 00000000000..1820bcf11c0 --- /dev/null +++ b/src/server/game/AI/PlayerAI/PlayerAI.h @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2016-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef TRINITY_PLAYERAI_H +#define TRINITY_PLAYERAI_H + +#include "UnitAI.h" +#include "Player.h" +#include "Creature.h" + +class PlayerAI : public UnitAI +{ + public: + explicit PlayerAI(Player* player) : UnitAI(static_cast<Unit*>(player)), me(player), _isSelfHealer(PlayerAI::IsPlayerHealer(player)), _isSelfRangedAttacker(PlayerAI::IsPlayerRangedAttacker(player)) { } + + void OnCharmed(bool /*apply*/) override { } // charm AI application for players is handled by Unit::SetCharmedBy / Unit::RemoveCharmedBy + + // helper functions to determine player info + static bool IsPlayerHealer(Player const* who); + bool IsHealer(Player const* who = nullptr) const { return (!who || who == me) ? _isSelfHealer : IsPlayerHealer(who); } + static bool IsPlayerRangedAttacker(Player const* who); + bool IsRangedAttacker(Player const* who = nullptr) const { return (!who || who == me) ? _isSelfRangedAttacker : IsPlayerRangedAttacker(who); } + + protected: + Player* const me; + void SetIsRangedAttacker(bool state) { _isSelfRangedAttacker = state; } // this allows overriding of the default ranged attacker detection + + virtual Unit* SelectAttackTarget() const { return me->GetCharmer() ? me->GetCharmer()->GetVictim() : nullptr; } + void DoRangedAttackIfReady(); + void DoAutoAttackIfReady(); + + private: + bool _isSelfHealer; + bool _isSelfRangedAttacker; +}; + +class SimpleCharmedPlayerAI : public PlayerAI +{ + public: + SimpleCharmedPlayerAI(Player* player) : PlayerAI(player) { } + void UpdateAI(uint32 diff) override; + void OnCharmed(bool apply) override; + Unit* SelectAttackTarget() const override; +}; + +#endif diff --git a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp index 68cb8d346d0..fa80634e0f0 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp @@ -105,7 +105,7 @@ bool npc_escortAI::AssistPlayerInCombat(Unit* who) void npc_escortAI::MoveInLineOfSight(Unit* who) { - if (!me->HasUnitState(UNIT_STATE_STUNNED) && who->isTargetableForAttack() && who->isInAccessiblePlaceFor(me)) + if (me->HasReactState(REACT_AGGRESSIVE) && !me->HasUnitState(UNIT_STATE_STUNNED) && who->isTargetableForAttack() && who->isInAccessiblePlaceFor(me)) { if (HasEscortState(STATE_ESCORT_ESCORTING) && AssistPlayerInCombat(who)) return; diff --git a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp index dc9f6d2681e..778edf8cab5 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp @@ -102,7 +102,7 @@ bool FollowerAI::AssistPlayerInCombat(Unit* who) void FollowerAI::MoveInLineOfSight(Unit* who) { - if (!me->HasUnitState(UNIT_STATE_STUNNED) && who->isTargetableForAttack() && who->isInAccessiblePlaceFor(me)) + if (me->HasReactState(REACT_AGGRESSIVE) && !me->HasUnitState(UNIT_STATE_STUNNED) && who->isTargetableForAttack() && who->isInAccessiblePlaceFor(me)) { if (HasFollowState(STATE_FOLLOW_INPROGRESS) && AssistPlayerInCombat(who)) return; diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index eca327e770e..361bb1a5b1d 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -466,6 +466,9 @@ bool SmartAI::CanAIAttack(const Unit* /*who*/) const bool SmartAI::AssistPlayerInCombat(Unit* who) { + if (me->HasReactState(REACT_PASSIVE)) + return false; + if (!who || !who->GetVictim()) return false; diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index c08d1508774..859282891fb 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -2330,6 +2330,21 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u break; } } + case SMART_ACTION_SET_CORPSE_DELAY: + { + ObjectList* targets = GetTargets(e, unit); + if (!targets) + break; + + for (ObjectList::const_iterator itr = targets->begin(); itr != targets->end(); ++itr) + { + if (IsCreature(*itr)) + (*itr)->ToCreature()->SetCorpseDelay(e.action.corpseDelay.timer); + } + + delete targets; + break; + } default: TC_LOG_ERROR("sql.sql", "SmartScript::ProcessAction: Entry %d SourceType %u, Event %u, Unhandled Action type %u", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType()); break; diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index ef3357fa6ed..ba1738a523b 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -27,6 +27,12 @@ #include "SmartScriptMgr.h" +SmartWaypointMgr* SmartWaypointMgr::instance() +{ + static SmartWaypointMgr instance; + return &instance; +} + void SmartWaypointMgr::LoadFromDB() { uint32 oldMSTime = getMSTime(); @@ -98,6 +104,12 @@ SmartWaypointMgr::~SmartWaypointMgr() } } +SmartAIMgr* SmartAIMgr::instance() +{ + static SmartAIMgr instance; + return &instance; +} + void SmartAIMgr::LoadSmartAIFromDB() { LoadHelperStores(); @@ -1214,6 +1226,7 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e) case SMART_ACTION_REMOVE_GO_FLAG: case SMART_ACTION_SUMMON_CREATURE_GROUP: case SMART_ACTION_RISE_UP: + case SMART_ACTION_SET_CORPSE_DELAY: break; default: TC_LOG_ERROR("sql.sql", "SmartAIMgr: Not handled action_type(%u), event_type(%u), Entry %d SourceType %u Event %u, skipped.", e.GetActionType(), e.GetEventType(), e.entryOrGuid, e.GetScriptType(), e.event_id); diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index c0ea648462d..748792b9b42 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -551,8 +551,9 @@ enum SMART_ACTION SMART_ACTION_START_CLOSEST_WAYPOINT = 113, // wp1, wp2, wp3, wp4, wp5, wp6, wp7 SMART_ACTION_RISE_UP = 114, // distance SMART_ACTION_RANDOM_SOUND = 115, // soundId1, soundId2, soundId3, soundId4, soundId5, onlySelf + SMART_ACTION_SET_CORPSE_DELAY = 116, // timer - SMART_ACTION_END = 116 + SMART_ACTION_END = 117 }; struct SmartAction @@ -1034,6 +1035,11 @@ struct SmartAction uint32 onlySelf; } randomSound; + struct + { + uint32 timer; + } corpseDelay; + //! Note for any new future actions //! All parameters must have type uint32 @@ -1441,11 +1447,7 @@ class SmartWaypointMgr ~SmartWaypointMgr(); public: - static SmartWaypointMgr* instance() - { - static SmartWaypointMgr instance; - return &instance; - } + static SmartWaypointMgr* instance(); void LoadFromDB(); @@ -1477,11 +1479,7 @@ class SmartAIMgr ~SmartAIMgr() { } public: - static SmartAIMgr* instance() - { - static SmartAIMgr instance; - return &instance; - } + static SmartAIMgr* instance(); void LoadSmartAIFromDB(); diff --git a/src/server/game/Accounts/AccountMgr.cpp b/src/server/game/Accounts/AccountMgr.cpp index 737e9f37195..1b93d072fb6 100644 --- a/src/server/game/Accounts/AccountMgr.cpp +++ b/src/server/game/Accounts/AccountMgr.cpp @@ -33,17 +33,23 @@ AccountMgr::~AccountMgr() ClearRBAC(); } -AccountOpResult AccountMgr::CreateAccount(std::string username, std::string password, std::string email = "") +AccountMgr* AccountMgr::instance() +{ + static AccountMgr instance; + return &instance; +} + +AccountOpResult AccountMgr::CreateAccount(std::string username, std::string password, std::string email /*= ""*/) { if (utf8length(username) > MAX_ACCOUNT_STR) - return AOR_NAME_TOO_LONG; // username's too long + return AccountOpResult::AOR_NAME_TOO_LONG; // username's too long - normalizeString(username); - normalizeString(password); - normalizeString(email); + Utf8ToUpperOnlyLatin(username); + Utf8ToUpperOnlyLatin(password); + Utf8ToUpperOnlyLatin(email); if (GetId(username)) - return AOR_NAME_ALREADY_EXIST; // username does already exist + return AccountOpResult::AOR_NAME_ALREADY_EXIST; // username does already exist PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_ACCOUNT); @@ -57,7 +63,7 @@ AccountOpResult AccountMgr::CreateAccount(std::string username, std::string pass stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_REALM_CHARACTERS_INIT); LoginDatabase.Execute(stmt); - return AOR_OK; // everything's fine + return AccountOpResult::AOR_OK; // everything's fine } AccountOpResult AccountMgr::DeleteAccount(uint32 accountId) @@ -68,7 +74,7 @@ AccountOpResult AccountMgr::DeleteAccount(uint32 accountId) PreparedQueryResult result = LoginDatabase.Query(stmt); if (!result) - return AOR_NAME_NOT_EXIST; + return AccountOpResult::AOR_NAME_NOT_EXIST; // Obtain accounts characters stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARS_BY_ACCOUNT_ID); @@ -128,7 +134,7 @@ AccountOpResult AccountMgr::DeleteAccount(uint32 accountId) LoginDatabase.CommitTransaction(trans); - return AOR_OK; + return AccountOpResult::AOR_OK; } AccountOpResult AccountMgr::ChangeUsername(uint32 accountId, std::string newUsername, std::string newPassword) @@ -139,16 +145,16 @@ AccountOpResult AccountMgr::ChangeUsername(uint32 accountId, std::string newUser PreparedQueryResult result = LoginDatabase.Query(stmt); if (!result) - return AOR_NAME_NOT_EXIST; + return AccountOpResult::AOR_NAME_NOT_EXIST; if (utf8length(newUsername) > MAX_ACCOUNT_STR) - return AOR_NAME_TOO_LONG; + return AccountOpResult::AOR_NAME_TOO_LONG; - if (utf8length(newPassword) > MAX_ACCOUNT_STR) - return AOR_PASS_TOO_LONG; + if (utf8length(newPassword) > MAX_PASS_STR) + return AccountOpResult::AOR_PASS_TOO_LONG; - normalizeString(newUsername); - normalizeString(newPassword); + Utf8ToUpperOnlyLatin(newUsername); + Utf8ToUpperOnlyLatin(newPassword); stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_USERNAME); @@ -158,7 +164,7 @@ AccountOpResult AccountMgr::ChangeUsername(uint32 accountId, std::string newUser LoginDatabase.Execute(stmt); - return AOR_OK; + return AccountOpResult::AOR_OK; } AccountOpResult AccountMgr::ChangePassword(uint32 accountId, std::string newPassword) @@ -168,17 +174,17 @@ AccountOpResult AccountMgr::ChangePassword(uint32 accountId, std::string newPass if (!GetName(accountId, username)) { sScriptMgr->OnFailedPasswordChange(accountId); - return AOR_NAME_NOT_EXIST; // account doesn't exist + return AccountOpResult::AOR_NAME_NOT_EXIST; // account doesn't exist } - if (utf8length(newPassword) > MAX_ACCOUNT_STR) + if (utf8length(newPassword) > MAX_PASS_STR) { sScriptMgr->OnFailedPasswordChange(accountId); - return AOR_PASS_TOO_LONG; + return AccountOpResult::AOR_PASS_TOO_LONG; } - normalizeString(username); - normalizeString(newPassword); + Utf8ToUpperOnlyLatin(username); + Utf8ToUpperOnlyLatin(newPassword); PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_PASSWORD); @@ -196,7 +202,7 @@ AccountOpResult AccountMgr::ChangePassword(uint32 accountId, std::string newPass LoginDatabase.Execute(stmt); sScriptMgr->OnPasswordChange(accountId); - return AOR_OK; + return AccountOpResult::AOR_OK; } AccountOpResult AccountMgr::ChangeEmail(uint32 accountId, std::string newEmail) @@ -206,17 +212,17 @@ AccountOpResult AccountMgr::ChangeEmail(uint32 accountId, std::string newEmail) if (!GetName(accountId, username)) { sScriptMgr->OnFailedEmailChange(accountId); - return AOR_NAME_NOT_EXIST; // account doesn't exist + return AccountOpResult::AOR_NAME_NOT_EXIST; // account doesn't exist } if (utf8length(newEmail) > MAX_EMAIL_STR) { sScriptMgr->OnFailedEmailChange(accountId); - return AOR_EMAIL_TOO_LONG; + return AccountOpResult::AOR_EMAIL_TOO_LONG; } - normalizeString(username); - normalizeString(newEmail); + Utf8ToUpperOnlyLatin(username); + Utf8ToUpperOnlyLatin(newEmail); PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_EMAIL); @@ -226,7 +232,7 @@ AccountOpResult AccountMgr::ChangeEmail(uint32 accountId, std::string newEmail) LoginDatabase.Execute(stmt); sScriptMgr->OnEmailChange(accountId); - return AOR_OK; + return AccountOpResult::AOR_OK; } AccountOpResult AccountMgr::ChangeRegEmail(uint32 accountId, std::string newEmail) @@ -236,17 +242,17 @@ AccountOpResult AccountMgr::ChangeRegEmail(uint32 accountId, std::string newEmai if (!GetName(accountId, username)) { sScriptMgr->OnFailedEmailChange(accountId); - return AOR_NAME_NOT_EXIST; // account doesn't exist + return AccountOpResult::AOR_NAME_NOT_EXIST; // account doesn't exist } if (utf8length(newEmail) > MAX_EMAIL_STR) { sScriptMgr->OnFailedEmailChange(accountId); - return AOR_EMAIL_TOO_LONG; + return AccountOpResult::AOR_EMAIL_TOO_LONG; } - normalizeString(username); - normalizeString(newEmail); + Utf8ToUpperOnlyLatin(username); + Utf8ToUpperOnlyLatin(newEmail); PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_REG_EMAIL); @@ -256,7 +262,7 @@ AccountOpResult AccountMgr::ChangeRegEmail(uint32 accountId, std::string newEmai LoginDatabase.Execute(stmt); sScriptMgr->OnEmailChange(accountId); - return AOR_OK; + return AccountOpResult::AOR_OK; } uint32 AccountMgr::GetId(std::string const& username) @@ -324,8 +330,8 @@ bool AccountMgr::CheckPassword(uint32 accountId, std::string password) if (!GetName(accountId, username)) return false; - normalizeString(username); - normalizeString(password); + Utf8ToUpperOnlyLatin(username); + Utf8ToUpperOnlyLatin(password); PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_CHECK_PASSWORD); stmt->setUInt32(0, accountId); @@ -343,8 +349,8 @@ bool AccountMgr::CheckEmail(uint32 accountId, std::string newEmail) if (!GetEmail(accountId, oldEmail)) return false; - normalizeString(oldEmail); - normalizeString(newEmail); + Utf8ToUpperOnlyLatin(oldEmail); + Utf8ToUpperOnlyLatin(newEmail); if (strcmp(oldEmail.c_str(), newEmail.c_str()) == 0) return true; @@ -362,19 +368,6 @@ uint32 AccountMgr::GetCharactersCount(uint32 accountId) return (result) ? (*result)[0].GetUInt64() : 0; } -bool AccountMgr::normalizeString(std::string& utf8String) -{ - wchar_t buffer[MAX_ACCOUNT_STR+1]; - - size_t maxLength = MAX_ACCOUNT_STR; - if (!Utf8toWStr(utf8String, buffer, maxLength)) - return false; - - std::transform(&buffer[0], buffer+maxLength, &buffer[0], wcharToUpperOnlyLatin); - - return WStrToUtf8(buffer, maxLength, utf8String); -} - std::string AccountMgr::CalculateShaPassHash(std::string const& name, std::string const& password) { SHA1Hash sha; @@ -462,7 +455,7 @@ void AccountMgr::LoadRBAC() while (result->NextRow()); TC_LOG_DEBUG("rbac", "AccountMgr::LoadRBAC: Loading default permissions"); - result = LoginDatabase.PQuery("SELECT secId, permissionId FROM rbac_default_permissions WHERE (realmId = %u OR realmId = -1) ORDER BY secId ASC", realmID); + result = LoginDatabase.PQuery("SELECT secId, permissionId FROM rbac_default_permissions WHERE (realmId = %u OR realmId = -1) ORDER BY secId ASC", realm.Id.Realm); if (!result) { TC_LOG_INFO("server.loading", ">> Loaded 0 default permission definitions. DB table `rbac_default_permissions` is empty."); diff --git a/src/server/game/Accounts/AccountMgr.h b/src/server/game/Accounts/AccountMgr.h index 40ccba1f8e5..faf28cc707f 100644 --- a/src/server/game/Accounts/AccountMgr.h +++ b/src/server/game/Accounts/AccountMgr.h @@ -21,7 +21,7 @@ #include "RBAC.h" -enum AccountOpResult +enum class AccountOpResult : uint8 { AOR_OK, AOR_NAME_TOO_LONG, @@ -39,6 +39,7 @@ enum PasswordChangeSecurity PW_RBAC }; +#define MAX_PASS_STR 16 #define MAX_ACCOUNT_STR 16 #define MAX_EMAIL_STR 64 @@ -55,13 +56,9 @@ class AccountMgr ~AccountMgr(); public: - static AccountMgr* instance() - { - static AccountMgr instance; - return &instance; - } + static AccountMgr* instance(); - AccountOpResult CreateAccount(std::string username, std::string password, std::string email); + AccountOpResult CreateAccount(std::string username, std::string password, std::string email = ""); static AccountOpResult DeleteAccount(uint32 accountId); static AccountOpResult ChangeUsername(uint32 accountId, std::string newUsername, std::string newPassword); static AccountOpResult ChangePassword(uint32 accountId, std::string newPassword); @@ -78,7 +75,6 @@ class AccountMgr static uint32 GetCharactersCount(uint32 accountId); static std::string CalculateShaPassHash(std::string const& name, std::string const& password); - static bool normalizeString(std::string& utf8String); static bool IsPlayerAccount(uint32 gmlevel); static bool IsAdminAccount(uint32 gmlevel); static bool IsConsoleAccount(uint32 gmlevel); diff --git a/src/server/game/Accounts/RBAC.cpp b/src/server/game/Accounts/RBAC.cpp index a8720b66df4..34d7687452c 100644 --- a/src/server/game/Accounts/RBAC.cpp +++ b/src/server/game/Accounts/RBAC.cpp @@ -236,10 +236,10 @@ void RBACData::AddPermissions(RBACPermissionContainer const& permsFrom, RBACPerm permsTo.insert(*itr); } -void RBACData::RemovePermissions(RBACPermissionContainer const& permsFrom, RBACPermissionContainer& permsTo) +void RBACData::RemovePermissions(RBACPermissionContainer& permsFrom, RBACPermissionContainer const& permsToRemove) { - for (RBACPermissionContainer::const_iterator itr = permsFrom.begin(); itr != permsFrom.end(); ++itr) - permsTo.erase(*itr); + for (RBACPermissionContainer::const_iterator itr = permsToRemove.begin(); itr != permsToRemove.end(); ++itr) + permsFrom.erase(*itr); } void RBACData::ExpandPermissions(RBACPermissionContainer& permissions) diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index 4ebd3ae7042..1dc98f8b2c1 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -670,8 +670,8 @@ enum RBACPermissions RBAC_PERM_COMMAND_WP_UNLOAD = 772, RBAC_PERM_COMMAND_WP_RELOAD = 773, RBAC_PERM_COMMAND_WP_SHOW = 774, - RBAC_PERM_COMMAND_MODIFY_CURRENCY = 775, // only 4.3.4 - RBAC_PERM_COMMAND_DEBUG_PHASE = 776, // only 4.3.4 + RBAC_PERM_COMMAND_MODIFY_CURRENCY = 775, // only 6.x + RBAC_PERM_COMMAND_DEBUG_PHASE = 776, // only 6.x RBAC_PERM_COMMAND_MAILBOX = 777, RBAC_PERM_COMMAND_AHBOT = 778, RBAC_PERM_COMMAND_AHBOT_ITEMS = 779, @@ -938,8 +938,8 @@ class RBACData /// Adds a list of permissions to another list void AddPermissions(RBACPermissionContainer const& permsFrom, RBACPermissionContainer& permsTo); - /// Removes a list of permissions to another list - void RemovePermissions(RBACPermissionContainer const& permsFrom, RBACPermissionContainer& permsTo); + /// Removes a list of permissions from another list + void RemovePermissions(RBACPermissionContainer& permsFrom, RBACPermissionContainer const& permsToRemove); /** * @name ExpandPermissions diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index ac8e0298a44..ebc814405bf 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -46,7 +46,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) { if (dataType >= MAX_ACHIEVEMENT_CRITERIA_DATA_TYPE) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` for criteria (Entry: %u) has wrong data type (%u), ignored.", criteria->ID, dataType); + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` for criteria (Entry: %u) contains a wrong data type (%u), ignored.", criteria->ID, dataType); return false; } @@ -81,7 +81,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) default: if (dataType != ACHIEVEMENT_CRITERIA_DATA_TYPE_SCRIPT) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` has data for non-supported criteria type (Entry: %u Type: %u), ignored.", criteria->ID, criteria->requiredType); + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` contains data for a non-supported criteria type (Entry: %u Type: %u), ignored.", criteria->ID, criteria->requiredType); return false; } break; @@ -96,7 +96,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_CREATURE: if (!creature.id || !sObjectMgr->GetCreatureTemplate(creature.id)) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_CREATURE (%u) has non-existing creature id in value1 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_CREATURE (%u) contains a non-existing creature id in value1 (%u), ignored.", criteria->ID, criteria->requiredType, dataType, creature.id); return false; } @@ -104,13 +104,13 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_CLASS_RACE: if (classRace.class_id && ((1 << (classRace.class_id-1)) & CLASSMASK_ALL_PLAYABLE) == 0) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_CLASS_RACE (%u) has non-existing class in value1 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_CLASS_RACE (%u) contains a non-existing class in value1 (%u), ignored.", criteria->ID, criteria->requiredType, dataType, classRace.class_id); return false; } if (classRace.race_id && ((1 << (classRace.race_id-1)) & RACEMASK_ALL_PLAYABLE) == 0) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_CLASS_RACE (%u) has non-existing race in value2 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_CLASS_RACE (%u) contains a non-existing race in value2 (%u), ignored.", criteria->ID, criteria->requiredType, dataType, classRace.race_id); return false; } @@ -118,7 +118,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_LESS_HEALTH: if (health.percent < 1 || health.percent > 100) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_PLAYER_LESS_HEALTH (%u) has wrong percent value in value1 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_PLAYER_LESS_HEALTH (%u) contains a wrong percent value in value1 (%u), ignored.", criteria->ID, criteria->requiredType, dataType, health.percent); return false; } @@ -126,7 +126,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_DEAD: if (player_dead.own_team_flag > 1) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_DEAD (%u) has wrong boolean value1 (%u).", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_DEAD (%u) contains a wrong boolean value1 (%u).", criteria->ID, criteria->requiredType, dataType, player_dead.own_team_flag); return false; } @@ -137,19 +137,19 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) SpellInfo const* spellEntry = sSpellMgr->GetSpellInfo(aura.spell_id); if (!spellEntry) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type %s (%u) has wrong spell id in value1 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type %s (%u) contains a wrong spell id in value1 (%u), ignored.", criteria->ID, criteria->requiredType, (dataType == ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AURA?"ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AURA":"ACHIEVEMENT_CRITERIA_DATA_TYPE_T_AURA"), dataType, aura.spell_id); return false; } if (aura.effect_idx >= 3) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type %s (%u) has wrong spell effect index in value2 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type %s (%u) contains a wrong spell effect index in value2 (%u), ignored.", criteria->ID, criteria->requiredType, (dataType == ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AURA?"ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AURA":"ACHIEVEMENT_CRITERIA_DATA_TYPE_T_AURA"), dataType, aura.effect_idx); return false; } if (!spellEntry->Effects[aura.effect_idx].ApplyAuraName) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type %s (%u) has non-aura spell effect (ID: %u Effect: %u), ignores.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type %s (%u) contains a non-aura spell effect (ID: %u Effect: %u), ignored.", criteria->ID, criteria->requiredType, (dataType == ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AURA?"ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AURA":"ACHIEVEMENT_CRITERIA_DATA_TYPE_T_AURA"), dataType, aura.spell_id, aura.effect_idx); return false; } @@ -158,7 +158,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AREA: if (!sAreaTableStore.LookupEntry(area.id)) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AREA (%u) has wrong area id in value1 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AREA (%u) contains a wrong area id in value1 (%u), ignored.", criteria->ID, criteria->requiredType, dataType, area.id); return false; } @@ -166,7 +166,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_VALUE: if (value.compType >= COMP_TYPE_MAX) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_VALUE (%u) has wrong ComparisionType in value2 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_VALUE (%u) contains a wrong ComparisionType in value2 (%u), ignored.", criteria->ID, criteria->requiredType, dataType, value.compType); return false; } @@ -174,7 +174,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_LEVEL: if (level.minlevel > STRONG_MAX_LEVEL) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_T_LEVEL (%u) has wrong minlevel in value1 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_T_LEVEL (%u) contains a wrong minlevel in value1 (%u), ignored.", criteria->ID, criteria->requiredType, dataType, level.minlevel); return false; } @@ -182,7 +182,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_GENDER: if (gender.gender > GENDER_NONE) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_T_GENDER (%u) has wrong gender in value1 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_T_GENDER (%u) contains a wrong gender value in value1 (%u), ignored.", criteria->ID, criteria->requiredType, dataType, gender.gender); return false; } @@ -190,7 +190,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_SCRIPT: if (!ScriptId) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_SCRIPT (%u) does not have ScriptName set, ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_SCRIPT (%u) does not have a ScriptName set, ignored.", criteria->ID, criteria->requiredType, dataType); return false; } @@ -198,7 +198,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_DIFFICULTY: if (difficulty.difficulty >= MAX_DIFFICULTY) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_DIFFICULTY (%u) has wrong difficulty in value1 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_DIFFICULTY (%u) contains a wrong difficulty value in value1 (%u), ignored.", criteria->ID, criteria->requiredType, dataType, difficulty.difficulty); return false; } @@ -206,7 +206,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_PLAYER_COUNT: if (map_players.maxcount <= 0) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_PLAYER_COUNT (%u) has wrong max players count in value1 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_PLAYER_COUNT (%u) contains a wrong max players count in value1 (%u), ignored.", criteria->ID, criteria->requiredType, dataType, map_players.maxcount); return false; } @@ -214,7 +214,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_TEAM: if (team.team != ALLIANCE && team.team != HORDE) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_T_TEAM (%u) has unknown team in value1 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_T_TEAM (%u) contains an unknown team value in value1 (%u), ignored.", criteria->ID, criteria->requiredType, dataType, team.team); return false; } @@ -222,7 +222,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_DRUNK: if (drunk.state >= MAX_DRUNKEN) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_S_DRUNK (%u) has unknown drunken state in value1 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_S_DRUNK (%u) contains an unknown drunken state value in value1 (%u), ignored.", criteria->ID, criteria->requiredType, dataType, drunk.state); return false; } @@ -230,7 +230,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_HOLIDAY: if (!sHolidaysStore.LookupEntry(holiday.id)) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_HOLIDAY (%u) has unknown holiday in value1 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_HOLIDAY (%u) contains an unknown holiday entry in value1 (%u), ignored.", criteria->ID, criteria->requiredType, dataType, holiday.id); return false; } @@ -240,7 +240,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPED_ITEM: if (equipped_item.item_quality >= MAX_ITEM_QUALITY) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPED_ITEM (%u) has unknown quality state in value1 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPED_ITEM (%u) contains an unknown quality state value in value1 (%u), ignored.", criteria->ID, criteria->requiredType, dataType, equipped_item.item_quality); return false; } @@ -248,7 +248,7 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_ID: if (!sMapStore.LookupEntry(map_id.mapId)) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_ID (%u) has unknown map id in value1 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_ID (%u) contains an unknown map id in value1 (%u), ignored.", criteria->ID, criteria->requiredType, dataType, map_id.mapId); return false; } @@ -256,19 +256,19 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE: if (!classRace.class_id && !classRace.race_id) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE (%u) must not have 0 in either value field, ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE (%u) should not have 0 in either value field. Ignored.", criteria->ID, criteria->requiredType, dataType); return false; } if (classRace.class_id && ((1 << (classRace.class_id-1)) & CLASSMASK_ALL_PLAYABLE) == 0) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE (%u) has non-existing class in value1 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE (%u) contains a non-existing class entry in value1 (%u), ignored.", criteria->ID, criteria->requiredType, dataType, classRace.class_id); return false; } if (classRace.race_id && ((1 << (classRace.race_id-1)) & RACEMASK_ALL_PLAYABLE) == 0) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE (%u) has non-existing race in value2 (%u), ignored.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE (%u) contains a non-existing race entry in value2 (%u), ignored.", criteria->ID, criteria->requiredType, dataType, classRace.race_id); return false; } @@ -276,13 +276,13 @@ bool AchievementCriteriaData::IsValid(AchievementCriteriaEntry const* criteria) case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_KNOWN_TITLE: if (!sCharTitlesStore.LookupEntry(known_title.title_id)) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_S_KNOWN_TITLE (%u) have unknown title_id in value1 (%u), ignore.", + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) for data type ACHIEVEMENT_CRITERIA_DATA_TYPE_S_KNOWN_TITLE (%u) contains an unknown title_id in value1 (%u), ignore.", criteria->ID, criteria->requiredType, dataType, known_title.title_id); return false; } return true; default: - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) has data for non-supported data type (%u), ignored.", criteria->ID, criteria->requiredType, dataType); + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` (Entry: %u Type: %u) contains data of a non-supported data type (%u), ignored.", criteria->ID, criteria->requiredType, dataType); return false; } } @@ -377,14 +377,14 @@ bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, Un Map* map = source->GetMap(); if (!map->IsDungeon()) { - TC_LOG_ERROR("achievement", "Achievement system call ACHIEVEMENT_CRITERIA_DATA_TYPE_INSTANCE_SCRIPT (%u) for achievement criteria %u for non-dungeon/non-raid map %u", + TC_LOG_ERROR("achievement", "Achievement system call ACHIEVEMENT_CRITERIA_DATA_TYPE_INSTANCE_SCRIPT (%u) for achievement criteria %u in a non-dungeon/non-raid map %u", dataType, criteria_id, map->GetId()); return false; } InstanceScript* instance = map->ToInstanceMap()->GetInstanceScript(); if (!instance) { - TC_LOG_ERROR("achievement", "Achievement system call ACHIEVEMENT_CRITERIA_DATA_TYPE_INSTANCE_SCRIPT (%u) for achievement criteria %u for map %u but map does not have a instance script", + TC_LOG_ERROR("achievement", "Achievement system call ACHIEVEMENT_CRITERIA_DATA_TYPE_INSTANCE_SCRIPT (%u) for achievement criteria %u in map %u, but the map does not have an instance script.", dataType, criteria_id, map->GetId()); return false; } @@ -601,8 +601,8 @@ void AchievementMgr::LoadFromDB(PreparedQueryResult achievementResult, PreparedQ AchievementCriteriaEntry const* criteria = sAchievementMgr->GetAchievementCriteria(id); if (!criteria) { - // we will remove not existed criteria for all characters - TC_LOG_ERROR("achievement", "Non-existing achievement criteria %u data removed from table `character_achievement_progress`.", id); + // Removing non-existing criteria data for all characters + TC_LOG_ERROR("achievement", "Non-existing achievement criteria %u data has been removed from the table `character_achievement_progress`.", id); PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_INVALID_ACHIEV_PROGRESS_CRITERIA); @@ -1066,7 +1066,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui break; } - // std case: not exist in DBC, not triggered in code as result + // std case: does not exist in DBC, not triggered in code as result case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALTH: case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_SPELLPOWER: case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_ARMOR: @@ -1404,7 +1404,7 @@ void AchievementMgr::SetCriteriaProgress(AchievementCriteriaEntry const* entry, if (entry->timeLimit) { - // has to exist else we wouldn't be here + // has to exist, otherwise we wouldn't be here timedCompleted = IsCompletedCriteria(entry, sAchievementMgr->GetAchievement(entry->referredAchievement)); // Client expects this in packet timeElapsed = entry->timeLimit - (timedIter->second/IN_MILLISECONDS); @@ -1655,14 +1655,14 @@ bool AchievementMgr::CanUpdateCriteria(AchievementCriteriaEntry const* criteria, if (!RequirementsSatisfied(criteria, achievement, miscValue1, miscValue2, unit)) { - TC_LOG_TRACE("achievement", "CanUpdateCriteria: (Id: %u Type %s) Requirements not satisfied", + TC_LOG_TRACE("achievement", "CanUpdateCriteria: (Id: %u Type %s) Requirements have not been satisfied", criteria->ID, AchievementGlobalMgr::GetCriteriaTypeString(criteria->requiredType)); return false; } if (!ConditionsSatisfied(criteria)) { - TC_LOG_TRACE("achievement", "CanUpdateCriteria: (Id: %u Type %s) Conditions not satisfied", + TC_LOG_TRACE("achievement", "CanUpdateCriteria: (Id: %u Type %s) Conditions have not been satisfied", criteria->ID, AchievementGlobalMgr::GetCriteriaTypeString(criteria->requiredType)); return false; } @@ -2246,6 +2246,12 @@ char const* AchievementGlobalMgr::GetCriteriaTypeString(AchievementCriteriaTypes return "MISSING_TYPE"; } +AchievementGlobalMgr* AchievementGlobalMgr::instance() +{ + static AchievementGlobalMgr instance; + return &instance; +} + //========================================================== void AchievementGlobalMgr::LoadAchievementCriteriaList() { @@ -2273,7 +2279,7 @@ void AchievementGlobalMgr::LoadAchievementCriteriaList() ++loaded; } - TC_LOG_INFO("server.loading", ">> Loaded %u achievement criteria in %u ms", loaded, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u achievement criteria in %u ms.", loaded, GetMSTimeDiffToNow(oldMSTime)); } void AchievementGlobalMgr::LoadAchievementReferenceList() @@ -2302,7 +2308,7 @@ void AchievementGlobalMgr::LoadAchievementReferenceList() if (AchievementEntry const* achievement = sAchievementMgr->GetAchievement(4539)) const_cast<AchievementEntry*>(achievement)->mapID = 631; // Correct map requirement (currently has Ulduar) - TC_LOG_INFO("server.loading", ">> Loaded %u achievement references in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u achievement references in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } void AchievementGlobalMgr::LoadAchievementCriteriaData() @@ -2330,7 +2336,7 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData() if (!criteria) { - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` has data for non-existing criteria (Entry: %u), ignore.", criteria_id); + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` contains data for non-existing criteria (Entry: %u). Ignored.", criteria_id); continue; } @@ -2340,7 +2346,7 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData() if (scriptName.length()) // not empty { if (dataType != ACHIEVEMENT_CRITERIA_DATA_TYPE_SCRIPT) - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` has ScriptName set for non-scripted data type (Entry: %u, type %u), useless data.", criteria_id, dataType); + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` contains a ScriptName for non-scripted data type (Entry: %u, type %u), useless data.", criteria_id, dataType); else scriptId = sObjectMgr->GetScriptId(scriptName); } @@ -2396,7 +2402,7 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData() if (!achievement) continue; - // exist many achievements with this criteria, use at this moment hardcoded check to skil simple case + // There are many achievements with these criteria, use hardcoded check at this moment to pick a simple case if (achievement->ID == 1282) break; @@ -2433,7 +2439,7 @@ void AchievementGlobalMgr::LoadAchievementCriteriaData() } if (!GetCriteriaDataSet(criteria) && !DisableMgr::IsDisabledFor(DISABLE_TYPE_ACHIEVEMENT_CRITERIA, entryId, NULL)) - TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` does not have expected data for criteria (Entry: %u Type: %u) for achievement %u.", criteria->ID, criteria->requiredType, criteria->referredAchievement); + TC_LOG_ERROR("sql.sql", "Table `achievement_criteria_data` does not contain expected data for criteria (Entry: %u Type: %u) for achievement %u.", criteria->ID, criteria->requiredType, criteria->referredAchievement); } TC_LOG_INFO("server.loading", ">> Loaded %u additional achievement criteria data in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); @@ -2459,8 +2465,8 @@ void AchievementGlobalMgr::LoadCompletedAchievements() const AchievementEntry* achievement = sAchievementMgr->GetAchievement(achievementId); if (!achievement) { - // Remove non existent achievements from all characters - TC_LOG_ERROR("achievement", "Non-existing achievement %u data removed from table `character_achievement`.", achievementId); + // Remove non-existing achievements from all characters + TC_LOG_ERROR("achievement", "Non-existing achievement %u data has been removed from the table `character_achievement`.", achievementId); PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_INVALID_ACHIEVMENT); stmt->setUInt16(0, uint16(achievementId)); @@ -2473,7 +2479,7 @@ void AchievementGlobalMgr::LoadCompletedAchievements() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %lu realm first completed achievements in %u ms", (unsigned long)m_allCompletedAchievements.size(), GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %lu realm first completed achievements in %u ms.", (unsigned long)m_allCompletedAchievements.size(), GetMSTimeDiffToNow(oldMSTime)); } void AchievementGlobalMgr::LoadRewards() @@ -2500,7 +2506,7 @@ void AchievementGlobalMgr::LoadRewards() AchievementEntry const* achievement = GetAchievement(entry); if (!achievement) { - TC_LOG_ERROR("sql.sql", "Table `achievement_reward` has wrong achievement (Entry: %u), ignored.", entry); + TC_LOG_ERROR("sql.sql", "Table `achievement_reward` contains a wrong achievement entry (Entry: %u), ignored.", entry); continue; } @@ -2516,19 +2522,19 @@ void AchievementGlobalMgr::LoadRewards() // must be title or mail at least if (!reward.titleId[0] && !reward.titleId[1] && !reward.sender) { - TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) does not have title or item reward data, ignored.", entry); + TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) does not contain title or item reward data. Ignored.", entry); continue; } if (achievement->requiredFaction == ACHIEVEMENT_FACTION_ANY && (!reward.titleId[0] ^ !reward.titleId[1])) - TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) has title (A: %u H: %u) for only one team.", entry, reward.titleId[0], reward.titleId[1]); + TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) contains the title (A: %u H: %u) for only one team.", entry, reward.titleId[0], reward.titleId[1]); if (reward.titleId[0]) { CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(reward.titleId[0]); if (!titleEntry) { - TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) has invalid title id (%u) in `title_A`, set to 0", entry, reward.titleId[0]); + TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) contains an invalid title id (%u) in `title_A`, set to 0", entry, reward.titleId[0]); reward.titleId[0] = 0; } } @@ -2538,7 +2544,7 @@ void AchievementGlobalMgr::LoadRewards() CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(reward.titleId[1]); if (!titleEntry) { - TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) has invalid title id (%u) in `title_H`, set to 0", entry, reward.titleId[1]); + TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) contains an invalid title id (%u) in `title_H`, set to 0", entry, reward.titleId[1]); reward.titleId[1] = 0; } } @@ -2548,41 +2554,41 @@ void AchievementGlobalMgr::LoadRewards() { if (!sObjectMgr->GetCreatureTemplate(reward.sender)) { - TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) has invalid creature entry %u as sender, mail reward skipped.", entry, reward.sender); + TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) contains an invalid creature entry %u as sender, mail reward skipped.", entry, reward.sender); reward.sender = 0; } } else { if (reward.itemId) - TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) does not have sender data but has item reward, item will not be rewarded.", entry); + TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) does not have sender data, but contains an item reward. Item will not be rewarded.", entry); if (!reward.subject.empty()) - TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) does not have sender data but has mail subject.", entry); + TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) does not have sender data, but contains a mail subject.", entry); if (!reward.text.empty()) - TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) does not have sender data but has mail text.", entry); + TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) does not have sender data, but contains mail text.", entry); if (reward.mailTemplate) - TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) does not have sender data but has mailTemplate.", entry); + TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) does not have sender data, but has a mailTemplate.", entry); } if (reward.mailTemplate) { if (!sMailTemplateStore.LookupEntry(reward.mailTemplate)) { - TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) has invalid mailTemplate (%u).", entry, reward.mailTemplate); + TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) is using an invalid mailTemplate (%u).", entry, reward.mailTemplate); reward.mailTemplate = 0; } else if (!reward.subject.empty() || !reward.text.empty()) - TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) has mailTemplate (%u) and mail subject/text.", entry, reward.mailTemplate); + TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) is using mailTemplate (%u) and mail subject/text.", entry, reward.mailTemplate); } if (reward.itemId) { if (!sObjectMgr->GetItemTemplate(reward.itemId)) { - TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) has invalid item id %u, reward mail will not contain item.", entry, reward.itemId); + TC_LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: %u) contains an invalid item id %u, reward mail will not contain the rewarded item.", entry, reward.itemId); reward.itemId = 0; } } @@ -2592,7 +2598,7 @@ void AchievementGlobalMgr::LoadRewards() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u achievement rewards in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u achievement rewards in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } void AchievementGlobalMgr::LoadRewardLocales() @@ -2607,7 +2613,7 @@ void AchievementGlobalMgr::LoadRewardLocales() if (!result) { - TC_LOG_INFO("server.loading", ">> Loaded 0 achievement reward locale strings. DB table `locales_achievement_reward` is empty"); + TC_LOG_INFO("server.loading", ">> Loaded 0 achievement reward locale strings. DB table `locales_achievement_reward` is empty."); return; } @@ -2619,7 +2625,7 @@ void AchievementGlobalMgr::LoadRewardLocales() if (m_achievementRewards.find(entry) == m_achievementRewards.end()) { - TC_LOG_ERROR("sql.sql", "Table `locales_achievement_reward` (Entry: %u) has locale strings for non-existing achievement reward.", entry); + TC_LOG_ERROR("sql.sql", "Table `locales_achievement_reward` (Entry: %u) contains locale strings for a non-existing achievement reward.", entry); continue; } @@ -2634,7 +2640,7 @@ void AchievementGlobalMgr::LoadRewardLocales() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u achievement reward locale strings in %u ms", uint32(m_achievementRewardLocales.size()), GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u achievement reward locale strings in %u ms.", uint32(m_achievementRewardLocales.size()), GetMSTimeDiffToNow(oldMSTime)); } AchievementEntry const* AchievementGlobalMgr::GetAchievement(uint32 achievementId) const diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h index cc3fd55bc3a..aba56bfbfc1 100644 --- a/src/server/game/Achievements/AchievementMgr.h +++ b/src/server/game/Achievements/AchievementMgr.h @@ -315,11 +315,7 @@ class AchievementGlobalMgr static char const* GetCriteriaTypeString(AchievementCriteriaTypes type); static char const* GetCriteriaTypeString(uint32 type); - static AchievementGlobalMgr* instance() - { - static AchievementGlobalMgr instance; - return &instance; - } + static AchievementGlobalMgr* instance(); AchievementCriteriaEntryList const& GetAchievementCriteriaByType(AchievementCriteriaTypes type) const { diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp index 035d9af4369..d9f5388e3ce 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp @@ -44,6 +44,12 @@ AuctionHouseMgr::~AuctionHouseMgr() delete itr->second; } +AuctionHouseMgr* AuctionHouseMgr::instance() +{ + static AuctionHouseMgr instance; + return &instance; +} + AuctionHouseObject* AuctionHouseMgr::GetAuctionsMap(uint32 factionTemplateId) { if (sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_AUCTION)) @@ -130,7 +136,7 @@ void AuctionHouseMgr::SendAuctionWonMail(AuctionEntry* auction, SQLTransaction& else { bidderAccId = sObjectMgr->GetPlayerAccountIdByGUID(bidderGuid); - logGmTrade = AccountMgr::HasPermission(bidderAccId, rbac::RBAC_PERM_LOG_GM_TRADE, realmID); + logGmTrade = AccountMgr::HasPermission(bidderAccId, rbac::RBAC_PERM_LOG_GM_TRADE, realm.Id.Realm); if (logGmTrade && !sObjectMgr->GetPlayerNameByGUID(bidderGuid, bidderName)) bidderName = sObjectMgr->GetTrinityStringForDBCLocale(LANG_UNKNOWN); diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.h b/src/server/game/AuctionHouse/AuctionHouseMgr.h index fe4b9ed07de..7fc039114e7 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.h +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.h @@ -153,11 +153,7 @@ class AuctionHouseMgr ~AuctionHouseMgr(); public: - static AuctionHouseMgr* instance() - { - static AuctionHouseMgr instance; - return &instance; - } + static AuctionHouseMgr* instance(); typedef std::unordered_map<ObjectGuid::LowType, Item*> ItemMap; typedef std::vector<AuctionEntry*> PlayerAuctions; diff --git a/src/server/game/AuctionHouseBot/AuctionHouseBot.cpp b/src/server/game/AuctionHouseBot/AuctionHouseBot.cpp index e1ba9a64191..74f0aaf428a 100644 --- a/src/server/game/AuctionHouseBot/AuctionHouseBot.cpp +++ b/src/server/game/AuctionHouseBot/AuctionHouseBot.cpp @@ -24,6 +24,12 @@ #include "AuctionHouseBotBuyer.h" #include "AuctionHouseBotSeller.h" +AuctionBotConfig* AuctionBotConfig::instance() +{ + static AuctionBotConfig instance; + return &instance; +} + bool AuctionBotConfig::Initialize() { GetConfigFromFile(); @@ -426,6 +432,12 @@ void AuctionHouseBot::Rebuild(bool all) } } +AuctionHouseBot* AuctionHouseBot::instance() +{ + static AuctionHouseBot instance; + return &instance; +} + void AuctionHouseBot::Update() { // nothing do... diff --git a/src/server/game/AuctionHouseBot/AuctionHouseBot.h b/src/server/game/AuctionHouseBot/AuctionHouseBot.h index 87f76a17dcc..8f90e8fa76f 100644 --- a/src/server/game/AuctionHouseBot/AuctionHouseBot.h +++ b/src/server/game/AuctionHouseBot/AuctionHouseBot.h @@ -205,11 +205,7 @@ private: AuctionBotConfig& operator=(const AuctionBotConfig&); public: - static AuctionBotConfig* instance() - { - static AuctionBotConfig instance; - return &instance; - } + static AuctionBotConfig* instance(); bool Initialize(); const std::string& GetAHBotIncludes() const { return _AHBotIncludes; } @@ -283,11 +279,7 @@ private: AuctionHouseBot& operator=(const AuctionHouseBot&); public: - static AuctionHouseBot* instance() - { - static AuctionHouseBot instance; - return &instance; - } + static AuctionHouseBot* instance(); void Update(); void Initialize(); diff --git a/src/server/game/Battlefield/Battlefield.cpp b/src/server/game/Battlefield/Battlefield.cpp index 34326d09e2f..e69d0f3085c 100644 --- a/src/server/game/Battlefield/Battlefield.cpp +++ b/src/server/game/Battlefield/Battlefield.cpp @@ -285,7 +285,7 @@ void Battlefield::InitStalker(uint32 entry, Position const& pos) if (Creature* creature = SpawnCreature(entry, pos, TEAM_NEUTRAL)) StalkerGuid = creature->GetGUID(); else - TC_LOG_ERROR("bg.battlefield", "Battlefield::InitStalker: could not spawn Stalker (Creature entry %u), zone messeges will be un-available", entry); + TC_LOG_ERROR("bg.battlefield", "Battlefield::InitStalker: Could not spawn Stalker (Creature entry %u), zone messages will be unavailable!", entry); } void Battlefield::KickAfkPlayers() @@ -544,10 +544,10 @@ BfGraveyard* Battlefield::GetGraveyardById(uint32 id) const if (BfGraveyard* graveyard = m_GraveyardList.at(id)) return graveyard; else - TC_LOG_ERROR("bg.battlefield", "Battlefield::GetGraveyardById Id:%u not existed", id); + TC_LOG_ERROR("bg.battlefield", "Battlefield::GetGraveyardById Id:%u does not exist.", id); } else - TC_LOG_ERROR("bg.battlefield", "Battlefield::GetGraveyardById Id:%u cant be found", id); + TC_LOG_ERROR("bg.battlefield", "Battlefield::GetGraveyardById Id:%u could not be found.", id); return NULL; } @@ -765,7 +765,7 @@ Creature* Battlefield::SpawnCreature(uint32 entry, float x, float y, float z, fl Map* map = sMapMgr->CreateBaseMap(m_MapId); if (!map) { - TC_LOG_ERROR("bg.battlefield", "Battlefield::SpawnCreature: Can't create creature entry: %u map not found", entry); + TC_LOG_ERROR("bg.battlefield", "Battlefield::SpawnCreature: Can't create creature entry: %u, map not found.", entry); return nullptr; } @@ -782,7 +782,7 @@ Creature* Battlefield::SpawnCreature(uint32 entry, float x, float y, float z, fl CreatureTemplate const* cinfo = sObjectMgr->GetCreatureTemplate(entry); if (!cinfo) { - TC_LOG_ERROR("bg.battlefield", "Battlefield::SpawnCreature: entry %u does not exist.", entry); + TC_LOG_ERROR("bg.battlefield", "Battlefield::SpawnCreature: Entry %u does not exist.", entry); return nullptr; } @@ -805,8 +805,8 @@ GameObject* Battlefield::SpawnGameObject(uint32 entry, float x, float y, float z GameObject* go = new GameObject; if (!go->Create(map->GenerateLowGuid<HighGuid::GameObject>(), entry, map, PHASEMASK_NORMAL, x, y, z, o, 0, 0, 0, 0, 100, GO_STATE_READY)) { - TC_LOG_ERROR("bg.battlefield", "Battlefield::SpawnGameObject: Gameobject template %u not found in database! Battlefield not created!", entry); - TC_LOG_ERROR("bg.battlefield", "Battlefield::SpawnGameObject: Cannot create gameobject template %u! Battlefield not created!", entry); + TC_LOG_ERROR("bg.battlefield", "Battlefield::SpawnGameObject: Gameobject template %u could not be found in the database! Battlefield has not been created!", entry); + TC_LOG_ERROR("bg.battlefield", "Battlefield::SpawnGameObject: Could not create gameobject template %u! Battlefield has not been created!", entry); delete go; return NULL; } @@ -907,7 +907,7 @@ bool BfCapturePoint::SetCapturePointData(GameObject* capturePoint) GameObjectTemplate const* goinfo = capturePoint->GetGOInfo(); if (goinfo->type != GAMEOBJECT_TYPE_CAPTURE_POINT) { - TC_LOG_ERROR("misc", "OutdoorPvP: GO %u is not capture point!", capturePoint->GetEntry()); + TC_LOG_ERROR("misc", "OutdoorPvP: GO %u is not a capture point!", capturePoint->GetEntry()); return false; } diff --git a/src/server/game/Battlefield/BattlefieldMgr.cpp b/src/server/game/Battlefield/BattlefieldMgr.cpp index e4c10d64682..1df87fe1d6f 100644 --- a/src/server/game/Battlefield/BattlefieldMgr.cpp +++ b/src/server/game/Battlefield/BattlefieldMgr.cpp @@ -32,6 +32,12 @@ BattlefieldMgr::~BattlefieldMgr() _battlefieldMap.clear(); } +BattlefieldMgr* BattlefieldMgr::instance() +{ + static BattlefieldMgr instance; + return &instance; +} + void BattlefieldMgr::InitBattlefield() { Battlefield* wg = new BattlefieldWG(); diff --git a/src/server/game/Battlefield/BattlefieldMgr.h b/src/server/game/Battlefield/BattlefieldMgr.h index fabb33ae359..5d2c13538f6 100644 --- a/src/server/game/Battlefield/BattlefieldMgr.h +++ b/src/server/game/Battlefield/BattlefieldMgr.h @@ -27,11 +27,7 @@ class ZoneScript; class BattlefieldMgr { public: - static BattlefieldMgr* instance() - { - static BattlefieldMgr instance; - return &instance; - } + static BattlefieldMgr* instance(); // create battlefield events void InitBattlefield(); diff --git a/src/server/game/Battlegrounds/ArenaTeamMgr.cpp b/src/server/game/Battlegrounds/ArenaTeamMgr.cpp index b838131fd03..5dd0b6f29c3 100644 --- a/src/server/game/Battlegrounds/ArenaTeamMgr.cpp +++ b/src/server/game/Battlegrounds/ArenaTeamMgr.cpp @@ -35,6 +35,12 @@ ArenaTeamMgr::~ArenaTeamMgr() delete itr->second; } +ArenaTeamMgr* ArenaTeamMgr::instance() +{ + static ArenaTeamMgr instance; + return &instance; +} + // Arena teams collection ArenaTeam* ArenaTeamMgr::GetArenaTeamById(uint32 arenaTeamId) const { diff --git a/src/server/game/Battlegrounds/ArenaTeamMgr.h b/src/server/game/Battlegrounds/ArenaTeamMgr.h index 432a4ff598f..269795092c7 100644 --- a/src/server/game/Battlegrounds/ArenaTeamMgr.h +++ b/src/server/game/Battlegrounds/ArenaTeamMgr.h @@ -27,11 +27,7 @@ private: ~ArenaTeamMgr(); public: - static ArenaTeamMgr* instance() - { - static ArenaTeamMgr instance; - return &instance; - } + static ArenaTeamMgr* instance(); typedef std::unordered_map<uint32, ArenaTeam*> ArenaTeamContainer; diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp index 062d4702d43..683547ef3fc 100644 --- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp +++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp @@ -76,6 +76,12 @@ void BattlegroundMgr::DeleteAllBattlegrounds() bgDataStore.clear(); } +BattlegroundMgr* BattlegroundMgr::instance() +{ + static BattlegroundMgr instance; + return &instance; +} + // used to update running battlegrounds, and delete finished ones void BattlegroundMgr::Update(uint32 diff) { @@ -536,7 +542,7 @@ void BattlegroundMgr::LoadBattlegroundTemplates() BattlemasterListEntry const* bl = sBattlemasterListStore.LookupEntry(bgTypeId); if (!bl) { - TC_LOG_ERROR("bg.battleground", "Battleground ID %u not found in BattlemasterList.dbc. Battleground not created.", bgTypeId); + TC_LOG_ERROR("bg.battleground", "Battleground ID %u could not be found in BattlemasterList.dbc. The battleground was not created.", bgTypeId); continue; } @@ -554,14 +560,14 @@ void BattlegroundMgr::LoadBattlegroundTemplates() if (bgTemplate.MaxPlayersPerTeam == 0 || bgTemplate.MinPlayersPerTeam > bgTemplate.MaxPlayersPerTeam) { - TC_LOG_ERROR("sql.sql", "Table `battleground_template` for id %u has bad values for MinPlayersPerTeam (%u) and MaxPlayersPerTeam(%u)", + TC_LOG_ERROR("sql.sql", "Table `battleground_template` for id %u contains bad values for MinPlayersPerTeam (%u) and MaxPlayersPerTeam(%u).", bgTemplate.Id, bgTemplate.MinPlayersPerTeam, bgTemplate.MaxPlayersPerTeam); continue; } if (bgTemplate.MinLevel == 0 || bgTemplate.MaxLevel == 0 || bgTemplate.MinLevel > bgTemplate.MaxLevel) { - TC_LOG_ERROR("sql.sql", "Table `battleground_template` for id %u has bad values for MinLevel (%u) and MaxLevel (%u)", + TC_LOG_ERROR("sql.sql", "Table `battleground_template` for id %u contains bad values for MinLevel (%u) and MaxLevel (%u).", bgTemplate.Id, bgTemplate.MinLevel, bgTemplate.MaxLevel); continue; } @@ -575,7 +581,7 @@ void BattlegroundMgr::LoadBattlegroundTemplates() } else { - TC_LOG_ERROR("sql.sql", "Table `battleground_template` for id %u has non-existed WorldSafeLocs.dbc id %u in field `AllianceStartLoc`. BG not created.", bgTemplate.Id, startId); + TC_LOG_ERROR("sql.sql", "Table `battleground_template` for id %u contains a non-existing WorldSafeLocs.dbc id %u in field `AllianceStartLoc`. BG not created.", bgTemplate.Id, startId); continue; } @@ -586,7 +592,7 @@ void BattlegroundMgr::LoadBattlegroundTemplates() } else { - TC_LOG_ERROR("sql.sql", "Table `battleground_template` for id %u has non-existed WorldSafeLocs.dbc id %u in field `HordeStartLoc`. BG not created.", bgTemplate.Id, startId); + TC_LOG_ERROR("sql.sql", "Table `battleground_template` for id %u contains a non-existing WorldSafeLocs.dbc id %u in field `HordeStartLoc`. BG not created.", bgTemplate.Id, startId); continue; } } @@ -788,7 +794,7 @@ BattlegroundTypeId BattlegroundMgr::BGTemplateId(BattlegroundQueueTypeId bgQueue case BATTLEGROUND_QUEUE_5v5: return BATTLEGROUND_AA; default: - return BattlegroundTypeId(0); // used for unknown template (it existed and do nothing) + return BattlegroundTypeId(0); // used for unknown template (it exists and does nothing) } } @@ -892,7 +898,7 @@ void BattlegroundMgr::LoadBattleMastersEntry() uint32 bgTypeId = fields[1].GetUInt32(); if (!sBattlemasterListStore.LookupEntry(bgTypeId)) { - TC_LOG_ERROR("sql.sql", "Table `battlemaster_entry` contain entry %u for not existed battleground type %u, ignored.", entry, bgTypeId); + TC_LOG_ERROR("sql.sql", "Table `battlemaster_entry` contains entry %u for a non-existing battleground type %u, ignored.", entry, bgTypeId); continue; } @@ -912,7 +918,7 @@ void BattlegroundMgr::CheckBattleMasters() { if ((itr->second.npcflag & UNIT_NPC_FLAG_BATTLEMASTER) && mBattleMastersMap.find(itr->second.Entry) == mBattleMastersMap.end()) { - TC_LOG_ERROR("sql.sql", "CreatureTemplate (Entry: %u) has UNIT_NPC_FLAG_BATTLEMASTER but no data in `battlemaster_entry` table. Removing flag!", itr->second.Entry); + TC_LOG_ERROR("sql.sql", "Creature_Template Entry: %u has UNIT_NPC_FLAG_BATTLEMASTER, but no data in the `battlemaster_entry` table. Removing flag.", itr->second.Entry); const_cast<CreatureTemplate*>(&itr->second)->npcflag &= ~UNIT_NPC_FLAG_BATTLEMASTER; } } diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.h b/src/server/game/Battlegrounds/BattlegroundMgr.h index 595745e53fb..50100ce47f6 100644 --- a/src/server/game/Battlegrounds/BattlegroundMgr.h +++ b/src/server/game/Battlegrounds/BattlegroundMgr.h @@ -62,11 +62,7 @@ class BattlegroundMgr ~BattlegroundMgr(); public: - static BattlegroundMgr* instance() - { - static BattlegroundMgr instance; - return &instance; - } + static BattlegroundMgr* instance(); void Update(uint32 diff); diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp index 626bcacbf27..e52106a8efe 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp @@ -171,7 +171,7 @@ void BattlegroundEY::CheckSomeoneJoinedPoint() Player* player = ObjectAccessor::FindPlayer(m_PlayersNearPoint[EY_POINTS_MAX][j]); if (!player) { - TC_LOG_ERROR("bg.battleground", "BattlegroundEY:CheckSomeoneJoinedPoint: Player (%s) not found!", m_PlayersNearPoint[EY_POINTS_MAX][j].ToString().c_str()); + TC_LOG_ERROR("bg.battleground", "BattlegroundEY:CheckSomeoneJoinedPoint: Player (%s) could not be found!", m_PlayersNearPoint[EY_POINTS_MAX][j].ToString().c_str()); ++j; continue; } @@ -212,8 +212,8 @@ void BattlegroundEY::CheckSomeoneLeftPoint() Player* player = ObjectAccessor::FindPlayer(m_PlayersNearPoint[i][j]); if (!player) { - TC_LOG_ERROR("bg.battleground", "BattlegroundEY:CheckSomeoneLeftPoint Player (%s) not found!", m_PlayersNearPoint[i][j].ToString().c_str()); - //move not existed player to "free space" - this will cause many error showing in log, but it is a very important bug + TC_LOG_ERROR("bg.battleground", "BattlegroundEY:CheckSomeoneLeftPoint Player (%s) could not be found!", m_PlayersNearPoint[i][j].ToString().c_str()); + //move non-existing players to "free space" - this will cause many errors showing in log, but it is a very important bug m_PlayersNearPoint[EY_POINTS_MAX].push_back(m_PlayersNearPoint[i][j]); m_PlayersNearPoint[i].erase(m_PlayersNearPoint[i].begin() + j); continue; @@ -498,7 +498,7 @@ bool BattlegroundEY::SetupBattleground() || !AddObject(BG_EY_OBJECT_TOWER_CAP_MAGE_TOWER, BG_OBJECT_HU_TOWER_CAP_EY_ENTRY, 2282.121582f, 1760.006958f, 1189.707153f, 1.919862f, 0, 0, 0.819152f, 0.573576f, RESPAWN_ONE_DAY) ) { - TC_LOG_ERROR("sql.sql", "BatteGroundEY: Failed to spawn some object Battleground not created!"); + TC_LOG_ERROR("sql.sql", "BatteGroundEY: Failed to spawn some objects. The battleground was not created."); return false; } @@ -515,21 +515,21 @@ bool BattlegroundEY::SetupBattleground() || !AddObject(BG_EY_OBJECT_SPEEDBUFF_FEL_REAVER + i * 3 + 1, Buff_Entries[1], at->x, at->y, at->z, 0.907571f, 0, 0, 0.438371f, 0.898794f, RESPAWN_ONE_DAY) || !AddObject(BG_EY_OBJECT_SPEEDBUFF_FEL_REAVER + i * 3 + 2, Buff_Entries[2], at->x, at->y, at->z, 0.907571f, 0, 0, 0.438371f, 0.898794f, RESPAWN_ONE_DAY) ) - TC_LOG_ERROR("bg.battleground", "BattlegroundEY: Cannot spawn buff"); + TC_LOG_ERROR("bg.battleground", "BattlegroundEY: Could not spawn Speedbuff Fel Reaver."); } WorldSafeLocsEntry const* sg = NULL; sg = sWorldSafeLocsStore.LookupEntry(EY_GRAVEYARD_MAIN_ALLIANCE); if (!sg || !AddSpiritGuide(EY_SPIRIT_MAIN_ALLIANCE, sg->x, sg->y, sg->z, 3.124139f, TEAM_ALLIANCE)) { - TC_LOG_ERROR("sql.sql", "BatteGroundEY: Failed to spawn spirit guide! Battleground not created!"); + TC_LOG_ERROR("sql.sql", "BatteGroundEY: Failed to spawn spirit guide. The battleground was not created."); return false; } sg = sWorldSafeLocsStore.LookupEntry(EY_GRAVEYARD_MAIN_HORDE); if (!sg || !AddSpiritGuide(EY_SPIRIT_MAIN_HORDE, sg->x, sg->y, sg->z, 3.193953f, TEAM_HORDE)) { - TC_LOG_ERROR("sql.sql", "BatteGroundEY: Failed to spawn spirit guide! Battleground not created!"); + TC_LOG_ERROR("sql.sql", "BatteGroundEY: Failed to spawn spirit guide. The battleground was not created."); return false; } @@ -595,7 +595,7 @@ void BattlegroundEY::RespawnFlagAfterDrop() if (obj) obj->Delete(); else - TC_LOG_ERROR("bg.battleground", "BattlegroundEY: Unknown dropped flag (%s)", GetDroppedFlagGUID().ToString().c_str()); + TC_LOG_ERROR("bg.battleground", "BattlegroundEY: Unknown dropped flag (%s).", GetDroppedFlagGUID().ToString().c_str()); SetDroppedFlagGUID(ObjectGuid::Empty); } @@ -767,7 +767,7 @@ void BattlegroundEY::EventTeamCapturedPoint(Player* player, uint32 Point) WorldSafeLocsEntry const* sg = NULL; sg = sWorldSafeLocsStore.LookupEntry(m_CapturingPointTypes[Point].GraveYardId); if (!sg || !AddSpiritGuide(Point, sg->x, sg->y, sg->z, 3.124139f, GetTeamIndexByTeamId(Team))) - TC_LOG_ERROR("bg.battleground", "BatteGroundEY: Failed to spawn spirit guide! point: %u, team: %u, graveyard_id: %u", + TC_LOG_ERROR("bg.battleground", "BatteGroundEY: Failed to spawn spirit guide. point: %u, team: %u, graveyard_id: %u", Point, Team, m_CapturingPointTypes[Point].GraveYardId); // SpawnBGCreature(Point, RESPAWN_IMMEDIATELY); @@ -917,7 +917,7 @@ WorldSafeLocsEntry const* BattlegroundEY::GetClosestGraveYard(Player* player) if (!entry) { - TC_LOG_ERROR("bg.battleground", "BattlegroundEY: Not found the main team graveyard. Graveyard system isn't working!"); + TC_LOG_ERROR("bg.battleground", "BattlegroundEY: The main team graveyard could not be found. The graveyard system will not be operational!"); return NULL; } @@ -934,7 +934,7 @@ WorldSafeLocsEntry const* BattlegroundEY::GetClosestGraveYard(Player* player) { entry = sWorldSafeLocsStore.LookupEntry(m_CapturingPointTypes[i].GraveYardId); if (!entry) - TC_LOG_ERROR("bg.battleground", "BattlegroundEY: Not found graveyard: %u", m_CapturingPointTypes[i].GraveYardId); + TC_LOG_ERROR("bg.battleground", "BattlegroundEY: Graveyard %u could not be found.", m_CapturingPointTypes[i].GraveYardId); else { distance = (entry->x - plr_x)*(entry->x - plr_x) + (entry->y - plr_y)*(entry->y - plr_y) + (entry->z - plr_z)*(entry->z - plr_z); diff --git a/src/server/game/CMakeLists.txt b/src/server/game/CMakeLists.txt index aae5b4874d8..58aec3aa1cf 100644 --- a/src/server/game/CMakeLists.txt +++ b/src/server/game/CMakeLists.txt @@ -108,6 +108,7 @@ include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/Addons ${CMAKE_CURRENT_SOURCE_DIR}/AI ${CMAKE_CURRENT_SOURCE_DIR}/AI/CoreAI + ${CMAKE_CURRENT_SOURCE_DIR}/AI/PlayerAI ${CMAKE_CURRENT_SOURCE_DIR}/AI/ScriptedAI ${CMAKE_CURRENT_SOURCE_DIR}/AI/SmartScripts ${CMAKE_CURRENT_SOURCE_DIR}/AuctionHouse @@ -195,6 +196,7 @@ include_directories( ${CMAKE_SOURCE_DIR}/src/server/shared/Dynamic/LinkedReference ${CMAKE_SOURCE_DIR}/src/server/shared/Networking ${CMAKE_SOURCE_DIR}/src/server/shared/Packets + ${CMAKE_SOURCE_DIR}/src/server/shared/Realm ${MYSQL_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR} ${VALGRIND_INCLUDE_DIR} diff --git a/src/server/game/Calendar/CalendarMgr.cpp b/src/server/game/Calendar/CalendarMgr.cpp index 9d50b290c5e..b27aac7876a 100644 --- a/src/server/game/Calendar/CalendarMgr.cpp +++ b/src/server/game/Calendar/CalendarMgr.cpp @@ -45,6 +45,12 @@ CalendarMgr::~CalendarMgr() delete *itr2; } +CalendarMgr* CalendarMgr::instance() +{ + static CalendarMgr instance; + return &instance; +} + void CalendarMgr::LoadFromDB() { uint32 count = 0; diff --git a/src/server/game/Calendar/CalendarMgr.h b/src/server/game/Calendar/CalendarMgr.h index 59303a18324..084685f372c 100644 --- a/src/server/game/Calendar/CalendarMgr.h +++ b/src/server/game/Calendar/CalendarMgr.h @@ -281,11 +281,7 @@ class CalendarMgr uint64 _maxInviteId; public: - static CalendarMgr* instance() - { - static CalendarMgr instance; - return &instance; - } + static CalendarMgr* instance(); void LoadFromDB(); diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp index 8fe0810f3b9..f0e98ee8c1f 100644 --- a/src/server/game/Chat/Chat.cpp +++ b/src/server/game/Chat/Chat.cpp @@ -108,7 +108,7 @@ bool ChatHandler::HasLowerSecurityAccount(WorldSession* target, uint32 target_ac if (target) target_sec = target->GetSecurity(); else if (target_account) - target_sec = AccountMgr::GetSecurity(target_account, realmID); + target_sec = AccountMgr::GetSecurity(target_account, realm.Id.Realm); else return true; // caller must report error for (target == NULL && target_account == 0) @@ -360,7 +360,7 @@ bool ChatHandler::SetDataForCommandInTable(std::vector<ChatCommand>& table, char // expected subcommand by full name DB content else if (*text) { - TC_LOG_ERROR("sql.sql", "Table `command` have unexpected subcommand '%s' in command '%s', skip.", text, fullcommand.c_str()); + TC_LOG_ERROR("sql.sql", "Table `command` contains an unexpected subcommand '%s' in command '%s', skipped.", text, fullcommand.c_str()); return false; } @@ -376,9 +376,9 @@ bool ChatHandler::SetDataForCommandInTable(std::vector<ChatCommand>& table, char if (!cmd.empty()) { if (&table == &getCommandTable()) - TC_LOG_ERROR("sql.sql", "Table `command` have not existed command '%s', skip.", cmd.c_str()); + TC_LOG_ERROR("sql.sql", "Table `command` contains a non-existing command '%s', skipped.", cmd.c_str()); else - TC_LOG_ERROR("sql.sql", "Table `command` have not existed subcommand '%s' in command '%s', skip.", cmd.c_str(), fullcommand.c_str()); + TC_LOG_ERROR("sql.sql", "Table `command` contains a non-existing subcommand '%s' in command '%s', skipped.", cmd.c_str(), fullcommand.c_str()); } return false; @@ -486,7 +486,7 @@ bool ChatHandler::ShowHelpForSubCommands(std::vector<ChatCommand> const& table, std::string list; for (uint32 i = 0; i < table.size(); ++i) { - // must be available (ignore handler existence for show command with possible available subcommands) + // must be available (ignore handler existence to show command with possible available subcommands) if (!isAvailable(table[i])) continue; @@ -525,7 +525,7 @@ bool ChatHandler::ShowHelpForCommand(std::vector<ChatCommand> const& table, cons { for (uint32 i = 0; i < table.size(); ++i) { - // must be available (ignore handler existence for show command with possible available subcommands) + // must be available (ignore handler existence to show command with possible available subcommands) if (!isAvailable(table[i])) continue; @@ -555,7 +555,7 @@ bool ChatHandler::ShowHelpForCommand(std::vector<ChatCommand> const& table, cons { for (uint32 i = 0; i < table.size(); ++i) { - // must be available (ignore handler existence for show command with possible available subcommands) + // must be available (ignore handler existence to show command with possible available subcommands) if (!isAvailable(table[i])) continue; @@ -1100,7 +1100,7 @@ bool ChatHandler::extractPlayerTarget(char* args, Player** player, ObjectGuid* p *player_name = pl ? pl->GetName() : ""; } - // some from req. data must be provided (note: name is empty if player not exist) + // some from req. data must be provided (note: name is empty if player does not exist) if ((!player || !*player) && (!player_guid || !*player_guid) && (!player_name || player_name->empty())) { SendSysMessage(LANG_PLAYER_NOT_FOUND); diff --git a/src/server/game/Combat/ThreatManager.cpp b/src/server/game/Combat/ThreatManager.cpp index 588e7b1a93b..9767d69e2aa 100644 --- a/src/server/game/Combat/ThreatManager.cpp +++ b/src/server/game/Combat/ThreatManager.cpp @@ -335,7 +335,7 @@ HostileReference* ThreatContainer::selectNextVictim(Creature* attacker, HostileR { // current victim is a second choice target, so don't compare threat with it below if (currentRef == currentVictim) - currentVictim = NULL; + currentVictim = nullptr; ++iter; continue; } @@ -437,12 +437,15 @@ void ThreatManager::_addThreat(Unit* victim, float threat) if (!ref) // there was no ref => create a new one { + bool isFirst = iThreatContainer.empty(); // threat has to be 0 here HostileReference* hostileRef = new HostileReference(victim, this, 0); iThreatContainer.addReference(hostileRef); hostileRef->addThreat(threat); // now we add the real threat if (victim->GetTypeId() == TYPEID_PLAYER && victim->ToPlayer()->IsGameMaster()) hostileRef->setOnlineOfflineState(false); // GM is always offline + else if (isFirst) + setCurrentVictim(hostileRef); } } diff --git a/src/server/game/Combat/ThreatManager.h b/src/server/game/Combat/ThreatManager.h index 7d20e99c128..0f4efdbeab9 100644 --- a/src/server/game/Combat/ThreatManager.h +++ b/src/server/game/Combat/ThreatManager.h @@ -169,7 +169,7 @@ class ThreatContainer HostileReference* getMostHated() const { - return iThreatList.empty() ? NULL : iThreatList.front(); + return iThreatList.empty() ? nullptr : iThreatList.front(); } HostileReference* getReferenceByTarget(Unit* victim) const; diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index 4215a3a5d02..50e3e64ea2c 100644 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -55,7 +55,8 @@ char const* const ConditionMgr::StaticSourceTypeData[CONDITION_SOURCE_TYPE_MAX] "SmartScript", "Npc Vendor", "Spell Proc", - "Phase Def" + "Terrain Swap", + "Phase" }; ConditionMgr::ConditionTypeInfo const ConditionMgr::StaticConditionTypeData[CONDITION_MAX] = @@ -100,7 +101,9 @@ ConditionMgr::ConditionTypeInfo const ConditionMgr::StaticConditionTypeData[COND { "Health Value", true, true, false }, { "Health Pct", true, true, false }, { "Realm Achievement", true, false, false }, - { "In Water", false, false, false } + { "In Water", false, false, false }, + { "Terrain Swap", false, false, false }, + { "Sit/stand state", true, true, false } }; // Checks if object meets the condition @@ -432,6 +435,19 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo) const condMeets = unit->IsInWater(); break; } + case CONDITION_STAND_STATE: + { + if (Unit* unit = object->ToUnit()) + { + if (ConditionValue1 == 0) + condMeets = (unit->getStandState() == ConditionValue2); + else if (ConditionValue2 == 0) + condMeets = unit->IsStandState(); + else if (ConditionValue2 == 1) + condMeets = unit->IsSitState(); + } + break; + } default: condMeets = false; break; @@ -602,6 +618,9 @@ uint32 Condition::GetSearcherTypeMaskForCondition() const case CONDITION_IN_WATER: mask |= GRID_MAP_TYPE_MASK_CREATURE | GRID_MAP_TYPE_MASK_PLAYER; break; + case CONDITION_STAND_STATE: + mask |= GRID_MAP_TYPE_MASK_CREATURE | GRID_MAP_TYPE_MASK_PLAYER; + break; default: ASSERT(false && "Condition::GetSearcherTypeMaskForCondition - missing condition handling!"); break; @@ -909,6 +928,12 @@ bool ConditionMgr::IsObjectMeetingVendorItemConditions(uint32 creatureId, uint32 return true; } +ConditionMgr* ConditionMgr::instance() +{ + static ConditionMgr instance; + return &instance; +} + void ConditionMgr::LoadConditions(bool isReload) { uint32 oldMSTime = getMSTime(); @@ -1633,9 +1658,14 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond) const } break; } - case CONDITION_SOURCE_TYPE_PHASE_DEFINITION: + case CONDITION_SOURCE_TYPE_TERRAIN_SWAP: { - TC_LOG_ERROR("sql.sql", "CONDITION_SOURCE_TYPE_PHASE_DEFINITION:: is only for 4.3.4 branch, skipped"); + TC_LOG_ERROR("sql.sql", "CONDITION_SOURCE_TYPE_TERRAIN_SWAP: is only for 6.x branch, skipped"); + return false; + } + case CONDITION_SOURCE_TYPE_PHASE: + { + TC_LOG_ERROR("sql.sql", "CONDITION_SOURCE_TYPE_PHASE: is only for 6.x branch, skipped"); return false; } case CONDITION_SOURCE_TYPE_GOSSIP_MENU: @@ -1653,7 +1683,7 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) const { if (cond->ConditionType == CONDITION_NONE || cond->ConditionType >= CONDITION_MAX) { - TC_LOG_ERROR("sql.sql", "%s Invalid ConditionType in `condition` table, ignoring.", cond->ToString().c_str()); + TC_LOG_ERROR("sql.sql", "%s Invalid ConditionType in `condition` table, ignoring.", cond->ToString(true).c_str()); return false; } @@ -2090,6 +2120,31 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) const } case CONDITION_IN_WATER: break; + case CONDITION_TERRAIN_SWAP: + TC_LOG_ERROR("sql.sql", "%s is not valid for this branch, skipped.", cond->ToString(true).c_str()); + return false; + case CONDITION_STAND_STATE: + { + bool valid = false; + switch (cond->ConditionValue1) + { + case 0: + valid = cond->ConditionValue2 <= UNIT_STAND_STATE_SUBMERGED; + break; + case 1: + valid = cond->ConditionValue2 <= 1; + break; + default: + valid = false; + break; + } + if (!valid) + { + TC_LOG_ERROR("sql.sql", "%s has non-existing stand state (%u,%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue1, cond->ConditionValue2); + return false; + } + break; + } default: break; } diff --git a/src/server/game/Conditions/ConditionMgr.h b/src/server/game/Conditions/ConditionMgr.h index 35096ae18ff..0b49552acb4 100644 --- a/src/server/game/Conditions/ConditionMgr.h +++ b/src/server/game/Conditions/ConditionMgr.h @@ -71,7 +71,9 @@ enum ConditionTypes CONDITION_HP_PCT = 38, // hpPct ComparisonType 0 true if unit's hp matches given pct CONDITION_REALM_ACHIEVEMENT = 39, // achievement_id 0 0 true if realm achievement is complete CONDITION_IN_WATER = 40, // 0 0 0 true if unit in water - CONDITION_MAX = 41 // MAX + CONDITION_TERRAIN_SWAP = 41, // only for 6.x + CONDITION_STAND_STATE = 42, // stateType state 0 true if unit matches specified sitstate (0,x: has exactly state x; 1,0: any standing state; 1,1: any sitting state;) + CONDITION_MAX = 43 // MAX }; /*! Documentation on implementing a new ConditionSourceType: @@ -128,8 +130,9 @@ enum ConditionSourceType CONDITION_SOURCE_TYPE_SMART_EVENT = 22, CONDITION_SOURCE_TYPE_NPC_VENDOR = 23, CONDITION_SOURCE_TYPE_SPELL_PROC = 24, - CONDITION_SOURCE_TYPE_PHASE_DEFINITION = 25, // only 4.3.4 - CONDITION_SOURCE_TYPE_MAX = 26 // MAX + CONDITION_SOURCE_TYPE_TERRAIN_SWAP = 25, // only 6.x + CONDITION_SOURCE_TYPE_PHASE = 26, // only 6.x + CONDITION_SOURCE_TYPE_MAX = 27 // MAX }; enum RelationType @@ -228,11 +231,7 @@ class ConditionMgr ~ConditionMgr(); public: - static ConditionMgr* instance() - { - static ConditionMgr instance; - return &instance; - } + static ConditionMgr* instance(); void LoadConditions(bool isReload = false); bool isConditionTypeValid(Condition* cond) const; diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index b0a1777f19a..fe997bc0343 100644 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -261,6 +261,12 @@ void LFGMgr::LoadLFGDungeons(bool reload /* = false */) } } +LFGMgr* LFGMgr::instance() +{ + static LFGMgr instance; + return &instance; +} + void LFGMgr::Update(uint32 diff) { if (!isOptionEnabled(LFG_OPTION_ENABLE_DUNGEON_FINDER | LFG_OPTION_ENABLE_RAID_BROWSER)) diff --git a/src/server/game/DungeonFinding/LFGMgr.h b/src/server/game/DungeonFinding/LFGMgr.h index 90a8d802f9d..7be08d448db 100644 --- a/src/server/game/DungeonFinding/LFGMgr.h +++ b/src/server/game/DungeonFinding/LFGMgr.h @@ -296,11 +296,7 @@ class LFGMgr ~LFGMgr(); public: - static LFGMgr* instance() - { - static LFGMgr instance; - return &instance; - } + static LFGMgr* instance(); // Functions used outside lfg namespace void Update(uint32 diff); diff --git a/src/server/game/Entities/Corpse/Corpse.cpp b/src/server/game/Entities/Corpse/Corpse.cpp index 8f700cc636f..22bb9bca712 100644 --- a/src/server/game/Entities/Corpse/Corpse.cpp +++ b/src/server/game/Entities/Corpse/Corpse.cpp @@ -147,7 +147,7 @@ bool Corpse::LoadCorpseFromDB(ObjectGuid::LowType guid, Field* fields) SetObjectScale(1.0f); SetUInt32Value(CORPSE_FIELD_DISPLAY_ID, fields[5].GetUInt32()); - _LoadIntoDataField(fields[6].GetCString(), CORPSE_FIELD_ITEM, EQUIPMENT_SLOT_END); + _LoadIntoDataField(fields[6].GetString(), CORPSE_FIELD_ITEM, EQUIPMENT_SLOT_END); SetUInt32Value(CORPSE_FIELD_BYTES_1, fields[7].GetUInt32()); SetUInt32Value(CORPSE_FIELD_BYTES_2, fields[8].GetUInt32()); SetUInt32Value(CORPSE_FIELD_GUILD, fields[9].GetUInt32()); diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 5d62b740947..c677a467ddc 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -578,7 +578,8 @@ void Creature::Update(uint32 diff) IsAIEnabled = true; if (!IsInEvadeMode() && LastCharmerGUID) if (Unit* charmer = ObjectAccessor::GetUnit(*this, LastCharmerGUID)) - i_AI->AttackStart(charmer); + if (CanStartAttack(charmer, true)) + i_AI->AttackStart(charmer); LastCharmerGUID.Clear(); } @@ -1356,8 +1357,8 @@ bool Creature::LoadCreatureFromDB(ObjectGuid::LowType spawnId, Map* map, bool ad m_deathState = DEAD; if (CanFly()) { - float tz = map->GetHeight(GetPhaseMask(), data->posX, data->posY, data->posZ, false); - if (data->posZ - tz > 0.1f) + float tz = map->GetHeight(GetPhaseMask(), data->posX, data->posY, data->posZ, true, MAX_FALL_DISTANCE); + if (data->posZ - tz > 0.1f && Trinity::IsValidMapCoord(tz)) Relocate(data->posX, data->posY, tz); } } diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 49bd854ef2f..0803345f4f0 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -479,7 +479,7 @@ class Creature : public Unit, public GridObject<Creature>, public MapObject bool AIM_Initialize(CreatureAI* ai = NULL); void Motion_Initialize(); - CreatureAI* AI() const { return (CreatureAI*)i_AI; } + CreatureAI* AI() const { return reinterpret_cast<CreatureAI*>(i_AI); } bool SetWalk(bool enable) override; bool SetDisableGravity(bool disable, bool packetOnly = false) override; diff --git a/src/server/game/Entities/Creature/CreatureGroups.cpp b/src/server/game/Entities/Creature/CreatureGroups.cpp index 9f26c927374..0c41089efce 100644 --- a/src/server/game/Entities/Creature/CreatureGroups.cpp +++ b/src/server/game/Entities/Creature/CreatureGroups.cpp @@ -30,6 +30,12 @@ FormationMgr::~FormationMgr() delete itr->second; } +FormationMgr* FormationMgr::instance() +{ + static FormationMgr instance; + return &instance; +} + void FormationMgr::AddCreatureToGroup(uint32 leaderGuid, Creature* creature) { Map* map = creature->FindMap(); diff --git a/src/server/game/Entities/Creature/CreatureGroups.h b/src/server/game/Entities/Creature/CreatureGroups.h index 7b16585a996..d337d388b6e 100644 --- a/src/server/game/Entities/Creature/CreatureGroups.h +++ b/src/server/game/Entities/Creature/CreatureGroups.h @@ -45,11 +45,7 @@ class FormationMgr ~FormationMgr(); public: - static FormationMgr* instance() - { - static FormationMgr instance; - return &instance; - } + static FormationMgr* instance(); void AddCreatureToGroup(uint32 group_id, Creature* creature); void RemoveCreatureFromGroup(CreatureGroup* group, Creature* creature); diff --git a/src/server/game/Entities/Creature/TemporarySummon.cpp b/src/server/game/Entities/Creature/TemporarySummon.cpp index 8bf3a1e2846..12e3af3c290 100644 --- a/src/server/game/Entities/Creature/TemporarySummon.cpp +++ b/src/server/game/Entities/Creature/TemporarySummon.cpp @@ -227,6 +227,11 @@ void TempSummon::InitSummon() } } +void TempSummon::UpdateObjectVisibilityOnCreate() +{ + WorldObject::UpdateObjectVisibility(true); +} + void TempSummon::SetTempSummonType(TempSummonType type) { m_type = type; diff --git a/src/server/game/Entities/Creature/TemporarySummon.h b/src/server/game/Entities/Creature/TemporarySummon.h index 6d058f405a8..b80e7d3e2bc 100644 --- a/src/server/game/Entities/Creature/TemporarySummon.h +++ b/src/server/game/Entities/Creature/TemporarySummon.h @@ -45,6 +45,7 @@ class TempSummon : public Creature void Update(uint32 time) override; virtual void InitStats(uint32 lifetime); virtual void InitSummon(); + void UpdateObjectVisibilityOnCreate() override; virtual void UnSummon(uint32 msTime = 0); void RemoveFromWorld() override; void SetTempSummonType(TempSummonType type); diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 70fa4714547..773d5a05772 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -447,8 +447,7 @@ bool Item::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid owner_guid, Field* fi need_save = true; } - std::string enchants = fields[6].GetString(); - _LoadIntoDataField(enchants.c_str(), ITEM_FIELD_ENCHANTMENT_1_1, MAX_ENCHANTMENT_SLOT * MAX_ENCHANTMENT_OFFSET); + _LoadIntoDataField(fields[6].GetString(), ITEM_FIELD_ENCHANTMENT_1_1, MAX_ENCHANTMENT_SLOT * MAX_ENCHANTMENT_OFFSET); SetInt32Value(ITEM_FIELD_RANDOM_PROPERTIES_ID, fields[7].GetInt16()); // recalculate suffix factor if (GetItemRandomPropertyId() < 0) diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 4877ff094e1..836a041abc3 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -1878,7 +1878,9 @@ TempSummon* Map::SummonCreature(uint32 entry, Position const& pos, SummonPropert AddToMap(summon->ToCreature()); summon->InitSummon(); - //ObjectAccessor::UpdateObjectVisibility(summon); + // call MoveInLineOfSight for nearby creatures + Trinity::AIRelocationNotifier notifier(*summon); + summon->VisitNearbyObject(GetVisibilityRange(), notifier); return summon; } diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 419044081e3..ba03c16fa1e 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -555,6 +555,11 @@ class WorldObject : public Object, public WorldLocation void DestroyForNearbyPlayers(); virtual void UpdateObjectVisibility(bool forced = true); + virtual void UpdateObjectVisibilityOnCreate() + { + UpdateObjectVisibility(true); + } + void BuildUpdate(UpdateDataMapType&) override; void AddToObjectUpdate() override; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 464c3125ce4..4c3f7289b11 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -213,7 +213,7 @@ void PlayerTaxi::AppendTaximaskTo(ByteBuffer& data, bool all) if (all) { for (uint8 i = 0; i < TaxiMaskSize; ++i) - data << uint32(sTaxiNodesMask[i]); // all existed nodes + data << uint32(sTaxiNodesMask[i]); // all existing nodes } else { @@ -306,7 +306,7 @@ Player::Player(WorldSession* session): Unit(true) m_ExtraFlags = 0; - m_spellModTakingSpell = NULL; + m_spellModTakingSpell = nullptr; //m_pad = 0; // players always accept @@ -336,15 +336,15 @@ Player::Player(WorldSession* session): Unit(true) memset(m_items, 0, sizeof(Item*)*PLAYER_SLOTS_COUNT); - m_social = NULL; + m_social = nullptr; // group is initialized in the reference constructor - SetGroupInvite(NULL); + SetGroupInvite(nullptr); m_groupUpdateMask = 0; m_auraRaidUpdateMask = 0; m_bPassOnGroupLoot = false; - duel = NULL; + duel = nullptr; m_GuildIdInvited = 0; m_ArenaTeamIdInvited = 0; @@ -359,7 +359,7 @@ Player::Player(WorldSession* session): Unit(true) m_bHasDelayedTeleport = false; m_teleport_options = 0; - m_trade = NULL; + m_trade = nullptr; m_cinematic = 0; @@ -394,7 +394,7 @@ Player::Player(WorldSession* session): Unit(true) m_bgBattlegroundQueueID[j].invitedToInstance = 0; } - m_logintime = time(NULL); + m_logintime = time(nullptr); m_Last_tick = m_logintime; m_Played_time[PLAYED_TIME_TOTAL] = 0; m_Played_time[PLAYED_TIME_LEVEL] = 0; @@ -470,7 +470,7 @@ Player::Player(WorldSession* session): Unit(true) m_spellPenetrationItemMod = 0; // Honor System - m_lastHonorUpdateTime = time(NULL); + m_lastHonorUpdateTime = time(nullptr); m_IsBGRandomWinner = false; @@ -499,11 +499,11 @@ Player::Player(WorldSession* session): Unit(true) m_contestedPvPTimer = 0; - m_declinedname = NULL; + m_declinedname = nullptr; m_isActive = true; - m_runes = NULL; + m_runes = nullptr; m_lastFallTime = 0; m_lastFallZ = 0; @@ -543,7 +543,7 @@ Player::Player(WorldSession* session): Unit(true) Player::~Player() { - // it must be unloaded already in PlayerLogout and accessed only for loggined player + // it must be unloaded already in PlayerLogout and accessed only for logged in player //m_social = NULL; // Note: buy back item already deleted from DB when player was saved @@ -605,20 +605,20 @@ bool Player::Create(ObjectGuid::LowType guidlow, CharacterCreateInfo* createInfo PlayerInfo const* info = sObjectMgr->GetPlayerInfo(createInfo->Race, createInfo->Class); if (!info) { - TC_LOG_ERROR("entities.player", "Player::Create: Possible hacking-attempt: Account %u tried creating a character named '%s' with an invalid race/class pair (%u/%u) - refusing to do so.", + TC_LOG_ERROR("entities.player", "Player::Create: Possible hacking attempt: Account %u tried to create a character named '%s' with an invalid race/class pair (%u/%u) - refusing to do so.", GetSession()->GetAccountId(), m_name.c_str(), createInfo->Race, createInfo->Class); return false; } for (uint8 i = 0; i < PLAYER_SLOTS_COUNT; i++) - m_items[i] = NULL; + m_items[i] = nullptr; Relocate(info->positionX, info->positionY, info->positionZ, info->orientation); ChrClassesEntry const* cEntry = sChrClassesStore.LookupEntry(createInfo->Class); if (!cEntry) { - TC_LOG_ERROR("entities.player", "Player::Create: Possible hacking-attempt: Account %u tried creating a character named '%s' with an invalid character class (%u) - refusing to do so (wrong DBC-files?)", + TC_LOG_ERROR("entities.player", "Player::Create: Possible hacking attempt: Account %u tried to create a character named '%s' with an invalid character class (%u) - refusing to do so (wrong DBC-files?)", GetSession()->GetAccountId(), m_name.c_str(), createInfo->Class); return false; } @@ -633,14 +633,14 @@ bool Player::Create(ObjectGuid::LowType guidlow, CharacterCreateInfo* createInfo if (!IsValidGender(createInfo->Gender)) { - TC_LOG_ERROR("entities.player", "Player::Create: Possible hacking-attempt: Account %u tried creating a character named '%s' with an invalid gender (%u) - refusing to do so", + TC_LOG_ERROR("entities.player", "Player::Create: Possible hacking attempt: Account %u tried to create a character named '%s' with an invalid gender (%u) - refusing to do so", GetSession()->GetAccountId(), m_name.c_str(), createInfo->Gender); return false; } if (!ValidateAppearance(createInfo->Race, createInfo->Class, createInfo->Gender, createInfo->HairStyle, createInfo->HairColor, createInfo->Face, createInfo->FacialHair, createInfo->Skin, true)) { - TC_LOG_ERROR("entities.player", "Player::Create: Possible hacking-attempt: Account %u tried creating a character named '%s' with invalid appearance attributes - refusing to do so", + TC_LOG_ERROR("entities.player", "Player::Create: Possible hacking attempt: Account %u tried to create a character named '%s' with invalid appearance attributes - refusing to do so", GetSession()->GetAccountId(), m_name.c_str()); return false; } @@ -752,7 +752,7 @@ bool Player::Create(ObjectGuid::LowType guidlow, CharacterCreateInfo* createInfo } // Played time - m_Last_tick = time(NULL); + m_Last_tick = time(nullptr); m_Played_time[PLAYED_TIME_TOTAL] = 0; m_Played_time[PLAYED_TIME_LEVEL] = 0; @@ -851,7 +851,7 @@ bool Player::Create(ObjectGuid::LowType guidlow, CharacterCreateInfo* createInfo if (msg == EQUIP_ERR_OK) { RemoveItem(INVENTORY_SLOT_BAG_0, i, true); - pItem = StoreItem(sDest, pItem, true); + StoreItem(sDest, pItem, true); } // if this is ammo then use it @@ -868,7 +868,8 @@ bool Player::Create(ObjectGuid::LowType guidlow, CharacterCreateInfo* createInfo bool Player::StoreNewItemInBestSlots(uint32 titem_id, uint32 titem_amount) { - TC_LOG_DEBUG("entities.player.items", "STORAGE: Creating initial item, itemId = %u, count = %u", titem_id, titem_amount); + TC_LOG_DEBUG("entities.player.items", "Player::StoreNewItemInBestSlots: Player '%s' (%s) creates initial item (ItemID: %u, Count: %u)", + GetName().c_str(), GetGUID().ToString().c_str(), titem_id, titem_amount); // attempt equip by one while (titem_amount > 0) @@ -897,7 +898,8 @@ bool Player::StoreNewItemInBestSlots(uint32 titem_id, uint32 titem_amount) } // item can't be added - TC_LOG_ERROR("entities.player.items", "STORAGE: Can't equip or store initial item %u for race %u class %u, error msg = %u", titem_id, getRace(), getClass(), msg); + TC_LOG_ERROR("entities.player.items", "Player::StoreNewItemInBestSlots: Player '%s' (%s) can't equip or store initial item (ItemID: %u, Race: %u, Class: %u, InventoryResult: %u)", + GetName().c_str(), GetGUID().ToString().c_str(), titem_id, getRace(), getClass(), msg); return false; } @@ -927,10 +929,10 @@ void Player::StopMirrorTimer(MirrorTimerType Type) GetSession()->SendPacket(&data); } -bool Player::IsImmuneToEnvironmentalDamage() +bool Player::IsImmuneToEnvironmentalDamage() const { // check for GM and death state included in isAttackableByAOE - return (!isTargetableForAttack(false)); + return !isTargetableForAttack(false); } uint32 Player::EnvironmentalDamage(EnviromentalDamage type, uint32 damage) @@ -958,13 +960,14 @@ uint32 Player::EnvironmentalDamage(EnviromentalDamage type, uint32 damage) data << uint32(resist); SendMessageToSet(&data, true); - uint32 final_damage = DealDamage(this, damage, NULL, SELF_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); + uint32 final_damage = DealDamage(this, damage, nullptr, SELF_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, nullptr, false); if (!IsAlive()) { - if (type == DAMAGE_FALL) // DealDamage not apply item durability loss at self damage + if (type == DAMAGE_FALL) // DealDamage does not apply item durability loss from self-induced damage. { - TC_LOG_DEBUG("entities.player", "We are fall to death, loosing 10 percents durability"); + TC_LOG_DEBUG("entities.player", "Player::EnvironmentalDamage: Player '%s' (%s) fall to death, losing 10%% durability", + GetName().c_str(), GetGUID().ToString().c_str()); DurabilityLossAll(0.10f, false); // durability lost message WorldPacket data2(SMSG_DURABILITY_DAMAGE_DEATH, 0); @@ -977,7 +980,7 @@ uint32 Player::EnvironmentalDamage(EnviromentalDamage type, uint32 damage) return final_damage; } -int32 Player::getMaxTimer(MirrorTimerType timer) +int32 Player::getMaxTimer(MirrorTimerType timer) const { switch (timer) { @@ -1018,7 +1021,7 @@ void Player::StopMirrorTimers() StopMirrorTimer(FIRE_TIMER); } -bool Player::IsMirrorTimerActive(MirrorTimerType type) +bool Player::IsMirrorTimerActive(MirrorTimerType type) const { return m_MirrorTimer[type] == getMaxTimer(type); } @@ -1200,7 +1203,7 @@ void Player::Update(uint32 p_time) return; // undelivered mail - if (m_nextMailDelivereTime && m_nextMailDelivereTime <= time(NULL)) + if (m_nextMailDelivereTime && m_nextMailDelivereTime <= time(nullptr)) { SendNewMail(); ++unReadMails; @@ -1216,16 +1219,17 @@ void Player::Update(uint32 p_time) { //TC_LOG_FATAL("entities.player", "Player has m_pad %u during update!", m_pad); //if (m_spellModTakingSpell) - TC_LOG_FATAL("spells", "Player has m_spellModTakingSpell %u during update!", m_spellModTakingSpell->m_spellInfo->Id); - m_spellModTakingSpell = NULL; + TC_LOG_FATAL("spells", "Player::Update: Player '%s' (%s) has m_spellModTakingSpell (SpellID: %u) during update!", + GetName().c_str(), GetGUID().ToString().c_str(), m_spellModTakingSpell->m_spellInfo->Id); + m_spellModTakingSpell = nullptr; } - //used to implement delayed far teleports + //used to implement delayed far teleport SetCanDelayTeleport(true); Unit::Update(p_time); SetCanDelayTeleport(false); - time_t now = time(NULL); + time_t now = time(nullptr); UpdatePvPFlag(now); @@ -1237,13 +1241,14 @@ void Player::Update(uint32 p_time) UpdateAfkReport(now); - if (IsCharmed()) - if (Unit* charmer = GetCharmer()) - if (charmer->GetTypeId() == TYPEID_UNIT && charmer->IsAlive()) - UpdateCharmedAI(); - - if (GetAI() && IsAIEnabled) + if (IsAIEnabled && GetAI()) GetAI()->UpdateAI(p_time); + else if (NeedChangeAI) + { + UpdateCharmAI(); + NeedChangeAI = false; + IsAIEnabled = (GetAI() != nullptr); + } // Update items that have just a limited lifetime if (now > m_Last_tick) @@ -1441,7 +1446,7 @@ void Player::Update(uint32 p_time) { // m_nextSave reset in SaveToDB call SaveToDB(); - TC_LOG_DEBUG("entities.player", "Player '%s' (GUID: %u) saved", GetName().c_str(), GetGUID().GetCounter()); + TC_LOG_DEBUG("entities.player", "Player::Update: Player '%s' (%s) saved", GetName().c_str(), GetGUID().ToString().c_str()); } else m_nextSave -= p_time; @@ -1551,7 +1556,7 @@ void Player::setDeathState(DeathState s) { if (!cur) { - TC_LOG_ERROR("entities.player", "setDeathState: attempt to kill a dead player %s(%d)", GetName().c_str(), GetGUID().GetCounter()); + TC_LOG_ERROR("entities.player", "Player::setDeathState: Attempt to kill a dead player '%s' (%s)", GetName().c_str(), GetGUID().ToString().c_str()); return; } @@ -1563,7 +1568,7 @@ void Player::setDeathState(DeathState s) clearResurrectRequestData(); //FIXME: is pet dismissed at dying or releasing spirit? if second, add setDeathState(DEAD) to HandleRepopRequestOpcode and define pet unsummon here with (s == DEAD) - RemovePet(NULL, PET_SAVE_NOT_IN_SLOT, true); + RemovePet(nullptr, PET_SAVE_NOT_IN_SLOT, true); // save value before aura remove in Unit::setDeathState ressSpellId = GetUInt32Value(PLAYER_SELF_RES_SPELL); @@ -1592,12 +1597,14 @@ void Player::setDeathState(DeathState s) bool Player::BuildEnumData(PreparedQueryResult result, WorldPacket* data) { - // 0 1 2 3 4 5 6 7 - // "SELECT characters.guid, characters.name, characters.race, characters.class, characters.gender, characters.playerBytes, characters.playerBytes2, characters.level, " - // 8 9 10 11 12 13 14 - // "characters.zone, characters.map, characters.position_x, characters.position_y, characters.position_z, guild_member.guildid, characters.playerFlags, " - // 15 16 17 18 19 20 21 - // "characters.at_login, character_pet.entry, character_pet.modelid, character_pet.level, characters.data, character_banned.guid, character_declinedname.genitive " + // 0 1 2 3 4 5 6 7 + // SELECT characters.guid, characters.name, characters.race, characters.class, characters.gender, characters.skin, characters.face, characters.hairStyle, + // 8 9 10 11 12 13 14 15 + // characters.hairColor, characters.facialStyle, characters.level, characters.zone, characters.map, characters.position_x, characters.position_y, characters.position_z, + // 16 17 18 19 20 21 22 + // guild_member.guildid, characters.playerFlags, characters.at_login, character_pet.entry, character_pet.modelid, character_pet.level, characters.equipmentCache, + // 23 24 + // character_banned.guid, character_declinedname.genitive Field* fields = result->Fetch(); @@ -1624,12 +1631,15 @@ bool Player::BuildEnumData(PreparedQueryResult result, WorldPacket* data) *data << uint8(plrClass); // class *data << uint8(gender); // gender - uint32 playerBytes = fields[5].GetUInt32(); - uint32 playerBytes2 = fields[6].GetUInt32(); + uint8 skin = fields[5].GetUInt8(); + uint8 face = fields[6].GetUInt8(); + uint8 hairStyle = fields[7].GetUInt8(); + uint8 hairColor = fields[8].GetUInt8(); + uint8 facialStyle = fields[9].GetUInt8(); - uint16 atLoginFlags = fields[15].GetUInt16(); + uint16 atLoginFlags = fields[18].GetUInt16(); - if (!ValidateAppearance(uint8(plrRace), uint8(plrClass), gender, uint8(playerBytes >> 16), uint8(playerBytes >> 24), uint8(playerBytes >> 8), uint8(playerBytes2), uint8(playerBytes))) + if (!ValidateAppearance(uint8(plrRace), uint8(plrClass), gender, hairStyle, hairColor, face, facialStyle, skin)) { TC_LOG_ERROR("entities.player.loading", "Player %u has wrong Appearance values (Hair/Skin/Color), forcing recustomize", guid); @@ -1643,25 +1653,24 @@ bool Player::BuildEnumData(PreparedQueryResult result, WorldPacket* data) } } - *data << uint8(playerBytes); // skin - *data << uint8(playerBytes >> 8); // face - *data << uint8(playerBytes >> 16); // hair style - *data << uint8(playerBytes >> 24); // hair color + *data << uint8(skin); + *data << uint8(face); + *data << uint8(hairStyle); + *data << uint8(hairColor); + *data << uint8(facialStyle); - *data << uint8(playerBytes2 & 0xFF); // facial hair + *data << uint8(fields[10].GetUInt8()); // level + *data << uint32(fields[11].GetUInt16()); // zone + *data << uint32(fields[12].GetUInt16()); // map - *data << uint8(fields[7].GetUInt8()); // level - *data << uint32(fields[8].GetUInt16()); // zone - *data << uint32(fields[9].GetUInt16()); // map + *data << fields[13].GetFloat(); // x + *data << fields[14].GetFloat(); // y + *data << fields[15].GetFloat(); // z - *data << fields[10].GetFloat(); // x - *data << fields[11].GetFloat(); // y - *data << fields[12].GetFloat(); // z - - *data << uint32(fields[13].GetUInt32()); // guild id + *data << uint32(fields[16].GetUInt32()); // guild id uint32 charFlags = 0; - uint32 playerFlags = fields[14].GetUInt32(); + uint32 playerFlags = fields[17].GetUInt32(); if (atLoginFlags & AT_LOGIN_RESURRECT) playerFlags &= ~PLAYER_FLAGS_GHOST; if (playerFlags & PLAYER_FLAGS_HIDE_HELM) @@ -1672,11 +1681,11 @@ bool Player::BuildEnumData(PreparedQueryResult result, WorldPacket* data) charFlags |= CHARACTER_FLAG_GHOST; if (atLoginFlags & AT_LOGIN_RENAME) charFlags |= CHARACTER_FLAG_RENAME; - if (fields[20].GetUInt32()) + if (fields[23].GetUInt32()) charFlags |= CHARACTER_FLAG_LOCKED_BY_BILLING; if (sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED)) { - if (!fields[21].GetString().empty()) + if (!fields[24].GetString().empty()) charFlags |= CHARACTER_FLAG_DECLINED; } else @@ -1705,12 +1714,12 @@ bool Player::BuildEnumData(PreparedQueryResult result, WorldPacket* data) // show pet at selection character in character list only for non-ghost character if (result && !(playerFlags & PLAYER_FLAGS_GHOST) && (plrClass == CLASS_WARLOCK || plrClass == CLASS_HUNTER || plrClass == CLASS_DEATH_KNIGHT)) { - uint32 entry = fields[16].GetUInt32(); + uint32 entry = fields[19].GetUInt32(); CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(entry); if (creatureInfo) { - petDisplayId = fields[17].GetUInt32(); - petLevel = fields[18].GetUInt16(); + petDisplayId = fields[20].GetUInt32(); + petLevel = fields[21].GetUInt16(); petFamily = creatureInfo->family; } } @@ -1719,7 +1728,7 @@ bool Player::BuildEnumData(PreparedQueryResult result, WorldPacket* data) *data << uint32(petLevel); *data << uint32(petFamily); - Tokenizer equipment(fields[19].GetString(), ' '); + Tokenizer equipment(fields[22].GetString(), ' '); for (uint8 slot = 0; slot < INVENTORY_SLOT_BAG_END; ++slot) { uint32 visualBase = slot * 2; @@ -1739,7 +1748,7 @@ bool Player::BuildEnumData(PreparedQueryResult result, WorldPacket* data) for (uint8 enchantSlot = PERM_ENCHANTMENT_SLOT; enchantSlot <= TEMP_ENCHANTMENT_SLOT; ++enchantSlot) { // values stored in 2 uint16 - uint32 enchantId = 0x0000FFFF & (enchants >> enchantSlot*16); + uint32 enchantId = 0x0000FFFF & (enchants >> enchantSlot * 16); if (!enchantId) continue; @@ -1799,14 +1808,14 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati { if (!MapManager::IsValidMapCoord(mapid, x, y, z, orientation)) { - TC_LOG_ERROR("maps", "TeleportTo: invalid map (%d) or invalid coordinates (X: %f, Y: %f, Z: %f, O: %f) given when teleporting player (GUID: %u, name: %s, map: %d, X: %f, Y: %f, Z: %f, O: %f).", - mapid, x, y, z, orientation, GetGUID().GetCounter(), GetName().c_str(), GetMapId(), GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation()); + TC_LOG_ERROR("maps", "Player::TeleportTo: Invalid map (%d) or invalid coordinates (X: %f, Y: %f, Z: %f, O: %f) given when teleporting player '%s' (%s, MapID: %d, X: %f, Y: %f, Z: %f, O: %f).", + mapid, x, y, z, orientation, GetGUID().ToString().c_str(), GetName().c_str(), GetMapId(), GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation()); return false; } if (!GetSession()->HasPermission(rbac::RBAC_PERM_SKIP_CHECK_DISABLE_MAP) && DisableMgr::IsDisabledFor(DISABLE_TYPE_MAP, mapid, this)) { - TC_LOG_ERROR("maps", "Player (GUID: %u, name: %s) tried to enter a forbidden map %u", GetGUID().GetCounter(), GetName().c_str(), mapid); + TC_LOG_ERROR("maps", "Player::TeleportTo: Player '%s' (%s) tried to enter a forbidden map (MapID: %u)", GetGUID().ToString().c_str(), GetName().c_str(), mapid); SendTransferAborted(mapid, TRANSFER_ABORT_MAP_NOT_ALLOWED); return false; } @@ -1824,7 +1833,8 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati // client without expansion support if (GetSession()->Expansion() < mEntry->Expansion()) { - TC_LOG_DEBUG("maps", "Player %s using client without required expansion tried teleport to non accessible map %u", GetName().c_str(), mapid); + TC_LOG_DEBUG("maps", "Player '%s' (%s) using client without required expansion tried teleport to non accessible map (MapID: %u)", + GetName().c_str(), GetGUID().ToString().c_str(), mapid); if (Transport* transport = GetTransport()) { @@ -1837,7 +1847,7 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati return false; // normal client can't teleport to this map... } else - TC_LOG_DEBUG("maps", "Player %s is being teleported to map %u", GetName().c_str(), mapid); + TC_LOG_DEBUG("maps", "Player %s (%s) is being teleported to map (MapID: %u)", GetName().c_str(), GetGUID().ToString().c_str(), mapid); if (m_vehicle) ExitVehicle(); @@ -1862,7 +1872,7 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati if (GetMapId() == mapid) { - //lets reset far teleport flag if it wasn't reset during chained teleports + //lets reset far teleport flag if it wasn't reset during chained teleport SetSemaphoreTeleportFar(false); //setup delayed teleport flag SetDelayedTeleportFlag(IsCanDelayTeleport()); @@ -2146,8 +2156,8 @@ void Player::RemoveFromWorld() { if (WorldObject* viewpoint = GetViewpoint()) { - TC_LOG_ERROR("entities.player", "Player %s has viewpoint %u %u when removed from world", - GetName().c_str(), viewpoint->GetEntry(), viewpoint->GetTypeId()); + TC_LOG_ERROR("entities.player", "Player::RemoveFromWorld: Player '%s' (%s) has viewpoint (Entry:%u, Type: %u) when removed from world", + GetName().c_str(), GetGUID().ToString().c_str(), viewpoint->GetEntry(), viewpoint->GetTypeId()); SetViewpoint(viewpoint, false); } } @@ -2388,14 +2398,14 @@ void Player::ResetAllPowers() } } -bool Player::CanInteractWithQuestGiver(Object* questGiver) +bool Player::CanInteractWithQuestGiver(Object* questGiver) const { switch (questGiver->GetTypeId()) { case TYPEID_UNIT: - return GetNPCIfCanInteractWith(questGiver->GetGUID(), UNIT_NPC_FLAG_QUESTGIVER) != NULL; + return GetNPCIfCanInteractWith(questGiver->GetGUID(), UNIT_NPC_FLAG_QUESTGIVER) != nullptr; case TYPEID_GAMEOBJECT: - return GetGameObjectIfCanInteractWith(questGiver->GetGUID(), GAMEOBJECT_TYPE_QUESTGIVER) != NULL; + return GetGameObjectIfCanInteractWith(questGiver->GetGUID(), GAMEOBJECT_TYPE_QUESTGIVER) != nullptr; case TYPEID_PLAYER: return IsAlive() && questGiver->ToPlayer()->IsAlive(); case TYPEID_ITEM: @@ -2406,46 +2416,46 @@ bool Player::CanInteractWithQuestGiver(Object* questGiver) return false; } -Creature* Player::GetNPCIfCanInteractWith(ObjectGuid const& guid, uint32 npcflagmask) +Creature* Player::GetNPCIfCanInteractWith(ObjectGuid const& guid, uint32 npcflagmask) const { // unit checks if (!guid) - return NULL; + return nullptr; if (!IsInWorld()) - return NULL; + return nullptr; if (IsInFlight()) - return NULL; + return nullptr; // exist (we need look pets also for some interaction (quest/etc) Creature* creature = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, guid); if (!creature) - return NULL; + return nullptr; // Deathstate checks if (!IsAlive() && !(creature->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_GHOST)) - return NULL; + return nullptr; // alive or spirit healer if (!creature->IsAlive() && !(creature->GetCreatureTemplate()->type_flags & CREATURE_TYPEFLAGS_DEAD_INTERACT)) - return NULL; + return nullptr; // appropriate npc type if (npcflagmask && !creature->HasFlag(UNIT_NPC_FLAGS, npcflagmask)) - return NULL; + return nullptr; // not allow interaction under control, but allow with own pets if (creature->GetCharmerGUID()) - return NULL; + return nullptr; // not unfriendly/hostile if (creature->GetReactionTo(this) <= REP_UNFRIENDLY) - return NULL; + return nullptr; // not too far if (!creature->IsWithinDistInMap(this, INTERACTION_DISTANCE)) - return NULL; + return nullptr; return creature; } @@ -2473,8 +2483,8 @@ GameObject* Player::GetGameObjectIfCanInteractWith(ObjectGuid const& guid, Gameo if (go->IsWithinDistInMap(this, go->GetInteractionDistance())) return go; - TC_LOG_DEBUG("maps", "GetGameObjectIfCanInteractWith: GameObject '%s' [GUID: %u] is too far away from player %s [GUID: %u] to be used by him (distance=%f, maximal %f is allowed)", go->GetGOInfo()->name.c_str(), - go->GetGUID().GetCounter(), GetName().c_str(), GetGUID().GetCounter(), go->GetDistance(this), go->GetInteractionDistance()); + TC_LOG_DEBUG("maps", "Player::GetGameObjectIfCanInteractWith: GameObject '%s' (%s) is too far away from player '%s' (%s) to be used by him (Distance: %f, maximal 10 is allowed)", + go->GetGOInfo()->name.c_str(), go->GetGUID().ToString().c_str(), GetName().c_str(), GetGUID().ToString().c_str(), go->GetDistance(this)); } } @@ -2625,14 +2635,14 @@ bool Player::IsGroupVisibleFor(Player const* p) const bool Player::IsInSameGroupWith(Player const* p) const { - return p == this || (GetGroup() != NULL && + return p == this || (GetGroup() != nullptr && GetGroup() == p->GetGroup() && GetGroup()->SameSubGroup(this, p)); } bool Player::IsInSameRaidWith(Player const* p) const { - return p == this || (GetGroup() != NULL && GetGroup() == p->GetGroup()); + return p == this || (GetGroup() != nullptr && GetGroup() == p->GetGroup()); } ///- If the player is invited, remove him. If the group if then only 1 person, disband the group. @@ -2667,7 +2677,7 @@ void Player::RemoveFromGroup(Group* group, ObjectGuid guid, RemoveMethod method group->RemoveMember(guid, method, kicker, reason); } -void Player::SendLogXPGain(uint32 GivenXP, Unit* victim, uint32 BonusXP, bool recruitAFriend, float /*group_rate*/) +void Player::SendLogXPGain(uint32 GivenXP, Unit* victim, uint32 BonusXP, bool recruitAFriend, float /*group_rate*/) const { WorldPacket data(SMSG_LOG_XPGAIN, 21); // guess size? data << uint64(victim ? victim->GetGUID() : ObjectGuid::Empty); @@ -2708,7 +2718,7 @@ void Player::GiveXP(uint32 xp, Unit* victim, float group_rate) if (level >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)) return; - uint32 bonus_xp = 0; + uint32 bonus_xp; bool recruitAFriend = GetsRecruitAFriendBonus(true); // RaF does NOT stack with rested experience @@ -3069,8 +3079,6 @@ void Player::SendInitialSpells() GetSpellHistory()->WritePacket<Player>(data); GetSession()->SendPacket(&data); - - TC_LOG_DEBUG("network", "CHARACTER: Sent Initial Spells"); } void Player::RemoveMail(uint32 id) @@ -3086,7 +3094,7 @@ void Player::RemoveMail(uint32 id) } } -void Player::SendMailResult(uint32 mailId, MailResponseType mailAction, MailResponseResult mailError, uint32 equipError, ObjectGuid::LowType item_guid, uint32 item_count) +void Player::SendMailResult(uint32 mailId, MailResponseType mailAction, MailResponseResult mailError, uint32 equipError, ObjectGuid::LowType item_guid, uint32 item_count) const { WorldPacket data(SMSG_SEND_MAIL_RESULT, (4+4+4+(mailError == MAIL_ERR_EQUIP_ERROR?4:(mailAction == MAIL_ITEM_TAKEN?4+4:0)))); data << (uint32) mailId; @@ -3102,7 +3110,7 @@ void Player::SendMailResult(uint32 mailId, MailResponseType mailAction, MailResp GetSession()->SendPacket(&data); } -void Player::SendNewMail() +void Player::SendNewMail() const { // deliver undelivered mail WorldPacket data(SMSG_RECEIVED_MAIL, 4); @@ -3114,7 +3122,7 @@ void Player::UpdateNextMailTimeAndUnreads() { // calculate next delivery time (min. from non-delivered mails // and recalculate unReadMail - time_t cTime = time(NULL); + time_t cTime = time(nullptr); m_nextMailDelivereTime = 0; unReadMails = 0; for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr) @@ -3131,7 +3139,7 @@ void Player::UpdateNextMailTimeAndUnreads() void Player::AddNewMailDeliverTime(time_t deliver_time) { - if (deliver_time <= time(NULL)) // ready now + if (deliver_time <= time(nullptr)) // ready now { ++unReadMails; SendNewMail(); @@ -3164,12 +3172,12 @@ bool Player::AddTalent(uint32 spellId, uint8 spec, bool learning) // do character spell book cleanup (all characters) if (!IsInWorld() && !learning) // spell load case { - TC_LOG_ERROR("spells", "Player::addSpell: Non-existed in SpellStore spell #%u request, deleting for all characters in `character_spell`.", spellId); + TC_LOG_ERROR("spells", "Player::AddTalent: Spell (ID: %u) does not exist. Deleting for all characters in `character_spell` and `character_talent`.", spellId); DeleteSpellFromAllPlayers(spellId); } else - TC_LOG_ERROR("spells", "Player::addSpell: Non-existed in SpellStore spell #%u request.", spellId); + TC_LOG_ERROR("spells", "Player::AddTalent: Spell (ID: %u) does not exist", spellId); return false; } @@ -3179,12 +3187,12 @@ bool Player::AddTalent(uint32 spellId, uint8 spec, bool learning) // do character spell book cleanup (all characters) if (!IsInWorld() && !learning) // spell load case { - TC_LOG_ERROR("spells", "Player::addTalent: Broken spell #%u learning not allowed, deleting for all characters in `character_talent`.", spellId); + TC_LOG_ERROR("spells", "Player::AddTalent: Spell (ID: %u) is invalid. Deleting for all characters in `character_spell` and `character_talent`.", spellId); DeleteSpellFromAllPlayers(spellId); } else - TC_LOG_ERROR("spells", "Player::addTalent: Broken spell #%u learning not allowed.", spellId); + TC_LOG_ERROR("spells", "Player::AddTalent: Spell (ID: %u) is invalid", spellId); return false; } @@ -3229,12 +3237,12 @@ bool Player::AddSpell(uint32 spellId, bool active, bool learning, bool dependent // do character spell book cleanup (all characters) if (!IsInWorld() && !learning) // spell load case { - TC_LOG_ERROR("spells", "Player::addSpell: Non-existed in SpellStore spell #%u request, deleting for all characters in `character_spell`.", spellId); + TC_LOG_ERROR("spells", "Player::AddSpell: Spell (ID: %u) does not exist. deleting for all characters in `character_spell` and `character_talent`.", spellId); DeleteSpellFromAllPlayers(spellId); } else - TC_LOG_ERROR("spells", "Player::addSpell: Non-existed in SpellStore spell #%u request.", spellId); + TC_LOG_ERROR("spells", "Player::AddSpell: Spell (ID: %u) does not exist", spellId); return false; } @@ -3244,12 +3252,12 @@ bool Player::AddSpell(uint32 spellId, bool active, bool learning, bool dependent // do character spell book cleanup (all characters) if (!IsInWorld() && !learning) // spell load case { - TC_LOG_ERROR("spells", "Player::addSpell: Broken spell #%u learning not allowed, deleting for all characters in `character_spell`.", spellId); + TC_LOG_ERROR("spells", "Player::AddSpell: Spell (ID: %u) is invalid. deleting for all characters in `character_spell` and `character_talent`.", spellId); DeleteSpellFromAllPlayers(spellId); } else - TC_LOG_ERROR("spells", "Player::addSpell: Broken spell #%u learning not allowed.", spellId); + TC_LOG_ERROR("spells", "Player::AddSpell: Spell (ID: %u) is invalid", spellId); return false; } @@ -3939,12 +3947,12 @@ bool Player::ResetTalents(bool no_cost) if (!HasEnoughMoney(cost)) { - SendBuyError(BUY_ERR_NOT_ENOUGHT_MONEY, 0, 0, 0); + SendBuyError(BUY_ERR_NOT_ENOUGHT_MONEY, nullptr, 0, 0); return false; } } - RemovePet(NULL, PET_SAVE_NOT_IN_SLOT, true); + RemovePet(nullptr, PET_SAVE_NOT_IN_SLOT, true); for (uint32 talentId = 0; talentId < sTalentStore.GetNumRows(); ++talentId) { @@ -3966,7 +3974,7 @@ bool Player::ResetTalents(bool no_cost) for (int8 rank = MAX_TALENT_RANK-1; rank >= 0; --rank) { - // skip non-existant talent ranks + // skip non-existing talent ranks if (talentInfo->RankID[rank] == 0) continue; const SpellInfo* _spellEntry = sSpellMgr->GetSpellInfo(talentInfo->RankID[rank]); @@ -4024,7 +4032,7 @@ Mail* Player::GetMail(uint32 id) if ((*itr)->messageID == id) return (*itr); - return NULL; + return nullptr; } void Player::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) const @@ -4033,7 +4041,7 @@ void Player::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) c { for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i) { - if (m_items[i] == NULL) + if (m_items[i] == nullptr) continue; m_items[i]->BuildCreateUpdateBlockForPlayer(data, target); @@ -4041,7 +4049,7 @@ void Player::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) c for (uint8 i = INVENTORY_SLOT_BAG_START; i < BANK_SLOT_BAG_END; ++i) { - if (m_items[i] == NULL) + if (m_items[i] == nullptr) continue; m_items[i]->BuildCreateUpdateBlockForPlayer(data, target); @@ -4064,7 +4072,7 @@ void Player::DestroyForPlayer(Player* target, bool onDeath) const for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i) { - if (m_items[i] == NULL) + if (m_items[i] == nullptr) continue; m_items[i]->DestroyForPlayer(target); @@ -4074,7 +4082,7 @@ void Player::DestroyForPlayer(Player* target, bool onDeath) const { for (uint8 i = INVENTORY_SLOT_BAG_START; i < BANK_SLOT_BAG_END; ++i) { - if (m_items[i] == NULL) + if (m_items[i] == nullptr) continue; m_items[i]->DestroyForPlayer(target); @@ -4164,7 +4172,7 @@ TrainerSpellState Player::GetTrainerSpellState(TrainerSpell const* trainer_spell } // check primary prof. limit - // first rank of primary profession spell when there are no proffesions avalible is disabled + // first rank of primary profession spell when there are no professions available is disabled for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) { if (!trainer_spell->learnedSpell[i]) @@ -4542,7 +4550,8 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe break; } default: - TC_LOG_ERROR("entities.player", "Player::DeleteFromDB: Unsupported delete method: %u.", charDelete_method); + TC_LOG_ERROR("entities.player", "Player::DeleteFromDB: Tried to delete player (%s) with unsupported delete method (%u).", + playerguid.ToString().c_str(), charDelete_method); return; } @@ -4571,19 +4580,19 @@ void Player::DeleteOldCharacters() * * @see Player::DeleteFromDB * - * @param keepDays overrite the config option by another amount of days + * @param keepDays overwrite the config option by another amount of days */ void Player::DeleteOldCharacters(uint32 keepDays) { - TC_LOG_INFO("entities.player", "Player::DeleteOldChars: Removing characters older than %u day(s)", keepDays); + TC_LOG_INFO("entities.player", "Player::DeleteOldCharacters: Deleting all characters which have been deleted %u days before...", keepDays); PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_OLD_CHARS); - stmt->setUInt32(0, uint32(time(NULL) - time_t(keepDays * DAY))); + stmt->setUInt32(0, uint32(time(nullptr) - time_t(keepDays * DAY))); PreparedQueryResult result = CharacterDatabase.Query(stmt); if (result) { - TC_LOG_DEBUG("entities.player", "Player::DeleteOldChars: " UI64FMTD " character(s) to remove", result->GetRowCount()); + TC_LOG_DEBUG("entities.player", "Player::DeleteOldCharacters: Found " UI64FMTD " character(s) to delete", result->GetRowCount()); do { Field* fields = result->Fetch(); @@ -4632,7 +4641,7 @@ void Player::BuildPlayerRepop() WorldLocation corpseLocation = GetCorpseLocation(); if (corpseLocation.GetMapId() == GetMapId()) { - TC_LOG_ERROR("entities.player", "BuildPlayerRepop: player %s(%d) already has a corpse", GetName().c_str(), GetGUID().GetCounter()); + TC_LOG_ERROR("entities.player", "Player::BuildPlayerRepop: Player '%s' (%s) already has a corpse", GetName().c_str(), GetGUID().ToString().c_str()); return; } @@ -4640,7 +4649,7 @@ void Player::BuildPlayerRepop() Corpse* corpse = CreateCorpse(); if (!corpse) { - TC_LOG_ERROR("entities.player", "Error creating corpse for Player %s [%u]", GetName().c_str(), GetGUID().GetCounter()); + TC_LOG_ERROR("entities.player", "Player::BuildPlayerRepop: Error creating corpse for player '%s' (%s)", GetName().c_str(), GetGUID().ToString().c_str()); return; } GetMap()->AddToMap(corpse); @@ -4817,7 +4826,7 @@ void Player::OfflineResurrect(ObjectGuid const& guid, SQLTransaction& trans) Corpse* Player::CreateCorpse() { - // prevent existence 2 corpse for player + // prevent the existence of 2 corpses for one player SpawnCorpseBones(); uint32 _pb, _pb2, _cfb1, _cfb2; @@ -4962,7 +4971,7 @@ void Player::DurabilityPointsLossAll(int32 points, bool inventory) //for (int i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++) for (uint8 i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++) - if (Bag* pBag = (Bag*)GetItemByPos(INVENTORY_SLOT_BAG_0, i)) + if (Bag* pBag = static_cast<Bag*>(GetItemByPos(INVENTORY_SLOT_BAG_0, i))) for (uint32 j = 0; j < pBag->GetBagSize(); j++) if (Item* pItem = GetItemByPos(i, j)) DurabilityPointsLoss(pItem, points); @@ -5042,7 +5051,8 @@ uint32 Player::DurabilityRepair(uint16 pos, bool cost, float discountMod, bool g DurabilityCostsEntry const* dcost = sDurabilityCostsStore.LookupEntry(ditemProto->ItemLevel); if (!dcost) { - TC_LOG_ERROR("entities.player.items", "RepairDurability: Wrong item lvl %u", ditemProto->ItemLevel); + TC_LOG_ERROR("entities.player.items", "Player::DurabilityRepair: Player '%s' (%s) tried to repair an item (ItemID: %u) with invalid item level %u", + GetName().c_str(), GetGUID().ToString().c_str(), ditemProto->ItemId, ditemProto->ItemLevel); return TotalCost; } @@ -5050,7 +5060,8 @@ uint32 Player::DurabilityRepair(uint16 pos, bool cost, float discountMod, bool g DurabilityQualityEntry const* dQualitymodEntry = sDurabilityQualityStore.LookupEntry(dQualitymodEntryId); if (!dQualitymodEntry) { - TC_LOG_ERROR("entities.player.items", "RepairDurability: Wrong dQualityModEntry %u", dQualitymodEntryId); + TC_LOG_ERROR("entities.player.items", "Player::DurabilityRepair: Player '%s' (%s) tried to repair an item (ItemID: %u) with invalid QualitymodEntry %u", + GetName().c_str(), GetGUID().ToString().c_str(), ditemProto->ItemId, dQualitymodEntryId); return TotalCost; } @@ -5066,7 +5077,8 @@ uint32 Player::DurabilityRepair(uint16 pos, bool cost, float discountMod, bool g { if (GetGuildId() == 0) { - TC_LOG_DEBUG("entities.player.items", "You are not member of a guild"); + TC_LOG_DEBUG("entities.player.items", "Player::DurabilityRepair: Player '%s' (%s) tried to repair item in a guild bank but is not member of a guild", + GetName().c_str(), GetGUID().ToString().c_str()); return TotalCost; } @@ -5081,7 +5093,8 @@ uint32 Player::DurabilityRepair(uint16 pos, bool cost, float discountMod, bool g } else if (!HasEnoughMoney(costs)) { - TC_LOG_DEBUG("entities.player.items", "You do not have enough money"); + TC_LOG_DEBUG("entities.player.items", "Player::DurabilityRepair: Player '%s' (%s) has not enough money to repair item", + GetName().c_str(), GetGUID().ToString().c_str()); return TotalCost; } else @@ -5112,7 +5125,7 @@ void Player::RepopAtGraveyard() SpawnCorpseBones(); } - WorldSafeLocsEntry const* ClosestGrave = NULL; + WorldSafeLocsEntry const* ClosestGrave; // Special handle for battleground maps if (Battleground* bg = GetBattleground()) @@ -5149,7 +5162,7 @@ void Player::RepopAtGraveyard() RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_IS_OUT_OF_BOUNDS); } -bool Player::CanJoinConstantChannelInZone(ChatChannelsEntry const* channel, AreaTableEntry const* zone) +bool Player::CanJoinConstantChannelInZone(ChatChannelsEntry const* channel, AreaTableEntry const* zone) const { if (channel->flags & CHANNEL_DBC_FLAG_ZONE_DEP && zone->flags & AREA_FLAG_ARENA_INSTANCE) return false; @@ -5183,7 +5196,7 @@ void Player::CleanupChannels() if (ChannelMgr* cMgr = ChannelMgr::forTeam(GetTeam())) cMgr->LeftChannel(ch->GetName()); // deleted channel if empty } - TC_LOG_DEBUG("chat.system", "Player %s: channels cleaned up!", GetName().c_str()); + TC_LOG_DEBUG("chat.system", "Player::CleanupChannels: Channels of player '%s' (%s) cleaned up.", GetName().c_str(), GetGUID().ToString().c_str()); } void Player::UpdateLocalChannels(uint32 newZone) @@ -5205,7 +5218,7 @@ void Player::UpdateLocalChannels(uint32 newZone) { if (ChatChannelsEntry const* channel = sChatChannelsStore.LookupEntry(i)) { - Channel* usedChannel = NULL; + Channel* usedChannel = nullptr; for (JoinedChannelsList::iterator itr = m_channels.begin(); itr != m_channels.end(); ++itr) { @@ -5216,8 +5229,8 @@ void Player::UpdateLocalChannels(uint32 newZone) } } - Channel* removeChannel = NULL; - Channel* joinChannel = NULL; + Channel* removeChannel = nullptr; + Channel* joinChannel = nullptr; bool sendRemove = true; if (CanJoinConstantChannelInZone(channel, current_zone)) @@ -5246,7 +5259,7 @@ void Player::UpdateLocalChannels(uint32 newZone) sendRemove = false; // Do not send leave channel, it already replaced at client } else - joinChannel = NULL; + joinChannel = nullptr; } } else @@ -5291,7 +5304,8 @@ void Player::HandleBaseModValue(BaseModGroup modGroup, BaseModType modType, floa { if (modGroup >= BASEMOD_END || modType >= MOD_END) { - TC_LOG_ERROR("spells", "ERROR in HandleBaseModValue(): non existed BaseModGroup of wrong BaseModType!"); + TC_LOG_ERROR("spells", "Player::HandleBaseModValue: Invalid BaseModGroup/BaseModType (%u/%u) for player '%s' (%s)", + modGroup, modType, GetName().c_str(), GetGUID().ToString().c_str()); return; } @@ -5317,7 +5331,8 @@ float Player::GetBaseModValue(BaseModGroup modGroup, BaseModType modType) const { if (modGroup >= BASEMOD_END || modType >= MOD_END) { - TC_LOG_ERROR("spells", "trial to access non existed BaseModGroup or wrong BaseModType!"); + TC_LOG_ERROR("spells", "Player::GetBaseModValue: Invalid BaseModGroup/BaseModType (%u/%u) for player '%s' (%s)", + modGroup, modType, GetName().c_str(), GetGUID().ToString().c_str()); return 0.0f; } @@ -5331,7 +5346,8 @@ float Player::GetTotalBaseModValue(BaseModGroup modGroup) const { if (modGroup >= BASEMOD_END) { - TC_LOG_ERROR("spells", "wrong BaseModGroup in GetTotalBaseModValue()!"); + TC_LOG_ERROR("spells", "Player::GetTotalBaseModValue: Invalid BaseModGroup (%u) for player '%s' (%s)", + modGroup, GetName().c_str(), GetGUID().ToString().c_str()); return 0.0f; } @@ -5350,7 +5366,7 @@ uint32 Player::GetShieldBlockValue() const return uint32(value); } -float Player::GetMeleeCritFromAgility() +float Player::GetMeleeCritFromAgility() const { uint8 level = getLevel(); uint32 pclass = getClass(); @@ -5360,14 +5376,14 @@ float Player::GetMeleeCritFromAgility() GtChanceToMeleeCritBaseEntry const* critBase = sGtChanceToMeleeCritBaseStore.LookupEntry(pclass-1); GtChanceToMeleeCritEntry const* critRatio = sGtChanceToMeleeCritStore.LookupEntry((pclass-1)*GT_MAX_LEVEL + level-1); - if (critBase == NULL || critRatio == NULL) + if (critBase == nullptr || critRatio == nullptr) return 0.0f; float crit = critBase->base + GetStat(STAT_AGILITY)*critRatio->ratio; return crit*100.0f; } -void Player::GetDodgeFromAgility(float &diminishing, float &nondiminishing) +void Player::GetDodgeFromAgility(float &diminishing, float &nondiminishing) const { // Table for base dodge values const float dodge_base[MAX_CLASSES] = @@ -5408,7 +5424,7 @@ void Player::GetDodgeFromAgility(float &diminishing, float &nondiminishing) // Dodge per agility is proportional to crit per agility, which is available from DBC files GtChanceToMeleeCritEntry const* dodgeRatio = sGtChanceToMeleeCritStore.LookupEntry((pclass-1)*GT_MAX_LEVEL + level-1); - if (dodgeRatio == NULL || pclass > MAX_CLASSES) + if (dodgeRatio == nullptr || pclass > MAX_CLASSES) return; /// @todo research if talents/effects that increase total agility by x% should increase non-diminishing part @@ -5420,7 +5436,7 @@ void Player::GetDodgeFromAgility(float &diminishing, float &nondiminishing) nondiminishing = 100.0f * (dodge_base[pclass-1] + base_agility * dodgeRatio->ratio * crit_to_dodge[pclass-1]); } -float Player::GetSpellCritFromIntellect() +float Player::GetSpellCritFromIntellect() const { uint8 level = getLevel(); uint32 pclass = getClass(); @@ -5430,7 +5446,7 @@ float Player::GetSpellCritFromIntellect() GtChanceToSpellCritBaseEntry const* critBase = sGtChanceToSpellCritBaseStore.LookupEntry(pclass-1); GtChanceToSpellCritEntry const* critRatio = sGtChanceToSpellCritStore.LookupEntry((pclass-1)*GT_MAX_LEVEL + level-1); - if (critBase == NULL || critRatio == NULL) + if (critBase == nullptr || critRatio == nullptr) return 0.0f; float crit=critBase->base + GetStat(STAT_INTELLECT)*critRatio->ratio; @@ -5472,7 +5488,7 @@ float Player::GetExpertiseDodgeOrParryReduction(WeaponAttackType attType) const return 0.0f; } -float Player::OCTRegenHPPerSpirit() +float Player::OCTRegenHPPerSpirit() const { uint8 level = getLevel(); uint32 pclass = getClass(); @@ -5495,7 +5511,7 @@ float Player::OCTRegenHPPerSpirit() return regen; } -float Player::OCTRegenMPPerSpirit() +float Player::OCTRegenMPPerSpirit() const { uint8 level = getLevel(); uint32 pclass = getClass(); @@ -5505,7 +5521,7 @@ float Player::OCTRegenMPPerSpirit() // GtOCTRegenMPEntry const* baseRatio = sGtOCTRegenMPStore.LookupEntry((pclass-1)*GT_MAX_LEVEL + level-1); GtRegenMPPerSptEntry const* moreRatio = sGtRegenMPPerSptStore.LookupEntry((pclass-1)*GT_MAX_LEVEL + level-1); - if (moreRatio == NULL) + if (moreRatio == nullptr) return 0.0f; // Formula get from PaperDollFrame script @@ -5703,7 +5719,8 @@ inline int SkillGainChance(uint32 SkillValue, uint32 GrayLevel, uint32 GreenLeve bool Player::UpdateCraftSkill(uint32 spellid) { - TC_LOG_DEBUG("entities.player.skills", "UpdateCraftSkill spellid %d", spellid); + TC_LOG_DEBUG("entities.player.skills", "Player::UpdateCraftSkill: Player '%s' (%s), SpellID: %d", + GetName().c_str(), GetGUID().ToString().c_str(), spellid); SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spellid); @@ -5735,7 +5752,8 @@ bool Player::UpdateCraftSkill(uint32 spellid) bool Player::UpdateGatherSkill(uint32 SkillId, uint32 SkillValue, uint32 RedLevel, uint32 Multiplicator) { - TC_LOG_DEBUG("entities.player.skills", "UpdateGatherSkill(SkillId %d SkillLevel %d RedLevel %d)", SkillId, SkillValue, RedLevel); + TC_LOG_DEBUG("entities.player.skills", "Player::UpdateGatherSkill: Player '%s' (%s), SkillID: %u, SkillLevel: %u, RedLevel: %u)", + GetName().c_str(), GetGUID().ToString().c_str(), SkillId, SkillValue, RedLevel); uint32 gathering_skill_gain = sWorld->getIntConfig(CONFIG_SKILL_GAIN_GATHERING); @@ -5763,7 +5781,7 @@ bool Player::UpdateGatherSkill(uint32 SkillId, uint32 SkillValue, uint32 RedLeve bool Player::UpdateFishingSkill() { - TC_LOG_DEBUG("entities.player.skills", "UpdateFishingSkill"); + TC_LOG_DEBUG("entities.player.skills", "Player::UpdateFishingSkill: Player '%s' (%s)", GetName().c_str(), GetGUID().ToString().c_str()); uint32 SkillValue = GetPureSkillValue(SKILL_FISHING); @@ -5782,13 +5800,15 @@ static const size_t bonusSkillLevelsSize = sizeof(bonusSkillLevels) / sizeof(uin bool Player::UpdateSkillPro(uint16 SkillId, int32 Chance, uint32 step) { - TC_LOG_DEBUG("entities.player.skills", "UpdateSkillPro(SkillId %d, Chance %3.1f%%)", SkillId, Chance / 10.0f); + TC_LOG_DEBUG("entities.player.skills", "Player::UpdateSkillPro: Player '%s' (%s), SkillID: %u, Chance: %3.1f%%)", + GetName().c_str(), GetGUID().ToString().c_str(), SkillId, Chance / 10.0f); if (!SkillId) return false; if (Chance <= 0) // speedup in 0 chance case { - TC_LOG_DEBUG("entities.player.skills", "Player::UpdateSkillPro Chance=%3.1f%% missed", Chance / 10.0f); + TC_LOG_DEBUG("entities.player.skills", "Player::UpdateSkillPro: Player '%s' (%s), SkillID: %u, Chance: %3.1f%% missed", + GetName().c_str(), GetGUID().ToString().c_str(), SkillId, Chance / 10.0f); return false; } @@ -5827,11 +5847,13 @@ bool Player::UpdateSkillPro(uint16 SkillId, int32 Chance, uint32 step) } UpdateSkillEnchantments(SkillId, SkillValue, new_value); UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, SkillId); - TC_LOG_DEBUG("entities.player.skills", "Player::UpdateSkillPro Chance=%3.1f%% taken", Chance / 10.0f); + TC_LOG_DEBUG("entities.player.skills", "Player::UpdateSkillPro: Player '%s' (%s), SkillID: %u, Chance: %3.1f%% taken", + GetName().c_str(), GetGUID().ToString().c_str(), SkillId, Chance / 10.0f); return true; } - TC_LOG_DEBUG("entities.player.skills", "Player::UpdateSkillPro Chance=%3.1f%% missed", Chance / 10.0f); + TC_LOG_DEBUG("entities.player.skills", "Player::UpdateSkillPro: Player '%s' (%s), SkillID: %u, Chance: %3.1f%% missed", + GetName().c_str(), GetGUID().ToString().c_str(), SkillId, Chance / 10.0f); return false; } @@ -6065,7 +6087,8 @@ void Player::SetSkill(uint16 id, uint16 step, uint16 newVal, uint16 maxVal) SkillLineEntry const* pSkill = sSkillLineStore.LookupEntry(id); if (!pSkill) { - TC_LOG_ERROR("entities.player.skills", "Skill not found in SkillLineStore: skill #%u", id); + TC_LOG_ERROR("misc", "Player::SetSkill: Skill (SkillID: %u) not found in SkillLineStore for player '%s' (%s)", + id, GetName().c_str(), GetGUID().ToString().c_str()); return; } @@ -6247,20 +6270,22 @@ void Player::SendActionButtons(uint32 state) const } GetSession()->SendPacket(&data); - TC_LOG_DEBUG("network", "SMSG_ACTION_BUTTONS sent '%u' spec '%u' Sent", GetGUID().GetCounter(), m_activeSpec); + } -bool Player::IsActionButtonDataValid(uint8 button, uint32 action, uint8 type) +bool Player::IsActionButtonDataValid(uint8 button, uint32 action, uint8 type) const { if (button >= MAX_ACTION_BUTTONS) { - TC_LOG_DEBUG("entities.player", "Action %u not added into button %u for player %s (GUID: %u): button must be < %u", action, button, GetName().c_str(), GetGUID().GetCounter(), MAX_ACTION_BUTTONS ); + TC_LOG_ERROR("entities.player", "Player::IsActionButtonDataValid: Action %u not added into button %u for player %s (%s): button must be < %u", + action, button, GetName().c_str(), GetGUID().ToString().c_str(), MAX_ACTION_BUTTONS); return false; } if (action >= MAX_ACTION_BUTTON_ACTION_VALUE) { - TC_LOG_DEBUG("entities.player", "Action %u not added into button %u for player %s (GUID: %u): action must be < %u", action, button, GetName().c_str(), GetGUID().GetCounter(), MAX_ACTION_BUTTON_ACTION_VALUE); + TC_LOG_ERROR("entities.player", "Player::IsActionButtonDataValid: Action %u not added into button %u for player %s (%s): action must be < %u", + action, button, GetName().c_str(), GetGUID().ToString().c_str(), MAX_ACTION_BUTTON_ACTION_VALUE); return false; } @@ -6269,20 +6294,23 @@ bool Player::IsActionButtonDataValid(uint8 button, uint32 action, uint8 type) case ACTION_BUTTON_SPELL: if (!sSpellMgr->GetSpellInfo(action)) { - TC_LOG_DEBUG("entities.player", "Spell action %u not added into button %u for player %s (GUID: %u): spell not exist", action, button, GetName().c_str(), GetGUID().GetCounter()); + TC_LOG_ERROR("entities.player", "Player::IsActionButtonDataValid: Spell action %u not added into button %u for player %s (%s): spell not exist", + action, button, GetName().c_str(), GetGUID().ToString().c_str()); return false; } if (!HasSpell(action)) { - TC_LOG_DEBUG("entities.player", "Spell action %u not added into button %u for player %s (GUID: %u): player don't known this spell", action, button, GetName().c_str(), GetGUID().GetCounter()); + TC_LOG_ERROR("entities.player", "Player::IsActionButtonDataValid: Spell action %u not added into button %u for player %s (%s): player don't known this spell", + action, button, GetName().c_str(), GetGUID().ToString().c_str()); return false; } break; case ACTION_BUTTON_ITEM: if (!sObjectMgr->GetItemTemplate(action)) { - TC_LOG_DEBUG("entities.player", "Item action %u not added into button %u for player %s (GUID: %u): item not exist", action, button, GetName().c_str(), GetGUID().GetCounter()); + TC_LOG_ERROR("entities.player", "Player::IsActionButtonDataValid: Item action %u not added into button %u for player %s (%s): item not exist", + action, button, GetName().c_str(), GetGUID().ToString().c_str()); return false; } break; @@ -6292,7 +6320,7 @@ bool Player::IsActionButtonDataValid(uint8 button, uint32 action, uint8 type) case ACTION_BUTTON_EQSET: break; default: - TC_LOG_DEBUG("entities.player", "Unknown action type %u", type); + TC_LOG_ERROR("entities.player", "Player::IsActionButtonDataValid: Unknown action type %u", type); return false; // other cases not checked at this moment } @@ -6302,15 +6330,16 @@ bool Player::IsActionButtonDataValid(uint8 button, uint32 action, uint8 type) ActionButton* Player::addActionButton(uint8 button, uint32 action, uint8 type) { if (!IsActionButtonDataValid(button, action, type)) - return NULL; + return nullptr; - // it create new button (NEW state) if need or return existed + // it create new button (NEW state) if need or return existing ActionButton& ab = m_actionButtons[button]; // set data and update to CHANGED if not NEW ab.SetActionAndType(action, ActionButtonType(type)); - TC_LOG_DEBUG("entities.player", "Player '%u' Added Action '%u' (type %u) to Button '%u'", GetGUID().GetCounter(), action, type, button); + TC_LOG_DEBUG("entities.player", "Player::AddActionButton: Player '%s' (%s) added action '%u' (type %u) to button '%u'", + GetName().c_str(), GetGUID().ToString().c_str(), action, type, button); return &ab; } @@ -6325,14 +6354,15 @@ void Player::removeActionButton(uint8 button) else buttonItr->second.uState = ACTIONBUTTON_DELETED; // saved, will deleted at next save - TC_LOG_DEBUG("entities.player", "Action Button '%u' Removed from Player '%u'", button, GetGUID().GetCounter()); + TC_LOG_DEBUG("entities.player", "Player::RemoveActionButton: Player '%s' (%s) removed action button '%u'", + GetName().c_str(), GetGUID().ToString().c_str(), button); } ActionButton const* Player::GetActionButton(uint8 button) { ActionButtonList::iterator buttonItr = m_actionButtons.find(button); if (buttonItr == m_actionButtons.end() || buttonItr->second.uState == ACTIONBUTTON_DELETED) - return NULL; + return nullptr; return &buttonItr->second; } @@ -6404,19 +6434,19 @@ void Player::SendMessageToSet(WorldPacket* data, Player const* skipped_rcvr) VisitNearbyWorldObject(GetVisibilityRange(), notifier); } -void Player::SendDirectMessage(WorldPacket* data) +void Player::SendDirectMessage(WorldPacket const* data) const { m_session->SendPacket(data); } -void Player::SendCinematicStart(uint32 CinematicSequenceId) +void Player::SendCinematicStart(uint32 CinematicSequenceId) const { WorldPacket data(SMSG_TRIGGER_CINEMATIC, 4); data << uint32(CinematicSequenceId); SendDirectMessage(&data); } -void Player::SendMovieStart(uint32 MovieId) +void Player::SendMovieStart(uint32 MovieId) const { WorldPacket data(SMSG_TRIGGER_MOVIE, 4); data << uint32(MovieId); @@ -6475,7 +6505,7 @@ void Player::CheckAreaExploreAndOutdoor() else { int32 diff = int32(getLevel()) - areaEntry->area_level; - uint32 XP = 0; + uint32 XP; if (diff < -5) { XP = uint32(sObjectMgr->GetBaseXP(getLevel()+5)*sWorld->getRate(RATE_XP_EXPLORE)); @@ -6493,7 +6523,7 @@ void Player::CheckAreaExploreAndOutdoor() XP = uint32(sObjectMgr->GetBaseXP(areaEntry->area_level)*sWorld->getRate(RATE_XP_EXPLORE)); } - GiveXP(XP, NULL); + GiveXP(XP, nullptr); SendExplorationExperience(areaId, XP); } TC_LOG_DEBUG("entities.player", "Player '%s' (%s) discovered a new area: %u", GetName().c_str(),GetGUID().ToString().c_str(), areaId); @@ -6710,8 +6740,8 @@ void Player::RewardReputation(Quest const* quest) void Player::UpdateHonorFields() { /// called when rewarding honor and at each save - time_t now = time_t(time(NULL)); - time_t today = time_t(time(NULL) / DAY) * DAY; + time_t now = time_t(time(nullptr)); + time_t today = time_t(time(nullptr) / DAY) * DAY; if (m_lastHonorUpdateTime < today) { @@ -6835,7 +6865,7 @@ bool Player::RewardHonor(Unit* victim, uint32 groupsize, int32 honor, bool pvpto } } - if (victim != NULL) + if (victim != nullptr) { if (groupsize > 1) honor_f /= groupsize; @@ -7212,7 +7242,7 @@ void Player::CheckDuelDistance(time_t currTime) } } -bool Player::IsOutdoorPvPActive() +bool Player::IsOutdoorPvPActive() const { return IsAlive() && !HasInvisibilityAura() && !HasStealthAura() && IsPvP() && !HasUnitMovementFlag(MOVEMENTFLAG_FLYING) && !IsInFlight(); } @@ -7223,7 +7253,8 @@ void Player::DuelComplete(DuelCompleteType type) if (!duel) return; - TC_LOG_DEBUG("entities.unit", "Duel Complete %s %s", GetName().c_str(), duel->opponent->GetName().c_str()); + TC_LOG_DEBUG("entities.unit", "Player::DuelComplete: Player '%s' (%s), Opponent: '%s' (%s)", + GetName().c_str(), GetGUID().ToString().c_str(), duel->opponent->GetName().c_str(), duel->opponent->GetGUID().ToString().c_str()); WorldPacket data(SMSG_DUEL_COMPLETE, (1)); data << (uint8)((type != DUEL_INTERRUPTED) ? 1 : 0); @@ -7271,7 +7302,7 @@ void Player::DuelComplete(DuelCompleteType type) // Honor points after duel (the winner) - ImpConfig if (uint32 amount = sWorld->getIntConfig(CONFIG_HONOR_AFTER_DUEL)) - duel->opponent->RewardHonor(NULL, 1, amount); + duel->opponent->RewardHonor(nullptr, 1, amount); break; default: @@ -7326,9 +7357,9 @@ void Player::DuelComplete(DuelCompleteType type) duel->opponent->SetUInt32Value(PLAYER_DUEL_TEAM, 0); delete duel->opponent->duel; - duel->opponent->duel = NULL; + duel->opponent->duel = nullptr; delete duel; - duel = NULL; + duel = nullptr; } //---------------------------------------------------------// @@ -7347,7 +7378,7 @@ void Player::_ApplyItemMods(Item* item, uint8 slot, bool apply) if (item->IsBroken()) return; - TC_LOG_DEBUG("entities.player.items", "applying mods for item %u ", item->GetGUID().GetCounter()); + TC_LOG_DEBUG("entities.player.items", "Player::_ApplyItemMods: Applying mods for item %s", item->GetGUID().ToString().c_str()); uint8 attacktype = Player::GetAttackBySlot(slot); @@ -7365,7 +7396,7 @@ void Player::_ApplyItemMods(Item* item, uint8 slot, bool apply) ApplyItemEquipSpell(item, apply); ApplyEnchantment(item, apply); - TC_LOG_DEBUG("entities.player.items", "_ApplyItemMods complete."); + TC_LOG_DEBUG("entities.player.items", "Player::_ApplyItemMods: completed"); } void Player::_ApplyItemBonuses(ItemTemplate const* proto, uint8 slot, bool apply, bool only_level_scale /*= false*/) @@ -7741,7 +7772,7 @@ void Player::_ApplyWeaponDependentAuraCritMod(Item* item, WeaponAttackType attac if (aura->GetSpellInfo()->EquippedItemClass == -1) return; - BaseModGroup mod = BASEMOD_END; + BaseModGroup mod; switch (attackType) { case BASE_ATTACK: mod = CRIT_PERCENTAGE; break; @@ -7768,7 +7799,7 @@ void Player::_ApplyWeaponDependentAuraDamageMod(Item* item, WeaponAttackType att if (aura->GetSpellInfo()->EquippedItemClass == -1) return; - UnitMods unitMod = UNIT_MOD_END; + UnitMods unitMod; switch (attackType) { case BASE_ATTACK: unitMod = UNIT_MOD_DAMAGE_MAINHAND; break; @@ -7777,7 +7808,7 @@ void Player::_ApplyWeaponDependentAuraDamageMod(Item* item, WeaponAttackType att default: return; } - UnitModifierType unitModType = TOTAL_VALUE; + UnitModifierType unitModType; switch (aura->GetAuraType()) { case SPELL_AURA_MOD_DAMAGE_DONE: unitModType = TOTAL_VALUE; break; @@ -7844,7 +7875,8 @@ void Player::ApplyEquipSpell(SpellInfo const* spellInfo, Item* item, bool apply, return; } - TC_LOG_DEBUG("entities.player", "WORLD: cast %s Equip spellId - %i", (item ? "item" : "itemset"), spellInfo->Id); + TC_LOG_DEBUG("entities.player", "Player::ApplyEquipSpell: Player '%s' (%s) cast %s equip spell (ID: %i)", + GetName().c_str(), GetGUID().ToString().c_str(), (item ? "item" : "itemset"), spellInfo->Id); CastSpell(this, spellInfo, true, item); } @@ -7950,7 +7982,8 @@ void Player::CastItemCombatSpell(Unit* target, WeaponAttackType attType, uint32 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellData.SpellId); if (!spellInfo) { - TC_LOG_ERROR("entities.player.items", "WORLD: unknown Item spellid %i", spellData.SpellId); + TC_LOG_ERROR("entities.player.items", "Player::CastItemCombatSpell: Player '%s' (%s) cast unknown item spell (ID: %i)", + GetName().c_str(), GetGUID().ToString().c_str(), spellData.SpellId); continue; } @@ -8005,8 +8038,8 @@ void Player::CastItemCombatSpell(Unit* target, WeaponAttackType attType, uint32 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(pEnchant->spellid[s]); if (!spellInfo) { - TC_LOG_ERROR("entities.player.items", "Player::CastItemCombatSpell(GUID: %u, name: %s, enchant: %i): unknown spell %i is cast, ignoring...", - GetGUID().GetCounter(), GetName().c_str(), pEnchant->ID, pEnchant->spellid[s]); + TC_LOG_ERROR("entities.player.items", "Player::CastItemCombatSpell: Player '%s' (%s) cast unknown spell (EnchantID: %u, SpellID: %i), ignoring", + GetName().c_str(), GetGUID().ToString().c_str(), pEnchant->ID, pEnchant->spellid[s]); continue; } @@ -8050,7 +8083,7 @@ void Player::CastItemUseSpell(Item* item, SpellCastTargets const& targets, uint8 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(learn_spell_id); if (!spellInfo) { - TC_LOG_ERROR("entities.player", "Player::CastItemUseSpell: Item (Entry: %u) in have wrong spell id %u, ignoring ", proto->ItemId, learn_spell_id); + TC_LOG_ERROR("entities.player", "Player::CastItemUseSpell: Item (Entry: %u) has wrong spell id %u, ignoring.", proto->ItemId, learn_spell_id); SendEquipError(EQUIP_ERR_NONE, item, NULL); return; } @@ -8079,7 +8112,7 @@ void Player::CastItemUseSpell(Item* item, SpellCastTargets const& targets, uint8 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellData.SpellId); if (!spellInfo) { - TC_LOG_ERROR("entities.player", "Player::CastItemUseSpell: Item (Entry: %u) in have wrong spell id %u, ignoring", proto->ItemId, spellData.SpellId); + TC_LOG_ERROR("entities.player", "Player::CastItemUseSpell: Item (Entry: %u) has wrong spell id %u, ignoring", proto->ItemId, spellData.SpellId); continue; } @@ -8106,7 +8139,7 @@ void Player::CastItemUseSpell(Item* item, SpellCastTargets const& targets, uint8 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(pEnchant->spellid[s]); if (!spellInfo) { - TC_LOG_ERROR("entities.player", "Player::CastItemUseSpell Enchant %i, cast unknown spell %i", pEnchant->ID, pEnchant->spellid[s]); + TC_LOG_ERROR("entities.player", "Player::CastItemUseSpell: Enchant %i, cast unknown spell %i", pEnchant->ID, pEnchant->spellid[s]); continue; } @@ -8325,7 +8358,7 @@ void Player::RemovedInsignia(Player* looterPlr) looterPlr->SendLoot(bones->GetGUID(), LOOT_INSIGNIA); } -void Player::SendLootRelease(ObjectGuid guid) +void Player::SendLootRelease(ObjectGuid guid) const { WorldPacket data(SMSG_LOOT_RELEASE_RESPONSE, (8+1)); data << uint64(guid) << uint8(1); @@ -8337,13 +8370,13 @@ void Player::SendLoot(ObjectGuid guid, LootType loot_type) if (ObjectGuid lguid = GetLootGUID()) m_session->DoLootRelease(lguid); - Loot* loot = 0; + Loot* loot; PermissionTypes permission = ALL_PERMISSION; - TC_LOG_DEBUG("loot", "Player::SendLoot"); + TC_LOG_DEBUG("loot", "Player::SendLoot: Player: '%s' (%s), Loot: %s", + GetName().c_str(), GetGUID().ToString().c_str(), guid.ToString().c_str()); if (guid.IsGameObject()) { - TC_LOG_DEBUG("loot", "IS_GAMEOBJECT_GUID(guid)"); GameObject* go = GetMap()->GetGameObject(guid); // not check distance for GO in case owned GO (fishing bobber case, for example) @@ -8552,7 +8585,6 @@ void Player::SendLoot(ObjectGuid guid, LootType loot_type) } else { - permission = NONE_PERMISSION; SendLootError(guid, LOOT_ERROR_ALREADY_PICKPOCKETED); return; } @@ -8667,7 +8699,7 @@ void Player::SendLoot(ObjectGuid guid, LootType loot_type) SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_LOOTING); } -void Player::SendLootError(ObjectGuid guid, LootError error) +void Player::SendLootError(ObjectGuid guid, LootError error) const { WorldPacket data(SMSG_LOOT_RESPONSE, 10); data << uint64(guid); @@ -8676,20 +8708,20 @@ void Player::SendLootError(ObjectGuid guid, LootError error) SendDirectMessage(&data); } -void Player::SendNotifyLootMoneyRemoved() +void Player::SendNotifyLootMoneyRemoved() const { WorldPacket data(SMSG_LOOT_CLEAR_MONEY, 0); GetSession()->SendPacket(&data); } -void Player::SendNotifyLootItemRemoved(uint8 lootSlot) +void Player::SendNotifyLootItemRemoved(uint8 lootSlot) const { WorldPacket data(SMSG_LOOT_REMOVED, 1); data << uint8(lootSlot); GetSession()->SendPacket(&data); } -void Player::SendUpdateWorldState(uint32 Field, uint32 Value) +void Player::SendUpdateWorldState(uint32 Field, uint32 Value) const { WorldPacket data(SMSG_UPDATE_WORLD_STATE, 8); data << Field; @@ -9324,7 +9356,7 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid) SendBattlefieldWorldStates(); } -void Player::SendBGWeekendWorldStates() +void Player::SendBGWeekendWorldStates() const { for (uint32 i = 1; i < sBattlemasterListStore.GetNumRows(); ++i) { @@ -9339,7 +9371,7 @@ void Player::SendBGWeekendWorldStates() } } -void Player::SendBattlefieldWorldStates() +void Player::SendBattlefieldWorldStates() const { /// Send misc stuff that needs to be sent on every login, like the battle timers. if (sWorld->getBoolConfig(CONFIG_WINTERGRASP_ENABLE)) @@ -9348,7 +9380,7 @@ void Player::SendBattlefieldWorldStates() { 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)); + SendUpdateWorldState(ClockWorldState[1], uint32(time(nullptr) + timer)); } } } @@ -9362,18 +9394,18 @@ uint32 Player::GetXPRestBonus(uint32 xp) SetRestBonus(GetRestBonus() - rested_bonus); - TC_LOG_DEBUG("entities.player", "GetXPRestBonus: Player %s (%u) gain %u xp (+%u Rested Bonus). Rested points=%f", GetName().c_str(), GetGUID().GetCounter(), xp+rested_bonus, rested_bonus, GetRestBonus()); + TC_LOG_DEBUG("entities.player", "Player::GetXPRestBonus: Player '%s' (%s) gain %u xp (+%u Rested Bonus). Rested points=%f", GetGUID().ToString().c_str(), GetName().c_str(), xp + rested_bonus, rested_bonus, GetRestBonus()); return rested_bonus; } -void Player::SetBindPoint(ObjectGuid guid) +void Player::SetBindPoint(ObjectGuid guid) const { WorldPacket data(SMSG_BINDER_CONFIRM, 8); data << uint64(guid); GetSession()->SendPacket(&data); } -void Player::SendTalentWipeConfirm(ObjectGuid guid) +void Player::SendTalentWipeConfirm(ObjectGuid guid) const { WorldPacket data(MSG_TALENT_WIPE_CONFIRM, (8+4)); data << uint64(guid); @@ -9394,7 +9426,7 @@ void Player::ResetPetTalents() CharmInfo* charmInfo = pet->GetCharmInfo(); if (!charmInfo) { - TC_LOG_ERROR("entities.player", "Object (GUID: %u TypeId: %u) is considered pet-like but doesn't have a charminfo!", pet->GetGUID().GetCounter(), pet->GetTypeId()); + TC_LOG_ERROR("entities.player", "Object (GUID: %u TypeId: %u) is considered pet-like, but doesn't have charm info!", pet->GetGUID().GetCounter(), pet->GetTypeId()); return; } pet->resetTalents(); @@ -9430,24 +9462,24 @@ void Player::SetSheath(SheathState sheathed) switch (sheathed) { case SHEATH_STATE_UNARMED: // no prepared weapon - SetVirtualItemSlot(0, NULL); - SetVirtualItemSlot(1, NULL); - SetVirtualItemSlot(2, NULL); + SetVirtualItemSlot(0, nullptr); + SetVirtualItemSlot(1, nullptr); + SetVirtualItemSlot(2, nullptr); break; case SHEATH_STATE_MELEE: // prepared melee weapon SetVirtualItemSlot(0, GetWeaponForAttack(BASE_ATTACK, true)); SetVirtualItemSlot(1, GetWeaponForAttack(OFF_ATTACK, true)); - SetVirtualItemSlot(2, NULL); + SetVirtualItemSlot(2, nullptr); break; case SHEATH_STATE_RANGED: // prepared ranged weapon - SetVirtualItemSlot(0, NULL); - SetVirtualItemSlot(1, NULL); + SetVirtualItemSlot(0, nullptr); + SetVirtualItemSlot(1, nullptr); SetVirtualItemSlot(2, GetWeaponForAttack(RANGED_ATTACK, true)); break; default: - SetVirtualItemSlot(0, NULL); - SetVirtualItemSlot(1, NULL); - SetVirtualItemSlot(2, NULL); + SetVirtualItemSlot(0, nullptr); + SetVirtualItemSlot(1, nullptr); + SetVirtualItemSlot(2, nullptr); break; } Unit::SetSheath(sheathed); // this must visualize Sheath changing for other players... @@ -9795,7 +9827,7 @@ Item* Player::GetItemByGuid(ObjectGuid guid) const if (pItem->GetGUID() == guid) return pItem; - return NULL; + return nullptr; } Item* Player::GetItemByPos(uint16 pos) const @@ -9809,9 +9841,9 @@ Item* Player::GetItemByPos(uint8 bag, uint8 slot) const { if (bag == INVENTORY_SLOT_BAG_0 && (slot < BANK_SLOT_BAG_END || (slot >= KEYRING_SLOT_START && slot < CURRENCYTOKEN_SLOT_END))) return m_items[slot]; - else if (Bag* pBag = GetBagByPos(bag)) + if (Bag* pBag = GetBagByPos(bag)) return pBag->GetItemByPos(slot); - return NULL; + return nullptr; } //Does additional check for disarmed weapons @@ -9828,7 +9860,7 @@ Bag* Player::GetBagByPos(uint8 bag) const || (bag >= BANK_SLOT_BAG_START && bag < BANK_SLOT_BAG_END)) if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, bag)) return item->ToBag(); - return NULL; + return nullptr; } Item* Player::GetWeaponForAttack(WeaponAttackType attackType, bool useable /*= false*/) const @@ -9839,41 +9871,41 @@ Item* Player::GetWeaponForAttack(WeaponAttackType attackType, bool useable /*= f case BASE_ATTACK: slot = EQUIPMENT_SLOT_MAINHAND; break; case OFF_ATTACK: slot = EQUIPMENT_SLOT_OFFHAND; break; case RANGED_ATTACK: slot = EQUIPMENT_SLOT_RANGED; break; - default: return NULL; + default: return nullptr; } - Item* item = NULL; + Item* item; if (useable) item = GetUseableItemByPos(INVENTORY_SLOT_BAG_0, slot); else item = GetItemByPos(INVENTORY_SLOT_BAG_0, slot); if (!item || item->GetTemplate()->Class != ITEM_CLASS_WEAPON) - return NULL; + return nullptr; if (!useable) return item; if (item->IsBroken() || IsInFeralForm()) - return NULL; + return nullptr; return item; } Item* Player::GetShield(bool useable) const { - Item* item = NULL; + Item* item; if (useable) item = GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND); else item = GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND); if (!item || item->GetTemplate()->Class != ITEM_CLASS_ARMOR) - return NULL; + return nullptr; if (!useable) return item; if (item->IsBroken()) - return NULL; + return nullptr; return item; } @@ -9933,7 +9965,7 @@ bool Player::IsBagPos(uint16 pos) return false; } -bool Player::IsValidPos(uint8 bag, uint8 slot, bool explicit_pos) +bool Player::IsValidPos(uint8 bag, uint8 slot, bool explicit_pos) const { // post selected if (bag == NULL_BAG && !explicit_pos) @@ -10190,7 +10222,7 @@ InventoryResult Player::CanTakeMoreSimilarItems(uint32 entry, uint32 count, Item InventoryResult Player::CanStoreNewItem(uint8 bag, uint8 slot, ItemPosCountVec& dest, uint32 item, uint32 count, uint32* no_space_count /*= NULL*/) const { - return CanStoreItem(bag, slot, dest, item, count, NULL, false, no_space_count); + return CanStoreItem(bag, slot, dest, item, count, nullptr, false, no_space_count); } InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec& dest, Item* pItem, bool swap /*= false*/) const @@ -10198,7 +10230,7 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec& des if (!pItem) return EQUIP_ERR_ITEM_NOT_FOUND; uint32 count = pItem->GetCount(); - return CanStoreItem(bag, slot, dest, pItem->GetEntry(), count, pItem, swap, NULL); + return CanStoreItem(bag, slot, dest, pItem->GetEntry(), count, pItem, swap, nullptr); } bool Player::HasItemTotemCategory(uint32 TotemCategory) const @@ -10237,7 +10269,7 @@ InventoryResult Player::CanStoreItem_InSpecificSlot(uint8 bag, uint8 slot, ItemP // ignore move item (this slot will be empty at move) if (pItem2 == pSrcItem) - pItem2 = NULL; + pItem2 = nullptr; uint32 need_space; @@ -10311,7 +10343,7 @@ InventoryResult Player::CanStoreItem_InBag(uint8 bag, ItemPosCountVec &dest, Ite if (bag == skip_bag) return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG; - // skip not existed bag or self targeted bag + // skip non-existing bag or self targeted bag Bag* pBag = GetBagByPos(bag); if (!pBag || pBag == pSrcItem) return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG; @@ -10323,7 +10355,7 @@ InventoryResult Player::CanStoreItem_InBag(uint8 bag, ItemPosCountVec &dest, Ite if (!pBagProto) return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG; - // specialized bag mode or non-specilized + // specialized bag mode or non-specialized if (non_specialized != (pBagProto->Class == ITEM_CLASS_CONTAINER && pBagProto->SubClass == ITEM_SUBCLASS_CONTAINER)) return EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG; @@ -10340,10 +10372,10 @@ InventoryResult Player::CanStoreItem_InBag(uint8 bag, ItemPosCountVec &dest, Ite // ignore move item (this slot will be empty at move) if (pItem2 == pSrcItem) - pItem2 = NULL; + pItem2 = nullptr; // if merge skip empty, if !merge skip non-empty - if ((pItem2 != NULL) != merge) + if ((pItem2 != nullptr) != merge) continue; uint32 need_space = pProto->GetMaxStackSize(); @@ -10391,10 +10423,10 @@ InventoryResult Player::CanStoreItem_InInventorySlots(uint8 slot_begin, uint8 sl // ignore move item (this slot will be empty at move) if (pItem2 == pSrcItem) - pItem2 = NULL; + pItem2 = nullptr; // if merge skip empty, if !merge skip non-empty - if ((pItem2 != NULL) != merge) + if ((pItem2 != nullptr) != merge) continue; uint32 need_space = pProto->GetMaxStackSize(); @@ -10428,7 +10460,7 @@ InventoryResult Player::CanStoreItem_InInventorySlots(uint8 slot_begin, uint8 sl InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &dest, uint32 entry, uint32 count, Item* pItem, bool swap, uint32* no_space_count) const { - TC_LOG_DEBUG("entities.player.items", "STORAGE: CanStoreItem bag = %u, slot = %u, item = %u, count = %u", bag, slot, entry, count); + TC_LOG_DEBUG("entities.player.items", "Player::CanStoreItem: Bag: %u, Slot: %u, Item: %u, Count: %u", bag, slot, entry, count); ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(entry); if (!pProto) @@ -10913,7 +10945,8 @@ InventoryResult Player::CanStoreItems(Item** items, int count, uint32* itemLimit if (!item) continue; - TC_LOG_DEBUG("entities.player.items", "STORAGE: CanStoreItems %i. item = %u, count = %u", k + 1, item->GetEntry(), item->GetCount()); + TC_LOG_DEBUG("entities.player.items", "Player::CanStoreItems: Player '%s' (%s), Index: %i ItemID: %u, Count: %u", + GetName().c_str(), GetGUID().ToString().c_str(), k + 1, item->GetEntry(), item->GetCount()); ItemTemplate const* pProto = item->GetTemplate(); // strange item @@ -11130,7 +11163,8 @@ InventoryResult Player::CanEquipItem(uint8 slot, uint16 &dest, Item* pItem, bool dest = 0; if (pItem) { - TC_LOG_DEBUG("entities.player.items", "STORAGE: CanEquipItem slot = %u, item = %u, count = %u", slot, pItem->GetEntry(), pItem->GetCount()); + TC_LOG_DEBUG("entities.player.items", "Player::CanEquipItem: Player '%s' (%s), Slot: %u, Item: %u, Count: %u", + GetName().c_str(), GetGUID().ToString().c_str(), slot, pItem->GetEntry(), pItem->GetCount()); ItemTemplate const* pProto = pItem->GetTemplate(); if (pProto) { @@ -11296,11 +11330,12 @@ InventoryResult Player::CanUnequipItem(uint16 pos, bool swap) const Item* pItem = GetItemByPos(pos); - // Applied only to existed equipped item + // Applied only to existing equipped item if (!pItem) return EQUIP_ERR_OK; - TC_LOG_DEBUG("entities.player.items", "STORAGE: CanUnequipItem slot = %u, item = %u, count = %u", pos, pItem->GetEntry(), pItem->GetCount()); + TC_LOG_DEBUG("entities.player.items", "Player::CanUnequipItem: Player '%s' (%s), Slot: %u, Item: %u, Count: %u", + GetName().c_str(), GetGUID().ToString().c_str(), pos, pItem->GetEntry(), pItem->GetCount()); ItemTemplate const* pProto = pItem->GetTemplate(); if (!pProto) @@ -11336,7 +11371,8 @@ InventoryResult Player::CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec &dest uint32 count = pItem->GetCount(); - TC_LOG_DEBUG("entities.player.items", "STORAGE: CanBankItem bag = %u, slot = %u, item = %u, count = %u", bag, slot, pItem->GetEntry(), pItem->GetCount()); + TC_LOG_DEBUG("entities.player.items", "Player::CanBankItem: Player '%s' (%s), Bag: %u, Slot: %u, Item: %u, Count: %u", + GetName().c_str(), GetGUID().ToString().c_str(), bag, slot, pItem->GetEntry(), pItem->GetCount()); ItemTemplate const* pProto = pItem->GetTemplate(); if (!pProto) return swap ? EQUIP_ERR_ITEMS_CANT_BE_SWAPPED : EQUIP_ERR_ITEM_NOT_FOUND; @@ -11352,8 +11388,8 @@ InventoryResult Player::CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec &dest uint8 pItemslot = pItem->GetSlot(); if (pItemslot >= CURRENCYTOKEN_SLOT_START && pItemslot < CURRENCYTOKEN_SLOT_END) { - TC_LOG_ERROR("entities.player", "Possible hacking attempt: Player %s [guid: %u] tried to move token [guid: %u, entry: %u] out of the currency bag!", - GetName().c_str(), GetGUID().GetCounter(), pItem->GetGUID().GetCounter(), pProto->ItemId); + TC_LOG_ERROR("entities.player", "Possible hacking attempt: Player %s (%s) tried to move token [%s entry: %u] out of the currency bag!", + GetName().c_str(), GetGUID().ToString().c_str(), pItem->GetGUID().ToString().c_str(), pProto->ItemId); return EQUIP_ERR_ITEMS_CANT_BE_SWAPPED; } @@ -11520,7 +11556,8 @@ InventoryResult Player::CanUseItem(Item* pItem, bool not_loading) const { if (pItem) { - TC_LOG_DEBUG("entities.player.items", "STORAGE: CanUseItem item = %u", pItem->GetEntry()); + TC_LOG_DEBUG("entities.player.items", "Player::CanUseItem: Player '%s' (%s), Item: %u", + GetName().c_str(), GetGUID().ToString().c_str(), pItem->GetEntry()); if (!IsAlive() && not_loading) return EQUIP_ERR_YOU_ARE_DEAD; @@ -11801,7 +11838,7 @@ Item* Player::StoreNewItem(ItemPosCountVec const& dest, uint32 item, bool update Item* Player::StoreItem(ItemPosCountVec const& dest, Item* pItem, bool update) { if (!pItem) - return NULL; + return nullptr; Item* lastItem = pItem; for (ItemPosCountVec::const_iterator itr = dest.begin(); itr != dest.end();) @@ -11826,12 +11863,13 @@ Item* Player::StoreItem(ItemPosCountVec const& dest, Item* pItem, bool update) Item* Player::_StoreItem(uint16 pos, Item* pItem, uint32 count, bool clone, bool update) { if (!pItem) - return NULL; + return nullptr; uint8 bag = pos >> 8; uint8 slot = pos & 255; - TC_LOG_DEBUG("entities.player.items", "STORAGE: StoreItem bag = %u, slot = %u, item = %u, count = %u, guid = %u", bag, slot, pItem->GetEntry(), count, pItem->GetGUID().GetCounter()); + TC_LOG_DEBUG("entities.player.items", "Player::_StoreItem: Player '%s' (%s), Bag: %u, Slot: %u, Item: %u (%s), Count: %u", + GetName().c_str(), GetGUID().ToString().c_str(), bag, slot, pItem->GetEntry(), pItem->GetGUID().ToString().c_str(), count); Item* pItem2 = GetItemByPos(bag, slot); @@ -11843,7 +11881,7 @@ Item* Player::_StoreItem(uint16 pos, Item* pItem, uint32 count, bool clone, bool pItem->SetCount(count); if (!pItem) - return NULL; + return nullptr; if (pItem->GetTemplate()->Bonding == BIND_WHEN_PICKED_UP || pItem->GetTemplate()->Bonding == BIND_QUEST_ITEM || @@ -11859,7 +11897,7 @@ Item* Player::_StoreItem(uint16 pos, Item* pItem, uint32 count, bool clone, bool pItem->SetGuidValue(ITEM_FIELD_OWNER, GetGUID()); pItem->SetSlot(slot); - pItem->SetContainer(NULL); + pItem->SetContainer(nullptr); // need update known currency if (slot >= CURRENCYTOKEN_SLOT_START && slot < CURRENCYTOKEN_SLOT_END) @@ -11944,7 +11982,7 @@ Item* Player::EquipNewItem(uint16 pos, uint32 item, bool update) return EquipItem(pos, pItem, update); } - return NULL; + return nullptr; } Item* Player::EquipItem(uint16 pos, Item* pItem, bool update) @@ -11977,7 +12015,8 @@ Item* Player::EquipItem(uint16 pos, Item* pItem, bool update) SpellInfo const* spellProto = sSpellMgr->GetSpellInfo(cooldownSpell); if (!spellProto) - TC_LOG_ERROR("entities.player", "Weapon switch cooldown spell %u couldn't be found in Spell.dbc", cooldownSpell); + TC_LOG_ERROR("entities.player", "Player::EquipItem: Weapon switch cooldown spell %u for player '%s' (%s) couldn't be found in Spell.dbc", + cooldownSpell, GetName().c_str(), GetGUID().ToString().c_str()); else { m_weaponChangeTimer = spellProto->StartRecoveryTime; @@ -12097,14 +12136,15 @@ void Player::VisualizeItem(uint8 slot, Item* pItem) if (pItem->GetTemplate()->Bonding == BIND_WHEN_EQUIPED || pItem->GetTemplate()->Bonding == BIND_WHEN_PICKED_UP || pItem->GetTemplate()->Bonding == BIND_QUEST_ITEM) pItem->SetBinding(true); - TC_LOG_DEBUG("entities.player.items", "STORAGE: EquipItem slot = %u, item = %u", slot, pItem->GetEntry()); + TC_LOG_DEBUG("entities.player.items", "Player::SetVisibleItemSlot: Player '%s' (%s), Slot: %u, Item: %u", + GetName().c_str(), GetGUID().ToString().c_str(), slot, pItem->GetEntry()); m_items[slot] = pItem; SetGuidValue(PLAYER_FIELD_INV_SLOT_HEAD + (slot * 2), pItem->GetGUID()); pItem->SetGuidValue(ITEM_FIELD_CONTAINED, GetGUID()); pItem->SetGuidValue(ITEM_FIELD_OWNER, GetGUID()); pItem->SetSlot(slot); - pItem->SetContainer(NULL); + pItem->SetContainer(nullptr); if (slot < EQUIPMENT_SLOT_END) SetVisibleItemSlot(slot, pItem); @@ -12127,7 +12167,8 @@ void Player::RemoveItem(uint8 bag, uint8 slot, bool update) Item* pItem = GetItemByPos(bag, slot); if (pItem) { - TC_LOG_DEBUG("entities.player.items", "STORAGE: RemoveItem bag = %u, slot = %u, item = %u", bag, slot, pItem->GetEntry()); + TC_LOG_DEBUG("entities.player.items", "Player::RemoveItem: Player '%s' (%s), Bag: %u, Slot: %u, Item: %u", + GetName().c_str(), GetGUID().ToString().c_str(), bag, slot, pItem->GetEntry()); RemoveEnchantmentDurations(pItem); RemoveItemDurations(pItem); @@ -12181,11 +12222,11 @@ void Player::RemoveItem(uint8 bag, uint8 slot, bool update) } } - m_items[slot] = NULL; + m_items[slot] = nullptr; SetGuidValue(PLAYER_FIELD_INV_SLOT_HEAD + (slot * 2), ObjectGuid::Empty); if (slot < EQUIPMENT_SLOT_END) - SetVisibleItemSlot(slot, NULL); + SetVisibleItemSlot(slot, nullptr); } else if (Bag* pBag = GetBagByPos(bag)) pBag->RemoveItem(slot, update); @@ -12225,7 +12266,7 @@ void Player::MoveItemToInventory(ItemPosCountVec const& dest, Item* pItem, bool // store item Item* pLastItem = StoreItem(dest, pItem, update); - // only set if not merged to existed stack (pItem can be deleted already but we can compare pointers any way) + // only set if not merged to existing stack (pItem can be deleted already but we can compare pointers any way) if (pLastItem == pItem) { // update owner for last item (this can be original item with wrong owner @@ -12246,7 +12287,8 @@ void Player::DestroyItem(uint8 bag, uint8 slot, bool update) Item* pItem = GetItemByPos(bag, slot); if (pItem) { - TC_LOG_DEBUG("entities.player.items", "STORAGE: DestroyItem bag = %u, slot = %u, item = %u", bag, slot, pItem->GetEntry()); + TC_LOG_DEBUG("entities.player.items", "Player::DestroyItem: Player '%s' (%s), Bag: %u, Slot: %u, Item: %u", + GetName().c_str(), GetGUID().ToString().c_str(), bag, slot, pItem->GetEntry()); // Also remove all contained items if the item is a bag. // This if () prevents item saving crashes if the condition for a bag to be empty before being destroyed was bypassed somehow. if (pItem->IsNotEmptyBag()) @@ -12315,10 +12357,10 @@ void Player::DestroyItem(uint8 bag, uint8 slot, bool update) UpdateExpertise(OFF_ATTACK); // equipment visual show - SetVisibleItemSlot(slot, NULL); + SetVisibleItemSlot(slot, nullptr); } - m_items[slot] = NULL; + m_items[slot] = nullptr; } else if (Bag* pBag = GetBagByPos(bag)) pBag->RemoveItem(slot, update); @@ -12344,7 +12386,8 @@ void Player::DestroyItem(uint8 bag, uint8 slot, bool update) void Player::DestroyItemCount(uint32 itemEntry, uint32 count, bool update, bool unequip_check) { - TC_LOG_DEBUG("entities.player.items", "STORAGE: DestroyItemCount item = %u, count = %u", itemEntry, count); + TC_LOG_DEBUG("entities.player.items", "Player::DestroyItemCount: Player '%s' (%s), Item: %u, Count: %u", + GetName().c_str(), GetGUID().ToString().c_str(), itemEntry, count); uint32 remcount = 0; // in inventory @@ -12535,7 +12578,8 @@ void Player::DestroyItemCount(uint32 itemEntry, uint32 count, bool update, bool void Player::DestroyZoneLimitedItem(bool update, uint32 new_zone) { - TC_LOG_DEBUG("entities.player.items", "STORAGE: DestroyZoneLimitedItem in map %u and area %u", GetMapId(), new_zone); + TC_LOG_DEBUG("entities.player.items", "Player::DestroyZoneLimitedItem: In map %u and area %u for player '%s' (%s)", + GetMapId(), new_zone, GetName().c_str(), GetGUID().ToString().c_str()); // in inventory for (uint8 i = INVENTORY_SLOT_ITEM_START; i < INVENTORY_SLOT_ITEM_END; i++) @@ -12567,7 +12611,8 @@ void Player::DestroyConjuredItems(bool update) { // used when entering arena // destroys all conjured items - TC_LOG_DEBUG("entities.player.items", "STORAGE: DestroyConjuredItems"); + TC_LOG_DEBUG("entities.player.items", "Player::DestroyConjuredItems: Player '%s' (%s)", + GetName().c_str(), GetGUID().ToString().c_str()); // in inventory for (uint8 i = INVENTORY_SLOT_ITEM_START; i < INVENTORY_SLOT_ITEM_END; i++) @@ -12615,7 +12660,7 @@ Item* Player::GetItemByEntry(uint32 entry) const if (pItem->GetEntry() == entry) return pItem; - return NULL; + return nullptr; } void Player::DestroyItemCount(Item* pItem, uint32 &count, bool update) @@ -12623,7 +12668,8 @@ void Player::DestroyItemCount(Item* pItem, uint32 &count, bool update) if (!pItem) return; - TC_LOG_DEBUG("entities.player.items", "STORAGE: DestroyItemCount item (GUID: %u, Entry: %u) count = %u", pItem->GetGUID().GetCounter(), pItem->GetEntry(), count); + TC_LOG_DEBUG("entities.player.items", "Player::DestroyItemCount: Player '%s' (%s), Item (%s, Entry: %u), Count: %u", + GetName().c_str(), GetGUID().ToString().c_str(), pItem->GetGUID().ToString().c_str(), pItem->GetEntry(), count); if (pItem->GetCount() <= count) { @@ -12653,28 +12699,28 @@ void Player::SplitItem(uint16 src, uint16 dst, uint32 count) Item* pSrcItem = GetItemByPos(srcbag, srcslot); if (!pSrcItem) { - SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, pSrcItem, NULL); + SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, pSrcItem, nullptr); return; } if (pSrcItem->m_lootGenerated) // prevent split looting item (item { //best error message found for attempting to split while looting - SendEquipError(EQUIP_ERR_COULDNT_SPLIT_ITEMS, pSrcItem, NULL); + SendEquipError(EQUIP_ERR_COULDNT_SPLIT_ITEMS, pSrcItem, nullptr); return; } // not let split all items (can be only at cheating) if (pSrcItem->GetCount() == count) { - SendEquipError(EQUIP_ERR_COULDNT_SPLIT_ITEMS, pSrcItem, NULL); + SendEquipError(EQUIP_ERR_COULDNT_SPLIT_ITEMS, pSrcItem, nullptr); return; } - // not let split more existed items (can be only at cheating) + // not let split more existing items (can be only at cheating) if (pSrcItem->GetCount() < count) { - SendEquipError(EQUIP_ERR_TRIED_TO_SPLIT_MORE_THAN_COUNT, pSrcItem, NULL); + SendEquipError(EQUIP_ERR_TRIED_TO_SPLIT_MORE_THAN_COUNT, pSrcItem, nullptr); return; } @@ -12686,11 +12732,12 @@ void Player::SplitItem(uint16 src, uint16 dst, uint32 count) return; } - TC_LOG_DEBUG("entities.player.items", "STORAGE: SplitItem bag = %u, slot = %u, item = %u, count = %u", dstbag, dstslot, pSrcItem->GetEntry(), count); + TC_LOG_DEBUG("entities.player.items", "Player::SplitItem: Player '%s' (%s), Bag: %u, Slot: %u, Item: %u, Count: %u", + GetName().c_str(), GetGUID().ToString().c_str(), dstbag, dstslot, pSrcItem->GetEntry(), count); Item* pNewItem = pSrcItem->CloneItem(count, this); if (!pNewItem) { - SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, pSrcItem, NULL); + SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, pSrcItem, nullptr); return; } @@ -12705,7 +12752,7 @@ void Player::SplitItem(uint16 src, uint16 dst, uint32 count) { delete pNewItem; pSrcItem->SetCount(pSrcItem->GetCount() + count); - SendEquipError(msg, pSrcItem, NULL); + SendEquipError(msg, pSrcItem, nullptr); return; } @@ -12725,7 +12772,7 @@ void Player::SplitItem(uint16 src, uint16 dst, uint32 count) { delete pNewItem; pSrcItem->SetCount(pSrcItem->GetCount() + count); - SendEquipError(msg, pSrcItem, NULL); + SendEquipError(msg, pSrcItem, nullptr); return; } @@ -12745,7 +12792,7 @@ void Player::SplitItem(uint16 src, uint16 dst, uint32 count) { delete pNewItem; pSrcItem->SetCount(pSrcItem->GetCount() + count); - SendEquipError(msg, pSrcItem, NULL); + SendEquipError(msg, pSrcItem, nullptr); return; } @@ -12771,7 +12818,8 @@ void Player::SwapItem(uint16 src, uint16 dst) if (!pSrcItem) return; - TC_LOG_DEBUG("entities.player.items", "STORAGE: SwapItem bag = %u, slot = %u, item = %u", dstbag, dstslot, pSrcItem->GetEntry()); + TC_LOG_DEBUG("entities.player.items", "Player::SwapItem: Player '%s' (%s), Bag: %u, Slot: %u, Item: %u", + GetName().c_str(), GetGUID().ToString().c_str(), dstbag, dstslot, pSrcItem->GetEntry()); if (!IsAlive()) { @@ -12836,7 +12884,7 @@ void Player::SwapItem(uint16 src, uint16 dst) InventoryResult msg = CanStoreItem(dstbag, dstslot, dest, pSrcItem, false); if (msg != EQUIP_ERR_OK) { - SendEquipError(msg, pSrcItem, NULL); + SendEquipError(msg, pSrcItem, nullptr); return; } @@ -12851,7 +12899,7 @@ void Player::SwapItem(uint16 src, uint16 dst) InventoryResult msg = CanBankItem(dstbag, dstslot, dest, pSrcItem, false); if (msg != EQUIP_ERR_OK) { - SendEquipError(msg, pSrcItem, NULL); + SendEquipError(msg, pSrcItem, nullptr); return; } @@ -12865,7 +12913,7 @@ void Player::SwapItem(uint16 src, uint16 dst) InventoryResult msg = CanEquipItem(dstslot, dest, pSrcItem, false); if (msg != EQUIP_ERR_OK) { - SendEquipError(msg, pSrcItem, NULL); + SendEquipError(msg, pSrcItem, nullptr); return; } @@ -12974,8 +13022,8 @@ void Player::SwapItem(uint16 src, uint16 dst) { if (Bag* dstBag = pDstItem->ToBag()) { - Bag* emptyBag = NULL; - Bag* fullBag = NULL; + Bag* emptyBag = nullptr; + Bag* fullBag = nullptr; if (srcBag->IsEmpty() && !IsBagPos(src)) { emptyBag = srcBag; @@ -13088,7 +13136,6 @@ void Player::SwapItem(uint16 src, uint16 dst) if (bagItem->m_lootGenerated) { m_session->DoLootRelease(GetLootGUID()); - released = true; // not realy needed here break; } } @@ -13133,10 +13180,11 @@ void Player::AddItemToBuyBackSlot(Item* pItem) } RemoveItemFromBuyBackSlot(slot, true); - TC_LOG_DEBUG("entities.player.items", "STORAGE: AddItemToBuyBackSlot item = %u, slot = %u", pItem->GetEntry(), slot); + TC_LOG_DEBUG("entities.player.items", "Player::AddItemToBuyBackSlot: Player '%s' (%s), Item: %u, Slot: %u", + GetName().c_str(), GetGUID().ToString().c_str(), pItem->GetEntry(), slot); m_items[slot] = pItem; - time_t base = time(NULL); + time_t base = time(nullptr); uint32 etime = uint32(base - m_logintime + (30 * 3600)); uint32 eslot = slot - BUYBACK_SLOT_START; @@ -13155,15 +13203,17 @@ void Player::AddItemToBuyBackSlot(Item* pItem) Item* Player::GetItemFromBuyBackSlot(uint32 slot) { - TC_LOG_DEBUG("entities.player.items", "STORAGE: GetItemFromBuyBackSlot slot = %u", slot); + TC_LOG_DEBUG("entities.player.items", "Player::GetItemFromBuyBackSlot: Player '%s' (%s), Slot: %u", + GetName().c_str(), GetGUID().ToString().c_str(), slot); if (slot >= BUYBACK_SLOT_START && slot < BUYBACK_SLOT_END) return m_items[slot]; - return NULL; + return nullptr; } void Player::RemoveItemFromBuyBackSlot(uint32 slot, bool del) { - TC_LOG_DEBUG("entities.player.items", "STORAGE: RemoveItemFromBuyBackSlot slot = %u", slot); + TC_LOG_DEBUG("entities.player.items", "Player::RemoveItemFromBuyBackSlot: Player '%s' (%s), Slot: %u", + GetName().c_str(), GetGUID().ToString().c_str(), slot); if (slot >= BUYBACK_SLOT_START && slot < BUYBACK_SLOT_END) { Item* pItem = m_items[slot]; @@ -13174,7 +13224,7 @@ void Player::RemoveItemFromBuyBackSlot(uint32 slot, bool del) pItem->SetState(ITEM_REMOVED, this); } - m_items[slot] = NULL; + m_items[slot] = nullptr; uint32 eslot = slot - BUYBACK_SLOT_START; SetGuidValue(PLAYER_FIELD_VENDORBUYBACK_SLOT_1 + (eslot * 2), ObjectGuid::Empty); @@ -13187,9 +13237,9 @@ void Player::RemoveItemFromBuyBackSlot(uint32 slot, bool del) } } -void Player::SendEquipError(InventoryResult msg, Item* pItem, Item* pItem2, uint32 itemid) +void Player::SendEquipError(InventoryResult msg, Item* pItem, Item* pItem2, uint32 itemid) const { - TC_LOG_DEBUG("network", "WORLD: Sent SMSG_INVENTORY_CHANGE_FAILURE (%u)", msg); + WorldPacket data(SMSG_INVENTORY_CHANGE_FAILURE, (msg == EQUIP_ERR_CANT_EQUIP_LEVEL_I ? 22 : 18)); data << uint8(msg); @@ -13230,9 +13280,8 @@ void Player::SendEquipError(InventoryResult msg, Item* pItem, Item* pItem2, uint GetSession()->SendPacket(&data); } -void Player::SendBuyError(BuyResult msg, Creature* creature, uint32 item, uint32 param) +void Player::SendBuyError(BuyResult msg, Creature* creature, uint32 item, uint32 param) const { - TC_LOG_DEBUG("network", "WORLD: Sent SMSG_BUY_FAILED"); WorldPacket data(SMSG_BUY_FAILED, (8+4+4+1)); data << uint64(creature ? creature->GetGUID() : ObjectGuid::Empty); data << uint32(item); @@ -13242,9 +13291,8 @@ void Player::SendBuyError(BuyResult msg, Creature* creature, uint32 item, uint32 GetSession()->SendPacket(&data); } -void Player::SendSellError(SellResult msg, Creature* creature, ObjectGuid guid, uint32 param) +void Player::SendSellError(SellResult msg, Creature* creature, ObjectGuid guid, uint32 param) const { - TC_LOG_DEBUG("network", "WORLD: Sent SMSG_SELL_ITEM"); WorldPacket data(SMSG_SELL_ITEM, (8+8+(param?4:0)+1)); // last check 2.0.10 data << uint64(creature ? creature->GetGUID() : ObjectGuid::Empty); data << uint64(guid); @@ -13280,9 +13328,9 @@ void Player::TradeCancel(bool sendback) // cleanup delete m_trade; - m_trade = NULL; + m_trade = nullptr; delete trader->m_trade; - trader->m_trade = NULL; + trader->m_trade = nullptr; } } @@ -13314,7 +13362,8 @@ void Player::UpdateItemDuration(uint32 time, bool realtimeonly) if (m_itemDuration.empty()) return; - TC_LOG_DEBUG("entities.player.items", "Player::UpdateItemDuration(%u, %u)", time, realtimeonly); + TC_LOG_DEBUG("entities.player.items", "Player::UpdateItemDuration: Player '%s' (%s), Time: %u, RealTimeOnly: %u", + GetName().c_str(), GetGUID().ToString().c_str(), time, realtimeonly); for (ItemDurationList::const_iterator itr = m_itemDuration.begin(); itr != m_itemDuration.end();) { @@ -13775,7 +13824,7 @@ void Player::ApplyEnchantment(Item* item, EnchantmentSlot slot, bool apply, bool { if (getClass() == CLASS_SHAMAN) { - float addValue = 0.0f; + float addValue; if (item->GetSlot() == EQUIPMENT_SLOT_MAINHAND) { addValue = float(enchant_amount * item->GetTemplate()->Delay / 1000.0f); @@ -13796,7 +13845,8 @@ void Player::ApplyEnchantment(Item* item, EnchantmentSlot slot, bool apply, bool // nothing do.. break; default: - TC_LOG_ERROR("entities.player", "Unknown item enchantment (id = %d) display type: %d", enchant_id, enchant_display_type); + TC_LOG_ERROR("entities.player", "Player::ApplyEnchantment: Unknown item enchantment (ID: %u, DisplayType: %u) for player '%s' (%s)", + enchant_id, enchant_display_type, GetName().c_str(), GetGUID().ToString().c_str()); break; } /*switch (enchant_display_type)*/ } /*for*/ @@ -13967,7 +14017,7 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId /*= 0*/, bool VendorItemData const* vendorItems = creature->GetVendorItems(); if (!vendorItems || vendorItems->Empty()) { - TC_LOG_ERROR("sql.sql", "Creature %s (Entry: %u GUID: %u DB GUID: %u) has UNIT_NPC_FLAG_VENDOR set but has an empty trading item list.", creature->GetName().c_str(), creature->GetEntry(), creature->GetGUID().GetCounter(), creature->GetSpawnId()); + TC_LOG_ERROR("sql.sql", "Creature %s (Entry: %u GUID: %u DB GUID: %u) has UNIT_NPC_FLAG_VENDOR set, but has an empty trading item list.", creature->GetName().c_str(), creature->GetEntry(), creature->GetGUID().GetCounter(), creature->GetSpawnId()); canTalk = false; } break; @@ -14001,7 +14051,7 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId /*= 0*/, bool break; case GOSSIP_OPTION_TRAINER: if (getClass() != creature->GetCreatureTemplate()->trainer_class && creature->GetCreatureTemplate()->trainer_type == TRAINER_TYPE_CLASS) - TC_LOG_ERROR("sql.sql", "GOSSIP_OPTION_TRAINER:: Player %s (GUID: %u) request wrong gossip menu: %u with wrong class: %u at Creature: %s (Entry: %u, Trainer Class: %u)", + TC_LOG_ERROR("sql.sql", "GOSSIP_OPTION_TRAINER:: Player %s (GUID: %u) requested wrong gossip menu: %u with wrong class: %u at Creature: %s (Entry: %u, Trainer Class: %u)", GetName().c_str(), GetGUID().GetCounter(), menu->GetGossipMenu().GetMenuId(), getClass(), creature->GetName().c_str(), creature->GetEntry(), creature->GetCreatureTemplate()->trainer_class); // no break; case GOSSIP_OPTION_GOSSIP: @@ -14017,7 +14067,7 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId /*= 0*/, bool canTalk = false; break; default: - TC_LOG_ERROR("sql.sql", "Creature entry %u has unknown gossip option %u for menu %u", creature->GetEntry(), itr->second.OptionType, itr->second.MenuId); + TC_LOG_ERROR("sql.sql", "Creature entry %u has unknown gossip option %u for menu %u.", creature->GetEntry(), itr->second.OptionType, itr->second.MenuId); canTalk = false; break; } @@ -14058,14 +14108,14 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId /*= 0*/, bool if (!optionBroadcastText) { /// Find localizations from database. - if (GossipMenuItemsLocale const* gossipMenuLocale = sObjectMgr->GetGossipMenuItemsLocale(MAKE_PAIR32(menuId, menuId))) + if (GossipMenuItemsLocale const* gossipMenuLocale = sObjectMgr->GetGossipMenuItemsLocale(MAKE_PAIR32(menuId, itr->second.OptionIndex))) ObjectMgr::GetLocaleString(gossipMenuLocale->OptionText, locale, strOptionText); } if (!boxBroadcastText) { /// Find localizations from database. - if (GossipMenuItemsLocale const* gossipMenuLocale = sObjectMgr->GetGossipMenuItemsLocale(MAKE_PAIR32(menuId, menuId))) + if (GossipMenuItemsLocale const* gossipMenuLocale = sObjectMgr->GetGossipMenuItemsLocale(MAKE_PAIR32(menuId, itr->second.OptionIndex))) ObjectMgr::GetLocaleString(gossipMenuLocale->BoxText, locale, strBoxText); } } @@ -14130,7 +14180,8 @@ void Player::OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 men { if (gossipOptionId > GOSSIP_OPTION_QUESTGIVER) { - TC_LOG_ERROR("entities.player", "Player guid %u request invalid gossip option for GameObject entry %u", GetGUID().GetCounter(), source->GetEntry()); + TC_LOG_ERROR("entities.player", "Player '%s' (%s) requests invalid gossip option for GameObject (Entry: %u)", + GetName().c_str(), GetGUID().ToString().c_str(), source->GetEntry()); return; } } @@ -14142,7 +14193,7 @@ void Player::OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 men int32 cost = int32(item->BoxMoney); if (!HasEnoughMoney(cost)) { - SendBuyError(BUY_ERR_NOT_ENOUGHT_MONEY, 0, 0, 0); + SendBuyError(BUY_ERR_NOT_ENOUGHT_MONEY, nullptr, 0, 0); PlayerTalkClass->SendCloseGossip(); return; } @@ -14167,7 +14218,7 @@ void Player::OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 men break; case GOSSIP_OPTION_SPIRITHEALER: if (isDead()) - source->ToCreature()->CastSpell(source->ToCreature(), 17251, true, NULL, NULL, GetGUID()); + source->ToCreature()->CastSpell(source->ToCreature(), 17251, true, nullptr, nullptr, GetGUID()); break; case GOSSIP_OPTION_QUESTGIVER: PrepareQuestMenu(guid); @@ -14188,8 +14239,8 @@ void Player::OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 men { // Cast spells that teach dual spec // Both are also ImplicitTarget self and must be cast by player - CastSpell(this, 63680, true, NULL, NULL, GetGUID()); - CastSpell(this, 63624, true, NULL, NULL, GetGUID()); + CastSpell(this, 63680, true, nullptr, nullptr, GetGUID()); + CastSpell(this, 63624, true, nullptr, nullptr, GetGUID()); // Should show another Gossip text with "Congratulations..." PlayerTalkClass->SendCloseGossip(); @@ -14234,7 +14285,8 @@ void Player::OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 men if (bgTypeId == BATTLEGROUND_TYPE_NONE) { - TC_LOG_ERROR("entities.player", "a user (guid %u) requested battlegroundlist from a npc who is no battlemaster", GetGUID().GetCounter()); + TC_LOG_ERROR("entities.player", "Player '%s' (%s) requested battlegroundlist from an invalid creature (%s)", + GetName().c_str(), GetGUID().ToString().c_str(), source->GetGUID().ToString().c_str()); return; } @@ -14442,7 +14494,7 @@ bool Player::IsActiveQuest(uint32 quest_id) const return m_QuestStatus.find(quest_id) != m_QuestStatus.end(); } -Quest const* Player::GetNextQuest(ObjectGuid guid, Quest const* quest) +Quest const* Player::GetNextQuest(ObjectGuid guid, Quest const* quest) const { QuestRelationBounds objectQR; @@ -14459,7 +14511,7 @@ Quest const* Player::GetNextQuest(ObjectGuid guid, Quest const* quest) if (pGameObject) objectQR = sObjectMgr->GetGOQuestRelationBounds(pGameObject->GetEntry()); else - return NULL; + return nullptr; } uint32 nextQuestID = quest->GetNextQuestInChain(); @@ -14469,7 +14521,7 @@ Quest const* Player::GetNextQuest(ObjectGuid guid, Quest const* quest) return sObjectMgr->GetQuestTemplate(nextQuestID); } - return NULL; + return nullptr; } bool Player::CanSeeStartQuest(Quest const* quest) @@ -14499,7 +14551,7 @@ bool Player::CanTakeQuest(Quest const* quest, bool msg) && SatisfyQuestConditions(quest, msg); } -bool Player::CanAddQuest(Quest const* quest, bool msg) +bool Player::CanAddQuest(Quest const* quest, bool msg) const { if (!SatisfyQuestLog(msg)) return false; @@ -14514,9 +14566,9 @@ bool Player::CanAddQuest(Quest const* quest, bool msg) // player already have max number (in most case 1) source item, no additional item needed and quest can be added. if (msg2 == EQUIP_ERR_CANT_CARRY_MORE_OF_THIS) return true; - else if (msg2 != EQUIP_ERR_OK) + if (msg2 != EQUIP_ERR_OK) { - SendEquipError(msg2, NULL, NULL, srcitem); + SendEquipError(msg2, nullptr, nullptr, srcitem); return false; } } @@ -14635,7 +14687,7 @@ bool Player::CanRewardQuest(Quest const* quest, bool msg) GetItemCount(quest->RequiredItemId[i]) < quest->RequiredItemCount[i]) { if (msg) - SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, NULL, NULL, quest->RequiredItemId[i]); + SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, nullptr, nullptr, quest->RequiredItemId[i]); return false; } } @@ -14667,7 +14719,7 @@ void Player::AddQuestAndCheckCompletion(Quest const* quest, Object* questGiver) case TYPEID_ITEM: case TYPEID_CONTAINER: { - Item* item = (Item*)questGiver; + Item* item = static_cast<Item*>(questGiver); sScriptMgr->OnQuestAccept(this, item, quest); // destroy not required for quest finish quest starting item @@ -14709,7 +14761,7 @@ bool Player::CanRewardQuest(Quest const* quest, uint32 reward, bool msg) InventoryResult res = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, quest->RewardChoiceItemId[reward], quest->RewardChoiceItemCount[reward]); if (res != EQUIP_ERR_OK) { - SendEquipError(res, NULL, NULL, quest->RewardChoiceItemId[reward]); + SendEquipError(res, nullptr, nullptr, quest->RewardChoiceItemId[reward]); return false; } } @@ -14724,7 +14776,7 @@ bool Player::CanRewardQuest(Quest const* quest, uint32 reward, bool msg) InventoryResult res = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, quest->RewardItemId[i], quest->RewardItemIdCount[i]); if (res != EQUIP_ERR_OK) { - SendEquipError(res, NULL, NULL, quest->RewardItemId[i]); + SendEquipError(res, nullptr, nullptr, quest->RewardItemId[i]); return false; } } @@ -14787,7 +14839,7 @@ void Player::AddQuest(Quest const* quest, Object* questGiver) AddTimedQuest(quest_id); questStatusData.Timer = timeAllowed * IN_MILLISECONDS; - qtime = static_cast<uint32>(time(NULL)) + timeAllowed; + qtime = static_cast<uint32>(time(nullptr)) + timeAllowed; } else questStatusData.Timer = 0; @@ -14841,7 +14893,7 @@ void Player::CompleteQuest(uint32 quest_id) if (sWorld->getBoolConfig(CONFIG_QUEST_ENABLE_QUEST_TRACKER)) // check if Quest Tracker is enabled { - // prepare Quest Tracker datas + // prepare Quest Tracker data PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_QUEST_TRACK_COMPLETE_TIME); stmt->setUInt32(0, quest_id); stmt->setUInt32(1, GetGUID().GetCounter()); @@ -14935,7 +14987,7 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, int32 moneyRew = 0; if (getLevel() < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)) - GiveXP(XP, NULL); + GiveXP(XP, nullptr); else moneyRew = int32(quest->GetRewMoneyMaxLevel() * sWorld->getRate(RATE_DROP_MONEY)); @@ -14953,7 +15005,7 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, // honor reward if (uint32 honor = quest->CalculateHonorGain(getLevel())) - RewardHonor(NULL, 0, honor); + RewardHonor(nullptr, 0, honor); // title reward if (quest->GetCharTitleId()) @@ -15003,7 +15055,7 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, // StoreNewItem, mail reward, etc. save data directly to the database // to prevent exploitable data desynchronisation we save the quest status to the database too // (to prevent rewarding this quest another time while rewards were already given out) - SQLTransaction trans = SQLTransaction(NULL); + SQLTransaction trans = SQLTransaction(nullptr); _SaveQuestStatus(trans); if (announce) @@ -15107,7 +15159,8 @@ bool Player::SatisfyQuestSkill(Quest const* qInfo, bool msg) const if (msg) { SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - TC_LOG_DEBUG("misc", "SatisfyQuestSkill: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have required skill value.", qInfo->GetQuestId()); + TC_LOG_DEBUG("misc", "Player::SatisfyQuestSkill: Sent INVALIDREASON_DONT_HAVE_REQ (QuestID: %u) because player '%s' (%s) doesn't have the required skill value.", + qInfo->GetQuestId(), GetName().c_str(), GetGUID().ToString().c_str()); } return false; @@ -15116,30 +15169,33 @@ bool Player::SatisfyQuestSkill(Quest const* qInfo, bool msg) const return true; } -bool Player::SatisfyQuestLevel(Quest const* qInfo, bool msg) +bool Player::SatisfyQuestLevel(Quest const* qInfo, bool msg) const { if (getLevel() < qInfo->GetMinLevel()) { if (msg) { SendCanTakeQuestResponse(INVALIDREASON_QUEST_FAILED_LOW_LEVEL); - TC_LOG_DEBUG("misc", "SatisfyQuestLevel: Sent INVALIDREASON_QUEST_FAILED_LOW_LEVEL (questId: %u) because player does not have required (min) level.", qInfo->GetQuestId()); + TC_LOG_DEBUG("misc", "Player::SatisfyQuestLevel: Sent INVALIDREASON_QUEST_FAILED_LOW_LEVEL (QuestID: %u) because player '%s' (%s) doesn't have the required (min) level.", + qInfo->GetQuestId(), GetName().c_str(), GetGUID().ToString().c_str()); } return false; } - else if (qInfo->GetMaxLevel() > 0 && getLevel() > qInfo->GetMaxLevel()) + + if (qInfo->GetMaxLevel() > 0 && getLevel() > qInfo->GetMaxLevel()) { if (msg) { SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); // There doesn't seem to be a specific response for too high player level - TC_LOG_DEBUG("misc", "SatisfyQuestLevel: Sent INVALIDREASON_QUEST_FAILED_LOW_LEVEL (questId: %u) because player does not have required (max) level.", qInfo->GetQuestId()); + TC_LOG_DEBUG("misc", "Player::SatisfyQuestLevel: Sent INVALIDREASON_DONT_HAVE_REQ (QuestID: %u) because player '%s' (%s) doesn't have the required (max) level.", + qInfo->GetQuestId(), GetName().c_str(), GetGUID().ToString().c_str()); } return false; } return true; } -bool Player::SatisfyQuestLog(bool msg) +bool Player::SatisfyQuestLog(bool msg) const { // exist free slot if (FindQuestSlot(0) < MAX_QUEST_LOG_SIZE) @@ -15149,7 +15205,6 @@ bool Player::SatisfyQuestLog(bool msg) { WorldPacket data(SMSG_QUESTLOG_FULL, 0); GetSession()->SendPacket(&data); - TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTLOG_FULL"); } return false; } @@ -15193,7 +15248,8 @@ bool Player::SatisfyQuestPreviousQuest(Quest const* qInfo, bool msg) if (msg) { SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - TC_LOG_DEBUG("misc", "SatisfyQuestPreviousQuest: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have required quest (1).", qInfo->GetQuestId()); + TC_LOG_DEBUG("misc", "Player::SatisfyQuestPreviousQuest: Sent INVALIDREASON_DONT_HAVE_REQ (QuestID: %u) because player '%s' (%s) doesn't have the required quest (1).", + qInfo->GetQuestId(), GetName().c_str(), GetGUID().ToString().c_str()); } return false; } @@ -15226,7 +15282,8 @@ bool Player::SatisfyQuestPreviousQuest(Quest const* qInfo, bool msg) if (msg) { SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - TC_LOG_DEBUG("misc", "SatisfyQuestPreviousQuest: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have required quest (2).", qInfo->GetQuestId()); + TC_LOG_DEBUG("misc", "Player::SatisfyQuestPreviousQuest: Sent INVALIDREASON_DONT_HAVE_REQ (QuestID: %u) because player '%s' (%s) doesn't have the required quest (2).", + qInfo->GetQuestId(), GetName().c_str(), GetGUID().ToString().c_str()); } return false; @@ -15242,7 +15299,8 @@ bool Player::SatisfyQuestPreviousQuest(Quest const* qInfo, bool msg) if (msg) { SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - TC_LOG_DEBUG("misc", "SatisfyQuestPreviousQuest: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have required quest (3).", qInfo->GetQuestId()); + TC_LOG_DEBUG("misc", "Player::SatisfyQuestPreviousQuest: Sent INVALIDREASON_DONT_HAVE_REQ (QuestID: %u) because player '%s' (%s) doesn't have required quest (3).", + qInfo->GetQuestId(), GetName().c_str(), GetGUID().ToString().c_str()); } return false; @@ -15260,7 +15318,8 @@ bool Player::SatisfyQuestClass(Quest const* qInfo, bool msg) const if (msg) { SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - TC_LOG_DEBUG("misc", "SatisfyQuestClass: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have required class.", qInfo->GetQuestId()); + TC_LOG_DEBUG("misc", "Player::SatisfyQuestClass: Sent INVALIDREASON_DONT_HAVE_REQ (QuestID: %u) because player '%s' (%s) doesn't have required class.", + qInfo->GetQuestId(), GetName().c_str(), GetGUID().ToString().c_str()); } return false; @@ -15269,7 +15328,7 @@ bool Player::SatisfyQuestClass(Quest const* qInfo, bool msg) const return true; } -bool Player::SatisfyQuestRace(Quest const* qInfo, bool msg) +bool Player::SatisfyQuestRace(Quest const* qInfo, bool msg) const { uint32 reqraces = qInfo->GetAllowableRaces(); if (reqraces == 0) @@ -15279,7 +15338,8 @@ bool Player::SatisfyQuestRace(Quest const* qInfo, bool msg) if (msg) { SendCanTakeQuestResponse(INVALIDREASON_QUEST_FAILED_WRONG_RACE); - TC_LOG_DEBUG("misc", "SatisfyQuestRace: Sent INVALIDREASON_QUEST_FAILED_WRONG_RACE (questId: %u) because player does not have required race.", qInfo->GetQuestId()); + TC_LOG_DEBUG("misc", "Player::SatisfyQuestRace: Sent INVALIDREASON_QUEST_FAILED_WRONG_RACE (QuestID: %u) because player '%s' (%s) doesn't have required race.", + qInfo->GetQuestId(), GetName().c_str(), GetGUID().ToString().c_str()); } return false; @@ -15295,7 +15355,8 @@ bool Player::SatisfyQuestReputation(Quest const* qInfo, bool msg) if (msg) { SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - TC_LOG_DEBUG("misc", "SatisfyQuestReputation: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have required reputation (min).", qInfo->GetQuestId()); + TC_LOG_DEBUG("misc", "Player::SatisfyQuestReputation: Sent INVALIDREASON_DONT_HAVE_REQ (QuestID: %u) because player '%s' (%s) doesn't required reputation (min).", + qInfo->GetQuestId(), GetName().c_str(), GetGUID().ToString().c_str()); } return false; } @@ -15306,7 +15367,8 @@ bool Player::SatisfyQuestReputation(Quest const* qInfo, bool msg) if (msg) { SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - TC_LOG_DEBUG("misc", "SatisfyQuestReputation: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have required reputation (max).", qInfo->GetQuestId()); + TC_LOG_DEBUG("misc", "SatisfyQuestReputation: Sent INVALIDREASON_DONT_HAVE_REQ (QuestID: %u) because player '%s' (%s) doesn't required reputation (max).", + qInfo->GetQuestId(), GetName().c_str(), GetGUID().ToString().c_str()); } return false; } @@ -15319,7 +15381,7 @@ bool Player::SatisfyQuestReputation(Quest const* qInfo, bool msg) if (msg) { SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - TC_LOG_DEBUG("misc", "SatisfyQuestReputation: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have required reputation (ReputationObjective2).", qInfo->GetQuestId()); + TC_LOG_DEBUG("misc", "SatisfyQuestReputation: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not have the required reputation (ReputationObjective2).", qInfo->GetQuestId()); } return false; } @@ -15327,14 +15389,15 @@ bool Player::SatisfyQuestReputation(Quest const* qInfo, bool msg) return true; } -bool Player::SatisfyQuestStatus(Quest const* qInfo, bool msg) +bool Player::SatisfyQuestStatus(Quest const* qInfo, bool msg) const { if (GetQuestStatus(qInfo->GetQuestId()) != QUEST_STATUS_NONE) { if (msg) { SendCanTakeQuestResponse(INVALIDREASON_QUEST_ALREADY_ON); - TC_LOG_DEBUG("misc", "SatisfyQuestStatus: Sent INVALIDREASON_QUEST_ALREADY_ON (questId: %u) because player quest status is not NONE.", qInfo->GetQuestId()); + TC_LOG_DEBUG("misc", "Player::SatisfyQuestStatus: Sent INVALIDREASON_QUEST_ALREADY_ON (QuestID: %u) because player '%s' (%s) quest status is not NONE.", + qInfo->GetQuestId(), GetName().c_str(), GetGUID().ToString().c_str()); } return false; } @@ -15348,7 +15411,8 @@ bool Player::SatisfyQuestConditions(Quest const* qInfo, bool msg) if (msg) { SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - TC_LOG_DEBUG("misc", "SatisfyQuestConditions: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player does not meet conditions.", qInfo->GetQuestId()); + TC_LOG_DEBUG("misc", "Player::SatisfyQuestConditions: Sent INVALIDREASON_DONT_HAVE_REQ (QuestID: %u) because player '%s' (%s) doesn't meet conditions.", + qInfo->GetQuestId(), GetName().c_str(), GetGUID().ToString().c_str()); } TC_LOG_DEBUG("condition", "Player::SatisfyQuestConditions: conditions not met for quest %u", qInfo->GetQuestId()); return false; @@ -15356,14 +15420,15 @@ bool Player::SatisfyQuestConditions(Quest const* qInfo, bool msg) return true; } -bool Player::SatisfyQuestTimed(Quest const* qInfo, bool msg) +bool Player::SatisfyQuestTimed(Quest const* qInfo, bool msg) const { if (!m_timedquests.empty() && qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED)) { if (msg) { SendCanTakeQuestResponse(INVALIDREASON_QUEST_ONLY_ONE_TIMED); - TC_LOG_DEBUG("misc", "SatisfyQuestTimed: Sent INVALIDREASON_QUEST_ONLY_ONE_TIMED (questId: %u) because player is already on a timed quest.", qInfo->GetQuestId()); + TC_LOG_DEBUG("misc", "Player::SatisfyQuestTimed: Sent INVALIDREASON_QUEST_ONLY_ONE_TIMED (QuestID: %u) because player '%s' (%s) is already on a timed quest.", + qInfo->GetQuestId(), GetName().c_str(), GetGUID().ToString().c_str()); } return false; } @@ -15394,7 +15459,8 @@ bool Player::SatisfyQuestExclusiveGroup(Quest const* qInfo, bool msg) if (msg) { SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - TC_LOG_DEBUG("misc", "SatisfyQuestExclusiveGroup: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player already did daily quests in exclusive group.", qInfo->GetQuestId()); + TC_LOG_DEBUG("misc", "Player::SatisfyQuestExclusiveGroup: Sent INVALIDREASON_DONT_HAVE_REQ (QuestID: %u) because player '%s' (%s) already did daily quests in exclusive group.", + qInfo->GetQuestId(), GetName().c_str(), GetGUID().ToString().c_str()); } return false; @@ -15406,7 +15472,8 @@ bool Player::SatisfyQuestExclusiveGroup(Quest const* qInfo, bool msg) if (msg) { SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - TC_LOG_DEBUG("misc", "SatisfyQuestExclusiveGroup: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player already did quest in exclusive group.", qInfo->GetQuestId()); + TC_LOG_DEBUG("misc", "Player::SatisfyQuestExclusiveGroup: Sent INVALIDREASON_DONT_HAVE_REQ (QuestID: %u) because player '%s' (%s) already did quest in exclusive group.", + qInfo->GetQuestId(), GetName().c_str(), GetGUID().ToString().c_str()); } return false; } @@ -15414,7 +15481,7 @@ bool Player::SatisfyQuestExclusiveGroup(Quest const* qInfo, bool msg) return true; } -bool Player::SatisfyQuestNextChain(Quest const* qInfo, bool msg) +bool Player::SatisfyQuestNextChain(Quest const* qInfo, bool msg) const { uint32 nextQuest = qInfo->GetNextQuestInChain(); if (!nextQuest) @@ -15426,7 +15493,8 @@ bool Player::SatisfyQuestNextChain(Quest const* qInfo, bool msg) if (msg) { SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - TC_LOG_DEBUG("misc", "SatisfyQuestNextChain: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player already did or started next quest in chain.", qInfo->GetQuestId()); + TC_LOG_DEBUG("misc", "Player::SatisfyQuestNextChain: Sent INVALIDREASON_DONT_HAVE_REQ (QuestID: %u) because player '%s' (%s) already did or started next quest in chain.", + qInfo->GetQuestId(), GetName().c_str(), GetGUID().ToString().c_str()); } return false; } @@ -15453,7 +15521,8 @@ bool Player::SatisfyQuestPrevChain(Quest const* qInfo, bool msg) if (msg) { SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - TC_LOG_DEBUG("misc", "SatisfyQuestNextChain: Sent INVALIDREASON_DONT_HAVE_REQ (questId: %u) because player already did or started next quest in chain.", qInfo->GetQuestId()); + TC_LOG_DEBUG("misc", "Player::SatisfyQuestNextChain: Sent INVALIDREASON_DONT_HAVE_REQ (QuestID: %u) because player '%s' (%s) already did or started next quest in chain.", + qInfo->GetQuestId(), GetName().c_str(), GetGUID().ToString().c_str()); } return false; } @@ -15468,7 +15537,7 @@ bool Player::SatisfyQuestPrevChain(Quest const* qInfo, bool msg) return true; } -bool Player::SatisfyQuestDay(Quest const* qInfo, bool msg) +bool Player::SatisfyQuestDay(Quest const* qInfo, bool msg) const { if (!qInfo->IsDaily() && !qInfo->IsDFQuest()) return true; @@ -15556,8 +15625,8 @@ bool Player::GiveQuestSourceItem(Quest const* quest) // player already have max amount required item, just report success else if (msg == EQUIP_ERR_CANT_CARRY_MORE_OF_THIS) return true; - else - SendEquipError(msg, NULL, NULL, srcitem); + + SendEquipError(msg, nullptr, nullptr, srcitem); return false; } @@ -15586,7 +15655,7 @@ bool Player::TakeQuestSourceItem(uint32 questId, bool msg) if (res != EQUIP_ERR_OK) { if (msg) - SendEquipError(res, NULL, NULL, srcItemId); + SendEquipError(res, nullptr, nullptr, srcItemId); return false; } @@ -15832,15 +15901,17 @@ QuestGiverStatus Player::GetQuestDialogStatus(Object* questgiver) } // not used in Trinity, but used in scripting code -uint16 Player::GetReqKillOrCastCurrentCount(uint32 quest_id, int32 entry) +uint16 Player::GetReqKillOrCastCurrentCount(uint32 quest_id, int32 entry) const { Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest_id); if (!qInfo) return 0; - for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j) - if (qInfo->RequiredNpcOrGo[j] == entry) - return m_QuestStatus[quest_id].CreatureOrGOCount[j]; + auto itr = m_QuestStatus.find(quest_id); + if (itr != m_QuestStatus.end()) + for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j) + if (qInfo->RequiredNpcOrGo[j] == entry) + return itr->second.CreatureOrGOCount[j]; return 0; } @@ -15963,7 +16034,7 @@ void Player::GroupEventHappens(uint32 questId, WorldObject const* pEventObject) { if (Group* group = GetGroup()) { - for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) + for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) { Player* player = itr->GetSource(); @@ -16073,7 +16144,7 @@ void Player::KilledMonsterCredit(uint32 entry, ObjectGuid guid /*= ObjectGuid::E { uint16 addkillcount = 1; uint32 real_entry = entry; - Creature* killed = NULL; + Creature* killed = nullptr; if (guid) { killed = GetMap()->GetCreature(guid); @@ -16426,21 +16497,19 @@ bool Player::HasQuestForItem(uint32 itemid) const return false; } -void Player::SendQuestComplete(uint32 quest_id) +void Player::SendQuestComplete(uint32 quest_id) const { if (quest_id) { WorldPacket data(SMSG_QUESTUPDATE_COMPLETE, 4); data << uint32(quest_id); GetSession()->SendPacket(&data); - TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_COMPLETE quest = %u", quest_id); } } -void Player::SendQuestReward(Quest const* quest, uint32 XP) +void Player::SendQuestReward(Quest const* quest, uint32 XP) const { uint32 questid = quest->GetQuestId(); - TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_QUEST_COMPLETE quest = %u", questid); sGameEventMgr->HandleQuestComplete(questid); WorldPacket data(SMSG_QUESTGIVER_QUEST_COMPLETE, (4+4+4+4+4)); data << uint32(questid); @@ -16462,7 +16531,7 @@ void Player::SendQuestReward(Quest const* quest, uint32 XP) GetSession()->SendPacket(&data); } -void Player::SendQuestFailed(uint32 questId, InventoryResult reason) +void Player::SendQuestFailed(uint32 questId, InventoryResult reason) const { if (questId) { @@ -16470,11 +16539,10 @@ void Player::SendQuestFailed(uint32 questId, InventoryResult reason) data << uint32(questId); data << uint32(reason); // failed reason (valid reasons: 4, 16, 50, 17, 74, other values show default message) GetSession()->SendPacket(&data); - TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_QUEST_FAILED"); } } -void Player::SendQuestTimerFailed(uint32 quest_id) +void Player::SendQuestTimerFailed(uint32 quest_id) const { if (quest_id) { @@ -16493,7 +16561,7 @@ void Player::SendCanTakeQuestResponse(QuestFailedReason msg) const TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_QUEST_INVALID"); } -void Player::SendQuestConfirmAccept(const Quest* quest, Player* pReceiver) +void Player::SendQuestConfirmAccept(const Quest* quest, Player* pReceiver) const { if (pReceiver) { @@ -16514,7 +16582,7 @@ void Player::SendQuestConfirmAccept(const Quest* quest, Player* pReceiver) } } -void Player::SendPushToPartyResponse(Player* player, uint8 msg) +void Player::SendPushToPartyResponse(Player* player, uint8 msg) const { if (player) { @@ -16526,7 +16594,7 @@ void Player::SendPushToPartyResponse(Player* player, uint8 msg) } } -void Player::SendQuestUpdateAddItem(Quest const* /*quest*/, uint32 /*item_idx*/, uint16 /*count*/) +void Player::SendQuestUpdateAddItem(Quest const* /*quest*/, uint32 /*item_idx*/, uint16 /*count*/) const { WorldPacket data(SMSG_QUESTUPDATE_ADD_ITEM, 0); TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_ADD_ITEM"); @@ -16563,7 +16631,6 @@ void Player::SendQuestUpdateAddPlayer(Quest const* quest, uint16 old_count, uint ASSERT(old_count + add_count < 65536 && "player count store in 16 bits"); WorldPacket data(SMSG_QUESTUPDATE_ADD_PVP_KILL, (3*4)); - TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_ADD_PVP_KILL"); data << uint32(quest->GetQuestId()); data << uint32(old_count + add_count); data << uint32(quest->GetPlayersSlain()); @@ -16771,22 +16838,22 @@ bool Player::IsLoading() const bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) { - //// 0 1 2 3 4 5 6 7 8 9 10 11 - //QueryResult* result = CharacterDatabase.PQuery("SELECT guid, account, name, race, class, gender, level, xp, money, playerBytes, playerBytes2, playerFlags, " - // 12 13 14 15 16 17 18 19 20 21 22 23 24 + // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 + //QueryResult* result = CharacterDatabase.PQuery("SELECT guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, bankSlots, restState, playerFlags, " + // 17 18 19 20 21 22 23 24 25 26 27 28 29 //"position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, " - // 25 26 27 28 29 30 31 32 33 34 35 36 37 38 + // 30 31 32 33 34 35 36 37 38 39 40 41 42 43 //"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 + // 44 45 46 47 48 49 50 51 52 53 54 //"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 + // 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 //"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) { std::string name = "<unknown>"; sObjectMgr->GetPlayerNameByGUID(guid, name); - TC_LOG_ERROR("entities.player", "Player %s %s not found in table `characters`, can't load. ", name.c_str(), guid.ToString().c_str()); + TC_LOG_ERROR("entities.player", "Player::LoadFromDB: Player '%s' (%s) not found in table `characters`, can't load. ", name.c_str(), guid.ToString().c_str()); return false; } @@ -16798,13 +16865,13 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) // player should be able to load/delete character only with correct account! if (dbAccountId != GetSession()->GetAccountId()) { - TC_LOG_ERROR("entities.player", "Player %s loading from wrong account (is: %u, should be: %u)", guid.ToString().c_str(), GetSession()->GetAccountId(), dbAccountId); + TC_LOG_ERROR("entities.player", "Player::LoadFromDB: Player (%s) loading from wrong account (is: %u, should be: %u)", guid.ToString().c_str(), GetSession()->GetAccountId(), dbAccountId); return false; } if (holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_BANNED)) { - TC_LOG_ERROR("entities.player", "%s is banned, can't load.", guid.ToString().c_str()); + TC_LOG_ERROR("entities.player", "Player::LoadFromDB: Player (%s) is banned, can't load.", guid.ToString().c_str()); return false; } @@ -16814,8 +16881,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) // check name limitations if (ObjectMgr::CheckPlayerName(m_name, GetSession()->GetSessionDbcLocale()) != CHAR_NAME_SUCCESS || - (!GetSession()->HasPermission(rbac::RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_RESERVEDNAME) && - sObjectMgr->IsReservedName(m_name))) + (!GetSession()->HasPermission(rbac::RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_RESERVEDNAME) && sObjectMgr->IsReservedName(m_name))) { PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ADD_AT_LOGIN_FLAG); stmt->setUInt16(0, uint16(AT_LOGIN_RENAME)); @@ -16830,7 +16896,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) uint8 gender = fields[5].GetUInt8(); if (!IsValidGender(gender)) { - TC_LOG_ERROR("entities.player", "Player %s has wrong gender (%u), can't be loaded.", guid.ToString().c_str(), gender); + TC_LOG_ERROR("entities.player", "Player::LoadFromDB: Player (%s) has wrong gender (%u), can't load.", guid.ToString().c_str(), gender); return false; } @@ -16845,15 +16911,15 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(), getClass()); if (!info) { - TC_LOG_ERROR("entities.player", "Player %s has wrong race/class (%u/%u), can't be loaded.", guid.ToString().c_str(), getRace(), getClass()); + TC_LOG_ERROR("entities.player", "Player::LoadFromDB: Player (%s) has wrong race/class (%u/%u), can't load.", guid.ToString().c_str(), getRace(), getClass()); return false; } SetUInt32Value(UNIT_FIELD_LEVEL, fields[6].GetUInt8()); SetUInt32Value(PLAYER_XP, fields[7].GetUInt32()); - _LoadIntoDataField(fields[61].GetCString(), PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE); - _LoadIntoDataField(fields[64].GetCString(), PLAYER__FIELD_KNOWN_TITLES, KNOWN_TITLES_SIZE*2); + _LoadIntoDataField(fields[66].GetString(), PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE); + _LoadIntoDataField(fields[69].GetString(), PLAYER__FIELD_KNOWN_TITLES, KNOWN_TITLES_SIZE * 2); SetObjectScale(1.0f); SetFloatValue(UNIT_FIELD_HOVERHEIGHT, 1.0f); @@ -16866,47 +16932,53 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) money = MAX_MONEY_AMOUNT; SetMoney(money); - SetUInt32Value(PLAYER_BYTES, fields[9].GetUInt32()); - SetUInt32Value(PLAYER_BYTES_2, fields[10].GetUInt32()); + SetByteValue(PLAYER_BYTES, 0, fields[9].GetUInt8()); + SetByteValue(PLAYER_BYTES, 1, fields[10].GetUInt8()); + SetByteValue(PLAYER_BYTES, 2, fields[11].GetUInt8()); + SetByteValue(PLAYER_BYTES, 3, fields[12].GetUInt8()); + SetByteValue(PLAYER_BYTES_2, 0, fields[13].GetUInt8()); + SetByteValue(PLAYER_BYTES_2, 2, fields[14].GetUInt8()); + SetByteValue(PLAYER_BYTES_2, 3, fields[15].GetUInt8()); SetByteValue(PLAYER_BYTES_3, 0, fields[5].GetUInt8()); - SetByteValue(PLAYER_BYTES_3, 1, fields[49].GetUInt8()); + SetByteValue(PLAYER_BYTES_3, 1, fields[54].GetUInt8()); if (!ValidateAppearance( fields[3].GetUInt8(), // race fields[4].GetUInt8(), // class - gender, GetByteValue(PLAYER_BYTES, 2), // hair type - GetByteValue(PLAYER_BYTES, 3), //hair color - uint8(fields[9].GetUInt32() >> 8), // face - GetByteValue(PLAYER_BYTES_2, 0), // facial hair - GetByteValue(PLAYER_BYTES, 0))) // skin color - { - TC_LOG_ERROR("entities.player", "Player %s has wrong Appearance values (Hair/Skin/Color), can't be loaded.", guid.ToString().c_str()); + gender, + GetByteValue(PLAYER_BYTES, 2), + GetByteValue(PLAYER_BYTES, 3), + GetByteValue(PLAYER_BYTES, 1), + GetByteValue(PLAYER_BYTES_2, 0), + GetByteValue(PLAYER_BYTES, 0))) + { + TC_LOG_ERROR("entities.player", "Player::LoadFromDB: Player (%s) has wrong Appearance values (Hair/Skin/Color), can't load.", guid.ToString().c_str()); return false; } - SetUInt32Value(PLAYER_FLAGS, fields[11].GetUInt32()); - SetInt32Value(PLAYER_FIELD_WATCHED_FACTION_INDEX, fields[48].GetUInt32()); + SetUInt32Value(PLAYER_FLAGS, fields[16].GetUInt32()); + SetInt32Value(PLAYER_FIELD_WATCHED_FACTION_INDEX, fields[53].GetUInt32()); - SetUInt64Value(PLAYER_FIELD_KNOWN_CURRENCIES, fields[47].GetUInt64()); + SetUInt64Value(PLAYER_FIELD_KNOWN_CURRENCIES, fields[52].GetUInt64()); - SetUInt32Value(PLAYER_AMMO_ID, fields[63].GetUInt32()); + SetUInt32Value(PLAYER_AMMO_ID, fields[68].GetUInt32()); // set which actionbars the client has active - DO NOT REMOVE EVER AGAIN (can be changed though, if it does change fieldwise) - SetByteValue(PLAYER_FIELD_BYTES, 2, fields[65].GetUInt8()); + SetByteValue(PLAYER_FIELD_BYTES, 2, fields[70].GetUInt8()); InitDisplayIds(); - // cleanup inventory related item value fields (its will be filled correctly in _LoadInventory) + // cleanup inventory related item value fields (it will be filled correctly in _LoadInventory) for (uint8 slot = EQUIPMENT_SLOT_START; slot < EQUIPMENT_SLOT_END; ++slot) { SetGuidValue(PLAYER_FIELD_INV_SLOT_HEAD + (slot * 2), ObjectGuid::Empty); - SetVisibleItemSlot(slot, NULL); + SetVisibleItemSlot(slot, nullptr); delete m_items[slot]; - m_items[slot] = NULL; + m_items[slot] = nullptr; } - TC_LOG_DEBUG("entities.player.loading", "Load Basic value of player %s is: ", m_name.c_str()); + TC_LOG_DEBUG("entities.player.loading", "Player::LoadFromDB: Load Basic value of player '%s' is: ", m_name.c_str()); outDebugValues(); //Need to call it to initialize m_team (m_team can be calculated from race) @@ -16920,21 +16992,21 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) InitPrimaryProfessions(); // to max set before any spell loaded // init saved position, and fix it later if problematic - ObjectGuid::LowType transLowGUID = fields[30].GetUInt32(); - Relocate(fields[12].GetFloat(), fields[13].GetFloat(), fields[14].GetFloat(), fields[16].GetFloat()); - uint32 mapId = fields[15].GetUInt16(); - uint32 instanceId = fields[58].GetUInt32(); + ObjectGuid::LowType transLowGUID = fields[35].GetUInt32(); + Relocate(fields[17].GetFloat(), fields[18].GetFloat(), fields[19].GetFloat(), fields[21].GetFloat()); + uint32 mapId = fields[20].GetUInt16(); + uint32 instanceId = fields[63].GetUInt32(); - uint32 dungeonDiff = fields[38].GetUInt8() & 0x0F; + uint32 dungeonDiff = fields[43].GetUInt8() & 0x0F; if (dungeonDiff >= MAX_DUNGEON_DIFFICULTY) dungeonDiff = DUNGEON_DIFFICULTY_NORMAL; - uint32 raidDiff = (fields[38].GetUInt8() >> 4) & 0x0F; + uint32 raidDiff = (fields[43].GetUInt8() >> 4) & 0x0F; if (raidDiff >= MAX_RAID_DIFFICULTY) raidDiff = RAID_DIFFICULTY_10MAN_NORMAL; SetDungeonDifficulty(Difficulty(dungeonDiff)); // may be changed in _LoadGroup SetRaidDifficulty(Difficulty(raidDiff)); // may be changed in _LoadGroup - std::string taxi_nodes = fields[37].GetString(); + std::string taxi_nodes = fields[42].GetString(); #define RelocateToHomebind(){ mapId = m_homebindMapId; instanceId = 0; Relocate(m_homebindX, m_homebindY, m_homebindZ); } @@ -16942,7 +17014,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) _LoadArenaTeamInfo(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_ARENA_INFO)); - SetArenaPoints(fields[39].GetUInt32()); + SetArenaPoints(fields[44].GetUInt32()); // check arena teams integrity for (uint32 arena_slot = 0; arena_slot < MAX_ARENA_SLOT; ++arena_slot) @@ -16960,12 +17032,12 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) SetArenaTeamInfoField(arena_slot, ArenaTeamInfoType(j), 0); } - SetHonorPoints(fields[40].GetUInt32()); - SetUInt32Value(PLAYER_FIELD_TODAY_CONTRIBUTION, fields[41].GetUInt32()); - SetUInt32Value(PLAYER_FIELD_YESTERDAY_CONTRIBUTION, fields[42].GetUInt32()); - SetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, fields[43].GetUInt32()); - SetUInt16Value(PLAYER_FIELD_KILLS, 0, fields[44].GetUInt16()); - SetUInt16Value(PLAYER_FIELD_KILLS, 1, fields[45].GetUInt16()); + SetHonorPoints(fields[45].GetUInt32()); + SetUInt32Value(PLAYER_FIELD_TODAY_CONTRIBUTION, fields[46].GetUInt32()); + SetUInt32Value(PLAYER_FIELD_YESTERDAY_CONTRIBUTION, fields[47].GetUInt32()); + SetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, fields[48].GetUInt32()); + SetUInt16Value(PLAYER_FIELD_KILLS, 0, fields[49].GetUInt16()); + SetUInt16Value(PLAYER_FIELD_KILLS, 1, fields[50].GetUInt16()); _LoadBoundInstances(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_BOUND_INSTANCES)); _LoadInstanceTimeRestrictions(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_INSTANCE_LOCK_TIMES)); @@ -16975,14 +17047,14 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) MapEntry const* mapEntry = sMapStore.LookupEntry(mapId); if (!mapEntry || !IsPositionValid()) { - TC_LOG_ERROR("entities.player", "Player %s have invalid coordinates (MapId: %u X: %f Y: %f Z: %f O: %f). Teleport to default race/class locations.", + TC_LOG_ERROR("entities.player", "Player::LoadFromDB: Player (%s) has invalid coordinates (MapId: %u X: %f Y: %f Z: %f O: %f). Teleport to default race/class locations.", guid.ToString().c_str(), mapId, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation()); RelocateToHomebind(); } // Player was saved in Arena or Bg else if (mapEntry && mapEntry->IsBattlegroundOrArena()) { - Battleground* currentBg = NULL; + Battleground* currentBg = nullptr; if (m_bgData.bgInstanceID) //saved in Battleground currentBg = sBattlegroundMgr->GetBattleground(m_bgData.bgInstanceID, BATTLEGROUND_TYPE_NONE); @@ -17016,7 +17088,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) //if (mapId == MAPID_INVALID) -- code kept for reference if (int16(mapId) == int16(-1)) // Battleground Entry Point not found (???) { - TC_LOG_ERROR("entities.player", "Player %s was in BG in database, but BG was not found, and entry point was invalid! Teleport to default race/class locations.", + TC_LOG_ERROR("entities.player", "Player::LoadFromDB: Player (%s) was in BG in database, but BG was not found and entry point was invalid! Teleport to default race/class locations.", guid.ToString().c_str()); RelocateToHomebind(); } @@ -17032,13 +17104,13 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) { ObjectGuid transGUID(HighGuid::Mo_Transport, transLowGUID); - Transport* transport = NULL; + Transport* transport = nullptr; if (Transport* go = HashMapHolder<Transport>::Find(transGUID)) transport = go; if (transport) { - float x = fields[26].GetFloat(), y = fields[27].GetFloat(), z = fields[28].GetFloat(), o = fields[29].GetFloat(); + float x = fields[31].GetFloat(), y = fields[32].GetFloat(), z = fields[33].GetFloat(), o = fields[34].GetFloat(); m_movementInfo.transport.pos.Relocate(x, y, z, o); transport->CalculatePassengerPosition(x, y, z, &o); @@ -17048,7 +17120,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) std::fabs(m_movementInfo.transport.pos.GetPositionY()) > 250.0f || std::fabs(m_movementInfo.transport.pos.GetPositionZ()) > 250.0f) { - TC_LOG_ERROR("entities.player", "Player %s have invalid transport coordinates (X: %f Y: %f Z: %f O: %f). Teleport to bind location.", + TC_LOG_ERROR("entities.player", "Player::LoadFromDB: Player (%s) has invalid transport coordinates (X: %f Y: %f Z: %f O: %f). Teleport to bind location.", guid.ToString().c_str(), x, y, z, o); m_movementInfo.transport.Reset(); @@ -17065,7 +17137,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) } else { - TC_LOG_ERROR("entities.player", "Player %s have problems with transport guid (%u). Teleport to bind location.", + TC_LOG_ERROR("entities.player", "Player::LoadFromDB: Player (%s) has problems with transport guid (%u). Teleport to bind location.", guid.ToString().c_str(), transLowGUID); RelocateToHomebind(); @@ -17085,18 +17157,18 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) else if (!m_taxi.LoadTaxiDestinationsFromString(taxi_nodes, GetTeam())) { // problems with taxi path loading - TaxiNodesEntry const* nodeEntry = NULL; + TaxiNodesEntry const* nodeEntry = nullptr; if (uint32 node_id = m_taxi.GetTaxiSource()) nodeEntry = sTaxiNodesStore.LookupEntry(node_id); - if (!nodeEntry) // don't know taxi start node, to homebind + if (!nodeEntry) // don't know taxi start node, teleport to homebind { - TC_LOG_ERROR("entities.player", "Character %u have wrong data in taxi destination list, teleport to homebind.", GetGUID().GetCounter()); + TC_LOG_ERROR("entities.player", "Player::LoadFromDB: Player (%s) has wrong data in taxi destination list, teleport to homebind.", GetGUID().ToString().c_str()); RelocateToHomebind(); } - else // have start node, to it + else // has start node, teleport to it { - TC_LOG_ERROR("entities.player", "Character %u have too short taxi destination list, teleport to original node.", GetGUID().GetCounter()); + TC_LOG_ERROR("entities.player", "Player::LoadFromDB: Player (%s) has too short taxi destination list, teleport to original node.", GetGUID().ToString().c_str()); mapId = nodeEntry->map_id; Relocate(nodeEntry->x, nodeEntry->y, nodeEntry->z, 0.0f); } @@ -17125,7 +17197,8 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) { if (GetSession()->Expansion() < mapEntry->Expansion()) { - TC_LOG_DEBUG("entities.player.loading", "Player %s using client without required expansion tried login at non accessible map %u", GetName().c_str(), mapId); + TC_LOG_DEBUG("entities.player.loading", "Player::LoadFromDB: Player '%s' (%s) using client without required expansion tried login at non accessible map %u", + GetName().c_str(), GetGUID().ToString().c_str(), mapId); RelocateToHomebind(); } @@ -17139,7 +17212,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) // NOW player must have valid map // load the player's map here if it's not already loaded Map* map = sMapMgr->CreateMap(mapId, this, instanceId); - AreaTrigger const* areaTrigger = NULL; + AreaTrigger const* areaTrigger = nullptr; bool check = false; if (!map) @@ -17194,10 +17267,10 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) } else { - TC_LOG_ERROR("entities.player", "Player %s %s Map: %u, X: %f, Y: %f, Z: %f, O: %f. Areatrigger not found.", + TC_LOG_ERROR("entities.player", "Player::LoadFromDB: Player '%s' (%s) Map: %u, X: %f, Y: %f, Z: %f, O: %f. Areatrigger not found.", m_name.c_str(), guid.ToString().c_str(), mapId, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation()); RelocateToHomebind(); - map = NULL; + map = nullptr; } } @@ -17208,7 +17281,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) map = sMapMgr->CreateMap(mapId, this); if (!map) { - TC_LOG_ERROR("entities.player", "Player %s %s Map: %u, X: %f, Y: %f, Z: %f, O: %f. Invalid default map coordinates or instance couldn't be created.", + TC_LOG_ERROR("entities.player", "Player::LoadFromDB: Player '%s' (%s) Map: %u, X: %f, Y: %f, Z: %f, O: %f. Invalid default map coordinates or instance couldn't be created.", m_name.c_str(), guid.ToString().c_str(), mapId, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation()); return false; } @@ -17223,12 +17296,12 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) // randomize first save time in range [CONFIG_INTERVAL_SAVE] around [CONFIG_INTERVAL_SAVE] // this must help in case next save after mass player load after server startup - m_nextSave = urand(m_nextSave/2, m_nextSave*3/2); + m_nextSave = urand(m_nextSave / 2, m_nextSave * 3 / 2); SaveRecallPosition(); - time_t now = time(NULL); - time_t logoutTime = time_t(fields[22].GetUInt32()); + time_t now = time(nullptr); + time_t logoutTime = time_t(fields[27].GetUInt32()); // since last logout (in seconds) uint32 time_diff = uint32(now - logoutTime); //uint64 is excessive for a time_diff in seconds.. uint32 allows for 136~ year difference. @@ -17241,29 +17314,30 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) SetDrunkValue(newDrunkValue); - m_cinematic = fields[18].GetUInt8(); - m_Played_time[PLAYED_TIME_TOTAL]= fields[19].GetUInt32(); - m_Played_time[PLAYED_TIME_LEVEL]= fields[20].GetUInt32(); + m_cinematic = fields[23].GetUInt8(); + m_Played_time[PLAYED_TIME_TOTAL] = fields[24].GetUInt32(); + m_Played_time[PLAYED_TIME_LEVEL] = fields[25].GetUInt32(); - m_resetTalentsCost = fields[24].GetUInt32(); - m_resetTalentsTime = time_t(fields[25].GetUInt32()); + m_resetTalentsCost = fields[29].GetUInt32(); + m_resetTalentsTime = time_t(fields[30].GetUInt32()); - m_taxi.LoadTaxiMask(fields[17].GetString()); // must be before InitTaxiNodesForLevel + m_taxi.LoadTaxiMask(fields[22].GetString()); // must be before InitTaxiNodesForLevel - uint32 extraflags = fields[31].GetUInt16(); + uint32 extraflags = fields[36].GetUInt16(); - m_stableSlots = fields[32].GetUInt8(); + m_stableSlots = fields[37].GetUInt8(); if (m_stableSlots > MAX_PET_STABLES) { - TC_LOG_ERROR("entities.player", "Player can have not more %u stable slots, but have in DB %u", MAX_PET_STABLES, uint32(m_stableSlots)); + TC_LOG_ERROR("entities.player", "Player::LoadFromDB: Player (%s) can't have more stable slots than %u, but has %u in DB", + GetGUID().ToString().c_str(), MAX_PET_STABLES, uint32(m_stableSlots)); m_stableSlots = MAX_PET_STABLES; } - m_atLoginFlags = fields[33].GetUInt16(); + m_atLoginFlags = fields[38].GetUInt16(); if (HasAtLoginFlag(AT_LOGIN_RENAME)) { - TC_LOG_ERROR("entities.player", "Player (GUID: %u) tried to login while forced to rename, can't load.'", GetGUID().GetCounter()); + TC_LOG_ERROR("entities.player", "Player::LoadFromDB: Player (%s) tried to login while forced to rename, can't load.'", GetGUID().ToString().c_str()); return false; } @@ -17272,7 +17346,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) m_lastHonorUpdateTime = logoutTime; UpdateHonorFields(); - m_deathExpireTime = time_t(fields[36].GetUInt32()); + m_deathExpireTime = time_t(fields[41].GetUInt32()); if (m_deathExpireTime > now + MAX_DEATH_COUNT * DEATH_EXPIRE_STEP) m_deathExpireTime = now + MAX_DEATH_COUNT * DEATH_EXPIRE_STEP - 1; @@ -17309,7 +17383,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) InitRunes(); // rest bonus can only be calculated after InitStatsForLevel() - m_rest_bonus = fields[21].GetFloat(); + m_rest_bonus = fields[26].GetFloat(); if (time_diff > 0) { @@ -17317,11 +17391,11 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) float bubble0 = 0.031f; //speed collect rest bonus in offline, in logout, in tavern, city (section/in hour) float bubble1 = 0.125f; - float bubble = fields[23].GetUInt8() > 0 + float bubble = fields[28].GetUInt8() > 0 ? bubble1*sWorld->getRate(RATE_REST_OFFLINE_IN_TAVERN_OR_CITY) : bubble0*sWorld->getRate(RATE_REST_OFFLINE_IN_WILDERNESS); - SetRestBonus(GetRestBonus()+ time_diff*((float)GetUInt32Value(PLAYER_NEXT_LEVEL_XP)/72000)*bubble); + SetRestBonus(GetRestBonus() + time_diff*((float)GetUInt32Value(PLAYER_NEXT_LEVEL_XP) / 72000)*bubble); } // load skills after InitStatsForLevel because it triggering aura apply also @@ -17333,14 +17407,15 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) //mails are loaded only when needed ;-) - when player in game click on mailbox. //_LoadMail(); - m_specsCount = fields[59].GetUInt8(); - m_activeSpec = fields[60].GetUInt8(); + m_specsCount = fields[64].GetUInt8(); + m_activeSpec = fields[65].GetUInt8(); // sanity check if (m_specsCount > MAX_TALENT_SPECS || m_activeSpec > MAX_TALENT_SPEC || m_specsCount < MIN_TALENT_SPECS) { + TC_LOG_ERROR("entities.player", "Player::LoadFromDB: Player %s (%s) has invalid SpecCount = %u and/or invalid ActiveSpec = %u.", + GetName().c_str(), GetGUID().ToString().c_str(), uint32(m_specsCount), uint32(m_activeSpec)); m_activeSpec = 0; - TC_LOG_ERROR("entities.player", "Player %s(GUID: %u) has SpecCount = %u and ActiveSpec = %u.", GetName().c_str(), GetGUID().GetCounter(), m_specsCount, m_activeSpec); } _LoadTalents(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_TALENTS)); @@ -17384,7 +17459,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) // check PLAYER_CHOSEN_TITLE compatibility with PLAYER__FIELD_KNOWN_TITLES // note: PLAYER__FIELD_KNOWN_TITLES updated at quest status loaded - uint32 curTitle = fields[46].GetUInt32(); + uint32 curTitle = fields[51].GetUInt32(); if (curTitle && !HasTitle(curTitle)) curTitle = 0; @@ -17407,15 +17482,15 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) UpdateAllStats(); // restore remembered power/health values (but not more max values) - uint32 savedHealth = fields[50].GetUInt32(); + uint32 savedHealth = fields[55].GetUInt32(); SetHealth(savedHealth > GetMaxHealth() ? GetMaxHealth() : savedHealth); for (uint8 i = 0; i < MAX_POWERS; ++i) { - uint32 savedPower = fields[51+i].GetUInt32(); + uint32 savedPower = fields[56 + i].GetUInt32(); SetPower(Powers(i), savedPower > GetMaxPower(Powers(i)) ? GetMaxPower(Powers(i)) : savedPower); } - TC_LOG_DEBUG("entities.player.loading", "The value of player %s after load item and aura is: ", m_name.c_str()); + TC_LOG_DEBUG("entities.player.loading", "Player::LoadFromDB: The value of player '%s' after load item and aura is: ", m_name.c_str()); outDebugValues(); // GM state @@ -17467,7 +17542,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) } // RaF stuff. - m_grantableLevels = fields[66].GetUInt8(); + m_grantableLevels = fields[71].GetUInt8(); if (GetSession()->IsARecruiter() || (GetSession()->GetRecruiterId() != 0)) SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_REFER_A_FRIEND); @@ -17550,9 +17625,10 @@ void Player::_LoadActions(PreparedQueryResult result) ab->uState = ACTIONBUTTON_UNCHANGED; else { - TC_LOG_ERROR("entities.player", " ...at loading, and will deleted in DB also"); + TC_LOG_ERROR("entities.player", "Player::_LoadActions: Player '%s' (%s) has an invalid action button (Button: %u, Action: %u, Type: %u). It will be deleted at next save.", + GetName().c_str(), GetGUID().ToString().c_str(), button, action, type); - // Will deleted in DB at next save (it can create data until save but marked as deleted) + // Will be deleted in DB at next save (it can create data until save but marked as deleted). m_actionButtons[button].uState = ACTIONBUTTON_DELETED; } } while (result->NextRow()); @@ -17561,7 +17637,7 @@ void Player::_LoadActions(PreparedQueryResult result) void Player::_LoadAuras(PreparedQueryResult result, uint32 timediff) { - TC_LOG_DEBUG("entities.player.loading", "Loading auras for player %u", GetGUID().GetCounter()); + TC_LOG_DEBUG("entities.player.loading", "Player::_LoadAuras: Loading auras for %s", GetGUID().ToString().c_str()); /* 0 1 2 3 4 5 6 7 8 9 10 QueryResult* result = CharacterDatabase.PQuery("SELECT casterGuid, spell, effectMask, recalculateMask, stackCount, amount0, amount1, amount2, base_amount0, base_amount1, base_amount2, @@ -17594,7 +17670,8 @@ void Player::_LoadAuras(PreparedQueryResult result, uint32 timediff) SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellid); if (!spellInfo) { - TC_LOG_ERROR("entities.player", "Unknown aura (spellid %u), ignore.", spellid); + TC_LOG_ERROR("entities.player", "Player::_LoadAuras: Player '%s' (%s) has an invalid aura (SpellID: %u), ignoring.", + GetName().c_str(), GetGUID().ToString().c_str(), spellid); continue; } @@ -17618,7 +17695,7 @@ void Player::_LoadAuras(PreparedQueryResult result, uint32 timediff) else remaincharges = 0; - if (Aura* aura = Aura::TryCreate(spellInfo, effmask, this, NULL, &baseDamage[0], NULL, caster_guid)) + if (Aura* aura = Aura::TryCreate(spellInfo, effmask, this, nullptr, &baseDamage[0], nullptr, caster_guid)) { if (!aura->CanBeSaved()) { @@ -17628,7 +17705,8 @@ void Player::_LoadAuras(PreparedQueryResult result, uint32 timediff) aura->SetLoadedState(maxduration, remaintime, remaincharges, stackcount, recalculatemask, &damage[0]); aura->ApplyForTargets(); - TC_LOG_DEBUG("entities.player", "Added aura spellid %u, effectmask %u", spellInfo->Id, effmask); + TC_LOG_DEBUG("entities.player", "Player::_LoadAuras: Added aura (SpellID: %u, EffectMask: %u) to player '%s (%s)", + spellInfo->Id, effmask, GetName().c_str(), GetGUID().ToString().c_str()); } } while (result->NextRow()); @@ -17651,13 +17729,13 @@ void Player::_LoadGlyphAuras() continue; } else - TC_LOG_ERROR("entities.player", "Player %s has glyph with typeflags %u in slot with typeflags %u, removing.", m_name.c_str(), gp->TypeFlags, gs->TypeFlags); + TC_LOG_ERROR("entities.player", "Player::_LoadGlyphAuras: Player '%s' (%s) has glyph with typeflags %u in slot with typeflags %u, removing.", GetName().c_str(), GetGUID().ToString().c_str(), gp->TypeFlags, gs->TypeFlags); } else - TC_LOG_ERROR("entities.player", "Player %s has not existing glyph slot entry %u on index %u", m_name.c_str(), GetGlyphSlot(i), i); + TC_LOG_ERROR("entities.player", "Player::_LoadGlyphAuras: Player '%s' (%s) has not existing glyph slot entry %u on index %u", GetName().c_str(), GetGUID().ToString().c_str(), GetGlyphSlot(i), i); } else - TC_LOG_ERROR("entities.player", "Player %s has not existing glyph entry %u on index %u", m_name.c_str(), glyph, i); + TC_LOG_ERROR("entities.player", "Player::_LoadGlyphAuras: Player '%s' (%s) has not existing glyph entry %u on index %u", GetName().c_str(), GetGUID().ToString().c_str(), glyph, i); // On any error remove glyph SetGlyph(i, 0); @@ -17716,7 +17794,7 @@ void Player::_LoadInventory(PreparedQueryResult result, uint32 timeDiff) // Item is not in bag if (!bagGuid) { - item->SetContainer(NULL); + item->SetContainer(nullptr); item->SetSlot(slot); if (IsInventoryPos(INVENTORY_SLOT_BAG_0, slot)) @@ -17773,8 +17851,8 @@ void Player::_LoadInventory(PreparedQueryResult result, uint32 timeDiff) } else { - TC_LOG_ERROR("entities.player", "Player::_LoadInventory: player (GUID: %u, name: '%s') has item (GUID: %u, entry: %u) which doesnt have a valid bag (Bag GUID: %u, slot: %u). Possible cheat?", - GetGUID().GetCounter(), GetName().c_str(), item->GetGUID().GetCounter(), item->GetEntry(), bagGuid, slot); + TC_LOG_ERROR("entities.player", "Player::_LoadInventory: Player '%s' (%s) has item (%s, entry: %u) which doesnt have a valid bag (Bag %u, slot: %u). Possible cheat?", + GetName().c_str(), GetGUID().ToString().c_str(), item->GetGUID().ToString().c_str(), item->GetEntry(), bagGuid, slot); item->DeleteFromInventoryDB(trans); delete item; continue; @@ -17787,8 +17865,8 @@ void Player::_LoadInventory(PreparedQueryResult result, uint32 timeDiff) item->SetState(ITEM_UNCHANGED, this); else { - TC_LOG_ERROR("entities.player", "Player::_LoadInventory: player (GUID: %u, name: '%s') has item (GUID: %u, entry: %u) which can't be loaded into inventory (Bag GUID: %u, slot: %u) by reason %u. Item will be sent by mail.", - GetGUID().GetCounter(), GetName().c_str(), item->GetGUID().GetCounter(), item->GetEntry(), bagGuid, slot, err); + TC_LOG_ERROR("entities.player", "Player::_LoadInventory: Player '%s' (%s) has item (%s, entry: %u) which can't be loaded into inventory (Bag %u, slot: %u) by reason %u. Item will be sent by mail.", + GetName().c_str(), GetGUID().ToString().c_str(), item->GetGUID().ToString().c_str(), item->GetEntry(), bagGuid, slot, err); item->DeleteFromInventoryDB(trans); problematicItems.push_back(item); } @@ -17818,7 +17896,7 @@ void Player::_LoadInventory(PreparedQueryResult result, uint32 timeDiff) Item* Player::_LoadItem(SQLTransaction& trans, uint32 zoneId, uint32 timeDiff, Field* fields) { - Item* item = NULL; + Item* item = nullptr; ObjectGuid::LowType itemGuid = fields[13].GetUInt32(); uint32 itemEntry = fields[14].GetUInt32(); if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemEntry)) @@ -17827,7 +17905,7 @@ Item* Player::_LoadItem(SQLTransaction& trans, uint32 zoneId, uint32 timeDiff, F item = NewItemOrBag(proto); if (item->LoadFromDB(itemGuid, GetGUID(), fields, itemEntry)) { - PreparedStatement* stmt = NULL; + PreparedStatement* stmt; // Do not allow to have item limited to another map/zone in alive state if (IsAlive() && item->IsLimitedToAnotherMapOrZone(GetMapId(), zoneId)) @@ -17920,7 +17998,7 @@ Item* Player::_LoadItem(SQLTransaction& trans, uint32 zoneId, uint32 timeDiff, F } else { - TC_LOG_ERROR("entities.player", "Player::_LoadInventory: player (GUID: %u, name: '%s') has broken item (GUID: %u, entry: %u) in inventory. Deleting item.", + TC_LOG_ERROR("entities.player", "Player::_LoadInventory: player (GUID: %u, name: '%s') has a broken item (GUID: %u, entry: %u) in inventory. Deleting item.", GetGUID().GetCounter(), GetName().c_str(), itemGuid, itemEntry); remove = true; } @@ -17930,12 +18008,12 @@ Item* Player::_LoadItem(SQLTransaction& trans, uint32 zoneId, uint32 timeDiff, F Item::DeleteFromInventoryDB(trans, itemGuid); item->FSetState(ITEM_REMOVED); item->SaveToDB(trans); // it also deletes item object! - item = NULL; + item = nullptr; } } else { - TC_LOG_ERROR("entities.player", "Player::_LoadInventory: player (GUID: %u, name: '%s') has unknown item (entry: %u) in inventory. Deleting item.", + TC_LOG_ERROR("entities.player", "Player::_LoadInventory: player (GUID: %u, name: '%s') has an unknown item (entry: %u) in inventory. Deleting item.", GetGUID().GetCounter(), GetName().c_str(), itemEntry); Item::DeleteFromInventoryDB(trans, itemGuid); Item::DeleteFromDB(trans, itemGuid); @@ -17966,7 +18044,8 @@ void Player::_LoadMailedItems(Mail* mail) if (!proto) { - TC_LOG_ERROR("entities.player", "Player %u has unknown item_template (ProtoType) in mailed items(GUID: %u template: %u) in mail (%u), deleted.", GetGUID().GetCounter(), itemGuid, itemTemplate, mail->messageID); + TC_LOG_ERROR("entities.player", "Player '%s' (%s) has unknown item_template in mailed items (GUID: %u, Entry: %u) in mail (%u), deleted.", + GetName().c_str(), GetGUID().ToString().c_str(), itemGuid, itemTemplate, mail->messageID); stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_INVALID_MAIL_ITEM); stmt->setUInt32(0, itemGuid); @@ -17982,7 +18061,7 @@ void Player::_LoadMailedItems(Mail* mail) if (!item->LoadFromDB(itemGuid, ObjectGuid(HighGuid::Player, fields[13].GetUInt32()), fields, itemTemplate)) { - TC_LOG_ERROR("entities.player", "Player::_LoadMailedItems - Item in mail (%u) doesn't exist !!!! - item guid: %u, deleted from mail", mail->messageID, itemGuid); + TC_LOG_ERROR("entities.player", "Player::_LoadMailedItems: Item (GUID: %u) in mail (%u) doesn't exist, deleted from mail.", itemGuid, mail->messageID); stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM); stmt->setUInt32(0, itemGuid); @@ -17990,7 +18069,7 @@ void Player::_LoadMailedItems(Mail* mail) item->FSetState(ITEM_REMOVED); - SQLTransaction temp = SQLTransaction(NULL); + SQLTransaction temp = SQLTransaction(nullptr); item->SaveToDB(temp); // it also deletes item object ! continue; } @@ -18045,7 +18124,7 @@ void Player::_LoadMail() if (m->mailTemplateId && !sMailTemplateStore.LookupEntry(m->mailTemplateId)) { - TC_LOG_ERROR("entities.player", "Player::_LoadMail - Mail (%u) have not existed MailTemplateId (%u), remove at load", m->messageID, m->mailTemplateId); + TC_LOG_ERROR("entities.player", "Player::_LoadMail: Mail (%u) has nonexistent MailTemplateId (%u), remove at load", m->messageID, m->mailTemplateId); m->mailTemplateId = 0; } @@ -18102,8 +18181,8 @@ void Player::_LoadQuestStatus(PreparedQueryResult result) else { questStatusData.Status = QUEST_STATUS_INCOMPLETE; - TC_LOG_ERROR("entities.player", "Player %s (GUID: %u) has invalid quest %d status (%u), replaced by QUEST_STATUS_INCOMPLETE(3).", - GetName().c_str(), GetGUID().GetCounter(), quest_id, qstatus); + TC_LOG_ERROR("entities.player", "Player::_LoadQuestStatus: Player '%s' (%s) has invalid quest %d status (%u), replaced by QUEST_STATUS_INCOMPLETE(3).", + GetName().c_str(), GetGUID().ToString().c_str(), quest_id, qstatus); } questStatusData.Explored = (fields[2].GetUInt8() > 0); @@ -18152,7 +18231,8 @@ void Player::_LoadQuestStatus(PreparedQueryResult result) ++slot; } - TC_LOG_DEBUG("entities.player.loading", "Quest status is {%u} for quest {%u} for player (GUID: %u)", questStatusData.Status, quest_id, GetGUID().GetCounter()); + + TC_LOG_DEBUG("entities.player.loading", "Player::_LoadQuestStatus: Quest status is {%u} for quest {%u} for player (%s)", questStatusData.Status, quest_id, GetGUID().ToString().c_str()); } } while (result->NextRow()); @@ -18226,7 +18306,7 @@ void Player::_LoadDailyQuestStatus(PreparedQueryResult result) if (quest_daily_idx >= PLAYER_MAX_DAILY_QUESTS) // max amount with exist data in query { - TC_LOG_ERROR("entities.player", "Player (GUID: %u) have more 25 daily quest records in `charcter_queststatus_daily`", GetGUID().GetCounter()); + TC_LOG_ERROR("entities.player", "Player (GUID: %u) has more than 25 daily quest records in `charcter_queststatus_daily`", GetGUID().GetCounter()); break; } @@ -18242,7 +18322,8 @@ void Player::_LoadDailyQuestStatus(PreparedQueryResult result) SetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1+quest_daily_idx, quest_id); ++quest_daily_idx; - TC_LOG_DEBUG("entities.player.loading", "Daily quest (%u) cooldown for player (GUID: %u)", quest_id, GetGUID().GetCounter()); + TC_LOG_DEBUG("entities.player.loading", "Player::_LoadDailyQuestStatus: Loaded daily quest cooldown (QuestID: %u) for player '%s' (%s)", + quest_id, GetName().c_str(), GetGUID().ToString().c_str()); } while (result->NextRow()); } @@ -18265,7 +18346,9 @@ void Player::_LoadWeeklyQuestStatus(PreparedQueryResult result) continue; m_weeklyquests.insert(quest_id); - TC_LOG_DEBUG("entities.player.loading", "Weekly quest {%u} cooldown for player (GUID: %u)", quest_id, GetGUID().GetCounter()); + + TC_LOG_DEBUG("entities.player.loading", "Player::_LoadWeeklyQuestStatus: Loaded weekly quest cooldown (QuestID: %u) for player '%s' (%s)", + quest_id, GetName().c_str(), GetGUID().ToString().c_str()); } while (result->NextRow()); } @@ -18289,7 +18372,8 @@ void Player::_LoadSeasonalQuestStatus(PreparedQueryResult result) continue; m_seasonalquests[event_id].insert(quest_id); - TC_LOG_DEBUG("entities.player.loading", "Seasonal quest {%u} cooldown for player (GUID: %u)", quest_id, GetGUID().GetCounter()); + TC_LOG_DEBUG("entities.player.loading", "Player::_LoadSeasonalQuestStatus: Loaded seasonal quest cooldown (QuestID: %u) for player '%s' (%s)", + quest_id, GetName().c_str(), GetGUID().ToString().c_str()); } while (result->NextRow()); } @@ -18312,7 +18396,8 @@ void Player::_LoadMonthlyQuestStatus(PreparedQueryResult result) continue; m_monthlyquests.insert(quest_id); - TC_LOG_DEBUG("entities.player.loading", "Monthly quest {%u} cooldown for player (GUID: %u)", quest_id, GetGUID().GetCounter()); + TC_LOG_DEBUG("entities.player.loading", "Player::_LoadMonthlyQuestStatus: Loaded monthly quest cooldown (QuestID: %u) for player '%s' (%s)", + quest_id, GetName().c_str(), GetGUID().ToString().c_str()); } while (result->NextRow()); } @@ -18389,12 +18474,14 @@ void Player::_LoadBoundInstances(PreparedQueryResult result) if (!mapEntry || !mapEntry->IsDungeon()) { - TC_LOG_ERROR("entities.player", "_LoadBoundInstances: player %s(%d) has bind to not existed or not dungeon map %d (%s)", GetName().c_str(), GetGUID().GetCounter(), mapId, mapname.c_str()); + TC_LOG_ERROR("entities.player", "Player::_LoadBoundInstances: Player '%s' (%s) has bind to not existed or not dungeon map %d (%s)", + GetName().c_str(), GetGUID().ToString().c_str(), mapId, mapname.c_str()); deleteInstance = true; } else if (difficulty >= MAX_DIFFICULTY) { - TC_LOG_ERROR("entities.player", "_LoadBoundInstances: player %s(%d) has bind to not existed difficulty %d instance for map %u (%s)", GetName().c_str(), GetGUID().GetCounter(), difficulty, mapId, mapname.c_str()); + TC_LOG_ERROR("entities.player", "Player::_LoadBoundInstances: player '%s' (%s) has bind to not existed difficulty %d instance for map %u (%s)", + GetName().c_str(), GetGUID().ToString().c_str(), difficulty, mapId, mapname.c_str()); deleteInstance = true; } else @@ -18402,12 +18489,14 @@ void Player::_LoadBoundInstances(PreparedQueryResult result) MapDifficulty const* mapDiff = GetMapDifficultyData(mapId, Difficulty(difficulty)); if (!mapDiff) { - TC_LOG_ERROR("entities.player", "_LoadBoundInstances: player %s(%d) has bind to not existed difficulty %d instance for map %u (%s)", GetName().c_str(), GetGUID().GetCounter(), difficulty, mapId, mapname.c_str()); + TC_LOG_ERROR("entities.player", "Player::_LoadBoundInstances: player '%s' (%s) has bind to not existed difficulty %d instance for map %u (%s)", + GetName().c_str(), GetGUID().ToString().c_str(), difficulty, mapId, mapname.c_str()); deleteInstance = true; } else if (!perm && group) { - TC_LOG_ERROR("entities.player", "_LoadBoundInstances: player %s(%d) is in group %d but has a non-permanent character bind to map %d (%s), %d, %d", GetName().c_str(), GetGUID().GetCounter(), group->GetLowGUID(), mapId, mapname.c_str(), instanceId, difficulty); + TC_LOG_ERROR("entities.player", "Player::_LoadBoundInstances: player '%s' (%s) is in group %s but has a non-permanent character bind to map %d (%s), %d, %d", + GetName().c_str(), GetGUID().ToString().c_str(), group->GetGUID().ToString().c_str(), mapId, mapname.c_str(), instanceId, difficulty); deleteInstance = true; } } @@ -18437,7 +18526,7 @@ InstancePlayerBind* Player::GetBoundInstance(uint32 mapid, Difficulty difficulty // some instances only have one difficulty MapDifficulty const* mapDiff = GetDownscaledMapDifficultyData(mapid, difficulty); if (!mapDiff) - return NULL; + return nullptr; BoundInstancesMap::iterator itr = m_boundInstances[difficulty].find(mapid); if (itr != m_boundInstances[difficulty].end()) @@ -18543,12 +18632,13 @@ InstancePlayerBind* Player::BindToInstance(InstanceSave* save, bool permanent, B bind.perm = permanent; bind.extendState = extendState; if (!load) - TC_LOG_DEBUG("maps", "Player::BindToInstance: %s(%d) is now bound to map %d, instance %d, difficulty %d", GetName().c_str(), GetGUID().GetCounter(), save->GetMapId(), save->GetInstanceId(), save->GetDifficulty()); - sScriptMgr->OnPlayerBindToInstance(this, save->GetDifficulty(), save->GetMapId(), permanent, uint8(extendState)); + TC_LOG_DEBUG("maps", "Player::BindToInstance: Player '%s' (%s) is now bound to map (ID: %d, Instance: %d, Difficulty: %d)", + GetName().c_str(), GetGUID().ToString().c_str(), save->GetMapId(), save->GetInstanceId(), save->GetDifficulty()); + sScriptMgr->OnPlayerBindToInstance(this, save->GetDifficulty(), save->GetMapId(), permanent, extendState); return &bind; } - return NULL; + return nullptr; } void Player::BindToInstance() @@ -18582,7 +18672,7 @@ void Player::SendRaidInfo() size_t p_counter = data.wpos(); data << uint32(counter); // placeholder - time_t now = time(NULL); + time_t now = time(nullptr); for (uint8 i = 0; i < MAX_DIFFICULTY; ++i) { @@ -18805,7 +18895,8 @@ bool Player::_LoadHomeBind(PreparedQueryResult result) PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(), getClass()); if (!info) { - TC_LOG_ERROR("entities.player", "Player (Name %s) has incorrect race/class pair. Can't be loaded.", GetName().c_str()); + TC_LOG_ERROR("entities.player", "Player::_LoadHomeBind: Player '%s' (%s) has incorrect race/class (%u/%u) pair. Can't load.", + GetGUID().ToString().c_str(), GetName().c_str(), uint32(getRace()), uint32(getClass())); return false; } @@ -18853,8 +18944,8 @@ bool Player::_LoadHomeBind(PreparedQueryResult result) CharacterDatabase.Execute(stmt); } - TC_LOG_DEBUG("entities.player", "Setting player home position - mapid: %u, areaid: %u, X: %f, Y: %f, Z: %f", - m_homebindMapId, m_homebindAreaId, m_homebindX, m_homebindY, m_homebindZ); + TC_LOG_DEBUG("entities.player", "Player::_LoadHomeBind: Setting home position (MapID: %u, AreaID: %u, X: %f, Y: %f, Z: %f) of player '%s' (%s)", + m_homebindMapId, m_homebindAreaId, m_homebindX, m_homebindY, m_homebindZ, GetName().c_str(), GetGUID().ToString().c_str()); return true; } @@ -18878,13 +18969,13 @@ void Player::SaveToDB(bool create /*=false*/) // first save/honor gain after midnight will also update the player's honor fields UpdateHonorFields(); - TC_LOG_DEBUG("entities.unit", "The value of player %s at save: ", m_name.c_str()); + TC_LOG_DEBUG("entities.unit", "Player::SaveToDB: The value of player %s at save: ", m_name.c_str()); outDebugValues(); if (!create) sScriptMgr->OnPlayerSave(this); - PreparedStatement* stmt = NULL; + PreparedStatement* stmt; uint8 index = 0; if (create) @@ -18901,8 +18992,13 @@ void Player::SaveToDB(bool create /*=false*/) stmt->setUInt8(index++, getLevel()); stmt->setUInt32(index++, GetUInt32Value(PLAYER_XP)); stmt->setUInt32(index++, GetMoney()); - stmt->setUInt32(index++, GetUInt32Value(PLAYER_BYTES)); - stmt->setUInt32(index++, GetUInt32Value(PLAYER_BYTES_2)); + stmt->setUInt8(index++, GetByteValue(PLAYER_BYTES, 0)); + stmt->setUInt8(index++, GetByteValue(PLAYER_BYTES, 1)); + stmt->setUInt8(index++, GetByteValue(PLAYER_BYTES, 2)); + stmt->setUInt8(index++, GetByteValue(PLAYER_BYTES, 3)); + stmt->setUInt8(index++, GetByteValue(PLAYER_BYTES_2, 0)); + stmt->setUInt8(index++, GetByteValue(PLAYER_BYTES_2, 2)); + stmt->setUInt8(index++, GetByteValue(PLAYER_BYTES_2, 3)); stmt->setUInt32(index++, GetUInt32Value(PLAYER_FLAGS)); stmt->setUInt16(index++, (uint16)GetMapId()); stmt->setUInt32(index++, (uint32)GetInstanceId()); @@ -18927,7 +19023,7 @@ void Player::SaveToDB(bool create /*=false*/) stmt->setUInt32(index++, m_Played_time[PLAYED_TIME_TOTAL]); stmt->setUInt32(index++, m_Played_time[PLAYED_TIME_LEVEL]); stmt->setFloat(index++, finiteAlways(m_rest_bonus)); - stmt->setUInt32(index++, uint32(time(NULL))); + stmt->setUInt32(index++, uint32(time(nullptr))); stmt->setUInt8(index++, (HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING) ? 1 : 0)); //save, far from tavern/city //save, but in tavern/city @@ -18993,7 +19089,7 @@ void Player::SaveToDB(bool create /*=false*/) stmt->setString(index++, ss.str()); stmt->setUInt8(index++, GetByteValue(PLAYER_FIELD_BYTES, 2)); - stmt->setUInt32(index++, m_grantableLevels); + stmt->setUInt32(index, m_grantableLevels); } else { @@ -19006,8 +19102,13 @@ void Player::SaveToDB(bool create /*=false*/) stmt->setUInt8(index++, getLevel()); stmt->setUInt32(index++, GetUInt32Value(PLAYER_XP)); stmt->setUInt32(index++, GetMoney()); - stmt->setUInt32(index++, GetUInt32Value(PLAYER_BYTES)); - stmt->setUInt32(index++, GetUInt32Value(PLAYER_BYTES_2)); + stmt->setUInt8(index++, GetByteValue(PLAYER_BYTES, 0)); + stmt->setUInt8(index++, GetByteValue(PLAYER_BYTES, 1)); + stmt->setUInt8(index++, GetByteValue(PLAYER_BYTES, 2)); + stmt->setUInt8(index++, GetByteValue(PLAYER_BYTES, 3)); + stmt->setUInt8(index++, GetByteValue(PLAYER_BYTES_2, 0)); + stmt->setUInt8(index++, GetByteValue(PLAYER_BYTES_2, 2)); + stmt->setUInt8(index++, GetByteValue(PLAYER_BYTES_2, 3)); stmt->setUInt32(index++, GetUInt32Value(PLAYER_FLAGS)); if (!IsBeingTeleported()) @@ -19047,7 +19148,7 @@ void Player::SaveToDB(bool create /*=false*/) stmt->setUInt32(index++, m_Played_time[PLAYED_TIME_TOTAL]); stmt->setUInt32(index++, m_Played_time[PLAYED_TIME_LEVEL]); stmt->setFloat(index++, finiteAlways(m_rest_bonus)); - stmt->setUInt32(index++, uint32(time(NULL))); + stmt->setUInt32(index++, uint32(time(nullptr))); stmt->setUInt8(index++, (HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_RESTING) ? 1 : 0)); //save, far from tavern/city //save, but in tavern/city @@ -19166,7 +19267,7 @@ void Player::SaveInventoryAndGoldToDB(SQLTransaction& trans) SaveGoldToDB(trans); } -void Player::SaveGoldToDB(SQLTransaction& trans) +void Player::SaveGoldToDB(SQLTransaction& trans) const { PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_MONEY); stmt->setUInt32(0, GetMoney()); @@ -19176,7 +19277,7 @@ void Player::SaveGoldToDB(SQLTransaction& trans) void Player::_SaveActions(SQLTransaction& trans) { - PreparedStatement* stmt = NULL; + PreparedStatement* stmt; for (ActionButtonList::iterator itr = m_actionButtons.begin(); itr != m_actionButtons.end();) { @@ -19280,7 +19381,7 @@ void Player::_SaveAuras(SQLTransaction& trans) void Player::_SaveInventory(SQLTransaction& trans) { - PreparedStatement* stmt = NULL; + PreparedStatement* stmt; // force items in buyback slots to new state // and remove those that aren't already for (uint8 i = BUYBACK_SLOT_START; i < BUYBACK_SLOT_END; ++i) @@ -19318,7 +19419,8 @@ void Player::_SaveInventory(SQLTransaction& trans) } else { - TC_LOG_ERROR("entities.player", "Can't find %s but is in refundable storage for player %u ! Removing.", itr->ToString().c_str(), GetGUID().GetCounter()); + TC_LOG_ERROR("entities.player", "Player::_SaveInventory: Can't find item (%s) in refundable storage for player '%s' (%s), removing.", + itr->ToString().c_str(), GetName().c_str(), GetGUID().ToString().c_str()); m_refundableItems.erase(itr); } } @@ -19344,12 +19446,14 @@ void Player::_SaveInventory(SQLTransaction& trans) if (item->GetState() != ITEM_REMOVED) { Item* test = GetItemByPos(item->GetBagSlot(), item->GetSlot()); - if (test == NULL) + if (test == nullptr) { ObjectGuid::LowType bagTestGUID = 0; if (Item* test2 = GetItemByPos(INVENTORY_SLOT_BAG_0, item->GetBagSlot())) bagTestGUID = test2->GetGUID().GetCounter(); - TC_LOG_ERROR("entities.player", "Player(GUID: %u Name: %s)::_SaveInventory - the bag(%u) and slot(%u) values for the item with guid %u (state %d) are incorrect, the player doesn't have an item at that position!", lowGuid, GetName().c_str(), item->GetBagSlot(), item->GetSlot(), item->GetGUID().GetCounter(), (int32)item->GetState()); + + TC_LOG_ERROR("entities.player", "Player::_SaveInventory: Player '%s' (%s) has incorrect values (Bag: %u, Slot: %u) for the item (%s, State: %d). The player doesn't have an item at that position.", + GetName().c_str(), GetGUID().ToString().c_str(), item->GetBagSlot(), item->GetSlot(), item->GetGUID().ToString().c_str(), (int32)item->GetState()); // according to the test that was just performed nothing should be in this slot, delete stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INVENTORY_BY_BAG_SLOT); stmt->setUInt32(0, bagTestGUID); @@ -19365,9 +19469,10 @@ void Player::_SaveInventory(SQLTransaction& trans) } else if (test != item) { - TC_LOG_ERROR("entities.player", "Player(GUID: %u Name: %s)::_SaveInventory - the bag(%u) and slot(%u) values for the item with guid %u are incorrect, the item with guid %u is there instead!", lowGuid, GetName().c_str(), item->GetBagSlot(), item->GetSlot(), item->GetGUID().GetCounter(), test->GetGUID().GetCounter()); + TC_LOG_ERROR("entities.player", "Player::_SaveInventory: Player '%s' (%s) has incorrect values (Bag: %u, Slot: %u) for the item (%s). %s is there instead!", + GetName().c_str(), GetGUID().ToString().c_str(), item->GetBagSlot(), item->GetSlot(), item->GetGUID().ToString().c_str(), test->GetGUID().ToString().c_str()); // save all changes to the item... - if (item->GetState() != ITEM_NEW) // only for existing items, no dupes + if (item->GetState() != ITEM_NEW) // only for existing items, no duplicates item->SaveToDB(trans); // ...but do not save position in invntory continue; @@ -19404,7 +19509,7 @@ void Player::_SaveMail(SQLTransaction& trans) if (!m_mailsLoaded) return; - PreparedStatement* stmt = NULL; + PreparedStatement* stmt; for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr) { @@ -19480,7 +19585,7 @@ void Player::_SaveQuestStatus(SQLTransaction& trans) QuestStatusSaveMap::iterator saveItr; QuestStatusMap::iterator statusItr; - PreparedStatement* stmt = NULL; + PreparedStatement* stmt; bool keepAbandoned = !(sWorld->GetCleaningFlags() & CharacterDatabaseCleaner::CLEANING_FLAG_QUESTSTATUS); @@ -19662,7 +19767,7 @@ void Player::_SaveMonthlyQuestStatus(SQLTransaction& trans) void Player::_SaveSkills(SQLTransaction& trans) { - PreparedStatement* stmt = NULL; + PreparedStatement* stmt; // we don't need transactions here. for (SkillStatusMap::iterator itr = mSkillStatus.begin(); itr != mSkillStatus.end();) { @@ -19718,7 +19823,7 @@ void Player::_SaveSkills(SQLTransaction& trans) void Player::_SaveSpells(SQLTransaction& trans) { - PreparedStatement* stmt = NULL; + PreparedStatement* stmt; for (PlayerSpellMap::iterator itr = m_spells.begin(); itr != m_spells.end();) { @@ -19756,13 +19861,13 @@ void Player::_SaveSpells(SQLTransaction& trans) // save player stats -- only for external usage // real stats will be recalculated on player login -void Player::_SaveStats(SQLTransaction& trans) +void Player::_SaveStats(SQLTransaction& trans) const { // check if stat saving is enabled and if char level is high enough if (!sWorld->getIntConfig(CONFIG_MIN_LEVEL_STAT_SAVE) || getLevel() < sWorld->getIntConfig(CONFIG_MIN_LEVEL_STAT_SAVE)) return; - PreparedStatement* stmt = NULL; + PreparedStatement* stmt; stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_STATS); stmt->setUInt32(0, GetGUID().GetCounter()); @@ -19826,7 +19931,7 @@ void Player::UpdateSpeakTime() if (GetSession()->HasPermission(rbac::RBAC_PERM_SKIP_CHECK_CHAT_SPAM)) return; - time_t current = time (NULL); + time_t current = time(nullptr); if (m_speakTime > current) { uint32 max_count = sWorld->getIntConfig(CONFIG_CHATFLOOD_MESSAGE_COUNT); @@ -19852,14 +19957,14 @@ void Player::UpdateSpeakTime() bool Player::CanSpeak() const { - return GetSession()->m_muteTime <= time (NULL); + return GetSession()->m_muteTime <= time (nullptr); } /*********************************************************/ /*** LOW LEVEL FUNCTIONS:Notifiers ***/ /*********************************************************/ -void Player::SendAttackSwingNotInRange() +void Player::SendAttackSwingNotInRange() const { WorldPacket data(SMSG_ATTACKSWING_NOTINRANGE, 0); GetSession()->SendPacket(&data); @@ -19893,48 +19998,38 @@ void Player::SetUInt32ValueInArray(Tokenizer& tokens, uint16 index, uint32 value void Player::Customize(CharacterCustomizeInfo const* customizeInfo, SQLTransaction& trans) { - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_PLAYERBYTES2); - stmt->setUInt32(0, customizeInfo->Guid.GetCounter()); - PreparedQueryResult result = CharacterDatabase.Query(stmt); - - if (!result) - return; - - Field* fields = result->Fetch(); - - uint32 playerBytes2 = fields[0].GetUInt32(); - playerBytes2 &= ~0xFF; - playerBytes2 |= customizeInfo->FacialHair; - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GENDER_PLAYERBYTES); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GENDER_AND_APPEARANCE); stmt->setUInt8(0, customizeInfo->Gender); - stmt->setUInt32(1, customizeInfo->Skin | (customizeInfo->Face << 8) | (customizeInfo->HairStyle << 16) | (customizeInfo->HairColor << 24)); - stmt->setUInt32(2, playerBytes2); - stmt->setUInt32(3, customizeInfo->Guid.GetCounter()); + stmt->setUInt8(1, customizeInfo->Skin); + stmt->setUInt8(2, customizeInfo->Face); + stmt->setUInt8(3, customizeInfo->HairStyle); + stmt->setUInt8(4, customizeInfo->HairColor); + stmt->setUInt8(5, customizeInfo->FacialHair); + stmt->setUInt32(6, customizeInfo->Guid.GetCounter()); CharacterDatabase.ExecuteOrAppend(trans, stmt); } -void Player::SendAttackSwingDeadTarget() +void Player::SendAttackSwingDeadTarget() const { WorldPacket data(SMSG_ATTACKSWING_DEADTARGET, 0); GetSession()->SendPacket(&data); } -void Player::SendAttackSwingCantAttack() +void Player::SendAttackSwingCantAttack() const { WorldPacket data(SMSG_ATTACKSWING_CANT_ATTACK, 0); GetSession()->SendPacket(&data); } -void Player::SendAttackSwingCancelAttack() +void Player::SendAttackSwingCancelAttack() const { WorldPacket data(SMSG_CANCEL_COMBAT, 0); GetSession()->SendPacket(&data); } -void Player::SendAttackSwingBadFacingAttack() +void Player::SendAttackSwingBadFacingAttack() const { WorldPacket data(SMSG_ATTACKSWING_BADFACING, 0); GetSession()->SendPacket(&data); @@ -19947,7 +20042,7 @@ void Player::SendAutoRepeatCancel(Unit* target) SendMessageToSet(&data, false); } -void Player::SendExplorationExperience(uint32 Area, uint32 Experience) +void Player::SendExplorationExperience(uint32 Area, uint32 Experience) const { WorldPacket data(SMSG_EXPLORATION_EXPERIENCE, 8); data << uint32(Area); @@ -19955,7 +20050,7 @@ void Player::SendExplorationExperience(uint32 Area, uint32 Experience) GetSession()->SendPacket(&data); } -void Player::SendDungeonDifficulty(bool IsInGroup) +void Player::SendDungeonDifficulty(bool IsInGroup) const { uint8 val = 0x00000001; WorldPacket data(MSG_SET_DUNGEON_DIFFICULTY, 12); @@ -19965,7 +20060,7 @@ void Player::SendDungeonDifficulty(bool IsInGroup) GetSession()->SendPacket(&data); } -void Player::SendRaidDifficulty(bool IsInGroup, int32 forcedDifficulty) +void Player::SendRaidDifficulty(bool IsInGroup, int32 forcedDifficulty) const { uint8 val = 0x00000001; WorldPacket data(MSG_SET_RAID_DIFFICULTY, 12); @@ -19975,7 +20070,7 @@ void Player::SendRaidDifficulty(bool IsInGroup, int32 forcedDifficulty) GetSession()->SendPacket(&data); } -void Player::SendResetFailedNotify(uint32 mapid) +void Player::SendResetFailedNotify(uint32 mapid) const { WorldPacket data(SMSG_RESET_FAILED_NOTIFY, 4); data << uint32(mapid); @@ -20031,14 +20126,14 @@ void Player::ResetInstances(uint8 method, bool isRaid) } } -void Player::SendResetInstanceSuccess(uint32 MapId) +void Player::SendResetInstanceSuccess(uint32 MapId) const { WorldPacket data(SMSG_INSTANCE_RESET, 4); data << uint32(MapId); GetSession()->SendPacket(&data); } -void Player::SendResetInstanceFailed(uint32 reason, uint32 MapId) +void Player::SendResetInstanceFailed(uint32 reason, uint32 MapId) const { /*reasons for instance reset failure: // 0: There are players inside the instance. @@ -20116,22 +20211,22 @@ Pet* Player::GetPet() const if (ObjectGuid pet_guid = GetPetGUID()) { if (!pet_guid.IsPet()) - return NULL; + return nullptr; Pet* pet = ObjectAccessor::GetPet(*this, pet_guid); if (!pet) - return NULL; + return nullptr; if (IsInWorld() && pet) return pet; - //there may be a guardian in slot - //TC_LOG_ERROR("entities.player", "Player::GetPet: Pet %u not exist.", GUID_LOPART(pet_guid)); + // there may be a guardian in this slot + //TC_LOG_ERROR("entities.player", "Player::GetPet: Pet %u does not exist.", GUID_LOPART(pet_guid)); //const_cast<Player*>(this)->SetPetGUID(0); } - return NULL; + return nullptr; } void Player::RemovePet(Pet* pet, PetSaveMode mode, bool returnreagent) @@ -20141,7 +20236,8 @@ void Player::RemovePet(Pet* pet, PetSaveMode mode, bool returnreagent) if (pet) { - TC_LOG_DEBUG("entities.pet", "RemovePet %u, %u, %u", pet->GetEntry(), mode, returnreagent); + TC_LOG_DEBUG("entities.pet", "Player::RemovePet: Player '%s' (%s), Pet (Entry: %u, Mode: %u, ReturnReagent: %u)", + GetName().c_str(), GetGUID().ToString().c_str(), pet->GetEntry(), mode, returnreagent); if (pet->m_removed) return; @@ -20226,7 +20322,7 @@ void Player::StopCastingCharm() if (charm->GetTypeId() == TYPEID_UNIT) { if (charm->ToCreature()->HasUnitTypeMask(UNIT_MASK_PUPPET)) - ((Puppet*)charm)->UnSummon(); + static_cast<Puppet*>(charm)->UnSummon(); else if (charm->IsVehicle()) ExitVehicle(); } @@ -20235,14 +20331,14 @@ void Player::StopCastingCharm() if (GetCharmGUID()) { - TC_LOG_FATAL("entities.player", "Player %s (%s) is not able to uncharm unit (%s)", GetName().c_str(), GetGUID().ToString().c_str(), GetCharmGUID().ToString().c_str()); - if (charm->GetCharmerGUID()) + TC_LOG_FATAL("entities.player", "Player::StopCastingCharm: Player '%s' (%s) is not able to uncharm unit (%s)", GetName().c_str(), GetGUID().ToString().c_str(), GetCharmGUID().ToString().c_str()); + if (!charm->GetCharmerGUID().IsEmpty()) { - TC_LOG_FATAL("entities.player", "Charmed unit has charmer %s", charm->GetCharmerGUID().ToString().c_str()); + TC_LOG_FATAL("entities.player", "Player::StopCastingCharm: Charmed unit has charmer %s", charm->GetCharmerGUID().ToString().c_str()); ABORT(); } - else - SetCharm(charm, false); + + SetCharm(charm, false); } } @@ -20330,7 +20426,7 @@ bool Player::RemoveMItem(uint32 id) return mMitems.erase(id) ? true : false; } -void Player::SendOnCancelExpectedVehicleRideAura() +void Player::SendOnCancelExpectedVehicleRideAura() const { WorldPacket data(SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, 0); GetSession()->SendPacket(&data); @@ -20395,7 +20491,7 @@ void Player::PossessSpellInitialize() if (!charmInfo) { - TC_LOG_ERROR("entities.player", "Player::PossessSpellInitialize(): charm (%s) has no charminfo!", charm->GetGUID().ToString().c_str()); + TC_LOG_ERROR("entities.player", "Player::PossessSpellInitialize: charm (%s) has no charminfo!", charm->GetGUID().ToString().c_str()); return; } @@ -20442,7 +20538,8 @@ void Player::VehicleSpellInitialize() if (!sConditionMgr->IsObjectMeetingVehicleSpellConditions(vehicle->GetEntry(), spellId, this, vehicle)) { - TC_LOG_DEBUG("condition", "VehicleSpellInitialize: conditions not met for Vehicle entry %u spell %u", vehicle->ToCreature()->GetEntry(), spellId); + TC_LOG_DEBUG("condition", "Player::VehicleSpellInitialize: Player '%s' (%s) doesn't meet conditions for vehicle (Entry: %u, Spell: %u)", + GetName().c_str(), GetGUID().ToString().c_str(), vehicle->ToCreature()->GetEntry(), spellId); data << uint16(0) << uint8(0) << uint8(i+8); continue; } @@ -20472,7 +20569,8 @@ void Player::CharmSpellInitialize() CharmInfo* charmInfo = charm->GetCharmInfo(); if (!charmInfo) { - TC_LOG_ERROR("entities.player", "Player::CharmSpellInitialize(): the player's charm (%s) has no charminfo!", charm->GetGUID().ToString().c_str()); + TC_LOG_ERROR("entities.player", "Player::CharmSpellInitialize(): Player '%s' (%s) has a charm (%s) but no no charminfo!", + GetName().c_str(), GetGUID().ToString().c_str(), charm->GetGUID().ToString().c_str()); return; } @@ -20517,14 +20615,14 @@ void Player::CharmSpellInitialize() GetSession()->SendPacket(&data); } -void Player::SendRemoveControlBar() +void Player::SendRemoveControlBar() const { WorldPacket data(SMSG_PET_SPELLS, 8); data << uint64(0); GetSession()->SendPacket(&data); } -bool Player::IsAffectedBySpellmod(SpellInfo const* spellInfo, SpellModifier* mod, Spell* spell) +bool Player::IsAffectedBySpellmod(SpellInfo const* spellInfo, SpellModifier* mod, Spell* spell) const { if (!mod || !spellInfo) return false; @@ -20542,7 +20640,7 @@ bool Player::IsAffectedBySpellmod(SpellInfo const* spellInfo, SpellModifier* mod void Player::AddSpellMod(SpellModifier* mod, bool apply) { - TC_LOG_DEBUG("spells", "Player::AddSpellMod %d", mod->spellId); + TC_LOG_DEBUG("spells", "Player::AddSpellMod: Player '%s' (%s), SpellID: %d", GetName().c_str(), GetGUID().ToString().c_str(), mod->spellId); uint16 Opcode = (mod->type == SPELLMOD_FLAT) ? SMSG_SET_FLAT_SPELL_MODIFIER : SMSG_SET_PCT_SPELL_MODIFIER; int i = 0; @@ -20713,7 +20811,7 @@ void Player::SetSpellModTakingSpell(Spell* spell, bool apply) } // send Proficiency -void Player::SendProficiency(ItemClass itemClass, uint32 itemSubclassMask) +void Player::SendProficiency(ItemClass itemClass, uint32 itemSubclassMask) const { WorldPacket data(SMSG_SET_PROFICIENCY, 1 + 4); data << uint8(itemClass) << uint32(itemSubclassMask); @@ -20959,7 +21057,7 @@ bool Player::ActivateTaxiPathTo(std::vector<uint32> const& nodes, Creature* npc uint32 firstcost = 0; uint32 prevnode = sourcenode; - uint32 lastnode = 0; + uint32 lastnode; for (uint32 i = 1; i < nodes.size(); ++i) { @@ -20992,7 +21090,7 @@ bool Player::ActivateTaxiPathTo(std::vector<uint32> const& nodes, Creature* npc // only one mount ID for both sides. Probably not good to use 315 in case DBC nodes // change but I couldn't find a suitable alternative. OK to use class because only DK // can use this taxi. - uint32 mount_display_id = sObjectMgr->GetTaxiMountDisplayId(sourcenode, GetTeam(), npc == NULL || (sourcenode == 315 && getClass() == CLASS_DEATH_KNIGHT)); + uint32 mount_display_id = sObjectMgr->GetTaxiMountDisplayId(sourcenode, GetTeam(), npc == nullptr || (sourcenode == 315 && getClass() == CLASS_DEATH_KNIGHT)); // in spell case allow 0 model if ((mount_display_id == 0 && spellid == 0) || sourcepath == 0) @@ -21052,7 +21150,7 @@ bool Player::ActivateTaxiPathTo(uint32 taxi_path_id, uint32 spellid /*= 0*/) nodes[0] = entry->from; nodes[1] = entry->to; - return ActivateTaxiPathTo(nodes, NULL, spellid); + return ActivateTaxiPathTo(nodes, nullptr, spellid); } void Player::CleanupAfterTaxiFlight() @@ -21063,13 +21161,13 @@ void Player::CleanupAfterTaxiFlight() getHostileRefManager().setOnlineOfflineState(true); } -void Player::ContinueTaxiFlight() +void Player::ContinueTaxiFlight() const { uint32 sourceNode = m_taxi.GetTaxiSource(); if (!sourceNode) return; - TC_LOG_DEBUG("entities.unit", "WORLD: Restart character %u taxi flight", GetGUID().GetCounter()); + TC_LOG_DEBUG("entities.unit", "Player::ContinueTaxiFlight: Restart %s taxi flight", GetGUID().ToString().c_str()); uint32 mountDisplayId = sObjectMgr->GetTaxiMountDisplayId(sourceNode, GetTeam(), true); if (!mountDisplayId) @@ -21082,7 +21180,7 @@ void Player::ContinueTaxiFlight() TaxiPathNodeList const& nodeList = sTaxiPathNodesByPath[path]; - float distPrev = MAP_SIZE*MAP_SIZE; + float distPrev; float distNext = (nodeList[0]->LocX - GetPositionX())*(nodeList[0]->LocX - GetPositionX()) + (nodeList[0]->LocY - GetPositionY())*(nodeList[0]->LocY - GetPositionY()) + @@ -21171,7 +21269,7 @@ void Player::InitDisplayIds() PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(), getClass()); if (!info) { - TC_LOG_ERROR("entities.player", "Player %s (%s) has incorrect race/class pair. Can't init display ids.", GetName().c_str(), GetGUID().ToString().c_str()); + TC_LOG_ERROR("entities.player", "Player::InitDisplayIds: Player '%s' (%s) has incorrect race/class pair. Can't init display ids.", GetName().c_str(), GetGUID().ToString().c_str()); return; } @@ -21187,7 +21285,7 @@ void Player::InitDisplayIds() SetNativeDisplayId(info->displayId_m); break; default: - TC_LOG_ERROR("entities.player", "Player %s (%s) has invalid gender %u", GetName().c_str(), GetGUID().ToString().c_str(), gender); + TC_LOG_ERROR("entities.player", "Player::InitDisplayIds: Player '%s' (%s) has invalid gender %u", GetName().c_str(), GetGUID().ToString().c_str(), gender); } } @@ -21200,7 +21298,7 @@ inline bool Player::_StoreOrEquipNewItem(uint32 vendorslot, uint32 item, uint8 c CanEquipNewItem(slot, uiDest, item, false); if (msg != EQUIP_ERR_OK) { - SendEquipError(msg, NULL, NULL, item); + SendEquipError(msg, nullptr, nullptr, item); return false; } @@ -21270,13 +21368,13 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uin ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item); if (!pProto) { - SendBuyError(BUY_ERR_CANT_FIND_ITEM, NULL, item, 0); + SendBuyError(BUY_ERR_CANT_FIND_ITEM, nullptr, item, 0); return false; } if (!(pProto->AllowableClass & getClassMask()) && pProto->Bonding == BIND_WHEN_PICKED_UP && !IsGameMaster()) { - SendBuyError(BUY_ERR_CANT_FIND_ITEM, NULL, item, 0); + SendBuyError(BUY_ERR_CANT_FIND_ITEM, nullptr, item, 0); return false; } @@ -21286,14 +21384,16 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uin Creature* creature = GetNPCIfCanInteractWith(vendorguid, UNIT_NPC_FLAG_VENDOR); if (!creature) { - TC_LOG_DEBUG("network", "WORLD: BuyItemFromVendor - %s not found or you can't interact with him.", vendorguid.ToString().c_str()); - SendBuyError(BUY_ERR_DISTANCE_TOO_FAR, NULL, item, 0); + TC_LOG_DEBUG("network", "Player::BuyItemFromVendorSlot: Vendor (%s) not found or player '%s' (%s) can't interact with him.", + vendorguid.ToString().c_str(), GetName().c_str(), GetGUID().ToString().c_str()); + SendBuyError(BUY_ERR_DISTANCE_TOO_FAR, nullptr, item, 0); return false; } if (!sConditionMgr->IsObjectMeetingVendorItemConditions(creature->GetEntry(), item, this, creature)) { - TC_LOG_DEBUG("condition", "BuyItemFromVendor: conditions not met for creature entry %u item %u", creature->GetEntry(), item); + TC_LOG_DEBUG("condition", "Player::BuyItemFromVendorSlot: Player '%s' (%s) doesn't meed conditions for creature (Entry: %u, Item: %u)", + GetName().c_str(), GetGUID().ToString().c_str(), creature->GetEntry(), item); SendBuyError(BUY_ERR_CANT_FIND_ITEM, creature, item, 0); return false; } @@ -21340,13 +21440,14 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uin ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(crItem->ExtendedCost); if (!iece) { - TC_LOG_ERROR("entities.player", "Item %u have wrong ExtendedCost field value %u", pProto->ItemId, crItem->ExtendedCost); + TC_LOG_ERROR("entities.player", "Player::BuyItemFromVendorSlot: Item %u has wrong ExtendedCost field value %u", pProto->ItemId, crItem->ExtendedCost); return false; } // honor points price if (GetHonorPoints() < (iece->reqhonorpoints * count)) { + TC_LOG_ERROR("entities.player", "Item %u have wrong ExtendedCost field value %u", pProto->ItemId, crItem->ExtendedCost); SendEquipError(EQUIP_ERR_NOT_ENOUGH_HONOR_POINTS, NULL, NULL); return false; } @@ -21354,7 +21455,7 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uin // arena points price if (GetArenaPoints() < (iece->reqarenapoints * count)) { - SendEquipError(EQUIP_ERR_NOT_ENOUGH_ARENA_POINTS, NULL, NULL); + SendEquipError(EQUIP_ERR_NOT_ENOUGH_ARENA_POINTS, nullptr, nullptr); return false; } @@ -21363,7 +21464,7 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uin { if (iece->reqitem[i] && !HasItemCount(iece->reqitem[i], (iece->reqitemcount[i] * count))) { - SendEquipError(EQUIP_ERR_VENDOR_MISSING_TURNINS, NULL, NULL); + SendEquipError(EQUIP_ERR_VENDOR_MISSING_TURNINS, nullptr, nullptr); return false; } } @@ -21372,7 +21473,7 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uin if (GetMaxPersonalArenaRatingRequirement(iece->reqarenaslot) < iece->reqpersonalarenarating) { // probably not the proper equip err - SendEquipError(EQUIP_ERR_CANT_EQUIP_RANK, NULL, NULL); + SendEquipError(EQUIP_ERR_CANT_EQUIP_RANK, nullptr, nullptr); return false; } } @@ -21383,7 +21484,8 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uin uint32 maxCount = MAX_MONEY_AMOUNT / pProto->BuyPrice; if ((uint32)count > maxCount) { - TC_LOG_ERROR("entities.player", "Player %s tried to buy %u item id %u, causing overflow", GetName().c_str(), (uint32)count, pProto->ItemId); + TC_LOG_ERROR("entities.player", "Player::BuyItemFromVendorSlot: Player '%s' (%s) tried to buy item (ItemID: %u, Count: %u), causing overflow", + GetName().c_str(), GetGUID().ToString().c_str(), pProto->ItemId, (uint32)count); count = (uint8)maxCount; } price = pProto->BuyPrice * count; //it should not exceed MAX_MONEY_AMOUNT @@ -21407,7 +21509,7 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uin { if (pProto->BuyCount * count != 1) { - SendEquipError(EQUIP_ERR_ITEM_CANT_BE_EQUIPPED, NULL, NULL); + SendEquipError(EQUIP_ERR_ITEM_CANT_BE_EQUIPPED, nullptr, nullptr); return false; } if (!_StoreOrEquipNewItem(vendorslot, item, count, bag, slot, price, pProto, creature, crItem, false)) @@ -21415,7 +21517,7 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uin } else { - SendEquipError(EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT, NULL, NULL); + SendEquipError(EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT, nullptr, nullptr); return false; } @@ -21477,7 +21579,8 @@ void Player::UpdateHomebindTime(uint32 time) data << uint32(m_HomebindTimer); data << uint32(1); GetSession()->SendPacket(&data); - TC_LOG_DEBUG("maps", "PLAYER: Player '%s' (GUID: %u) will be teleported to homebind in 60 seconds", GetName().c_str(), GetGUID().GetCounter()); + TC_LOG_DEBUG("maps", "Player::UpdateHomebindTime: Player '%s' (%s) will be teleported to homebind in 60 seconds", + GetName().c_str(), GetGUID().ToString().c_str()); } } @@ -21513,7 +21616,7 @@ void Player::UpdatePvPState(bool onlyFFA) else // in friendly area { if (IsPvP() && !HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP) && !pvpInfo.EndTimer) - pvpInfo.EndTimer = time(NULL); // start toggle-off + pvpInfo.EndTimer = time(nullptr); // start toggle-off } } @@ -21533,7 +21636,7 @@ void Player::UpdatePvP(bool state, bool _override) } else { - pvpInfo.EndTimer = time(NULL); + pvpInfo.EndTimer = time(nullptr); SetPvP(state); } } @@ -21547,7 +21650,7 @@ void Player::UpdatePotionCooldown(Spell* spell) // Call not from spell cast, send cooldown event for item spells if no in combat if (!spell) { - // spell/item pair let set proper cooldown (except not existed charged spell cooldown spellmods for potions) + // spell/item pair let set proper cooldown (except non-existing charged spell cooldown spellmods for potions) if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(m_lastPotionId)) for (uint8 idx = 0; idx < MAX_ITEM_PROTO_SPELLS; ++idx) if (proto->Spells[idx].SpellId && proto->Spells[idx].SpellTrigger == ITEM_SPELLTRIGGER_ON_USE) @@ -21580,7 +21683,7 @@ void Player::clearResurrectRequestData() m_ghoulResurrectGhoulGUID = ObjectGuid::Empty; } //slot to be excluded while counting -bool Player::EnchantmentFitsRequirements(uint32 enchantmentcondition, int8 slot) +bool Player::EnchantmentFitsRequirements(uint32 enchantmentcondition, int8 slot) const { if (!enchantmentcondition) return true; @@ -21659,7 +21762,8 @@ bool Player::EnchantmentFitsRequirements(uint32 enchantmentcondition, int8 slot) } } - TC_LOG_DEBUG("entities.player.items", "Checking Condition %u, there are %u Meta Gems, %u Red Gems, %u Yellow Gems and %u Blue Gems, Activate:%s", enchantmentcondition, curcount[0], curcount[1], curcount[2], curcount[3], activate ? "yes" : "no"); + TC_LOG_DEBUG("entities.player.items", "Player::EnchantmentFitsRequirements: Checking Condition %u, there are %u Meta Gems, %u Red Gems, %u Yellow Gems and %u Blue Gems, Activate:%s", + enchantmentcondition, curcount[0], curcount[1], curcount[2], curcount[3], activate ? "yes" : "no"); return activate; } @@ -21771,7 +21875,7 @@ void Player::SetBattlegroundEntryPoint() if (const WorldSafeLocsEntry* entry = sObjectMgr->GetClosestGraveYard(GetPositionX(), GetPositionY(), GetPositionZ(), GetMapId(), GetTeam())) m_bgData.joinPos = WorldLocation(entry->map_id, entry->x, entry->y, entry->z, 0.0f); else - TC_LOG_ERROR("entities.player", "SetBattlegroundEntryPoint: Dungeon map %u has no linked graveyard, setting home location as entry point.", GetMapId()); + TC_LOG_ERROR("entities.player", "Player::SetBattlegroundEntryPoint: Dungeon (MapID: %u) has no linked graveyard, setting home location as entry point.", GetMapId()); } // If new entry point is not BG or arena set it else if (!GetMap()->IsBattlegroundOrArena()) @@ -21982,7 +22086,7 @@ template<> inline void BeforeVisibilityDestroy<Creature>(Creature* t, Player* p) { if (p->GetPetGUID() == t->GetGUID() && t->IsPet()) - ((Pet*)t)->Remove(PET_SAVE_NOT_IN_SLOT, true); + t->ToPet()->Remove(PET_SAVE_NOT_IN_SLOT, true); } void Player::UpdateVisibilityOf(WorldObject* target) @@ -22016,7 +22120,7 @@ void Player::UpdateVisibilityOf(WorldObject* target) // target aura duration for caster show only if target exist at caster client // send data at target visibility change (adding to client) if (target->isType(TYPEMASK_UNIT)) - SendInitialVisiblePackets((Unit*)target); + SendInitialVisiblePackets(static_cast<Unit*>(target)); } } } @@ -22063,7 +22167,7 @@ void Player::UpdateTriggerVisibility() GetSession()->SendPacket(&packet); } -void Player::SendInitialVisiblePackets(Unit* target) +void Player::SendInitialVisiblePackets(Unit* target) const { SendAurasForTarget(target); if (target->IsAlive()) @@ -22152,7 +22256,7 @@ bool Player::ModifyMoney(int32 amount, bool sendError /*= true*/) sScriptMgr->OnPlayerMoneyLimit(this, amount); if (sendError) - SendEquipError(EQUIP_ERR_TOO_MUCH_GOLD, NULL, NULL); + SendEquipError(EQUIP_ERR_TOO_MUCH_GOLD, nullptr, nullptr); return false; } } @@ -22183,14 +22287,14 @@ Unit* Player::GetSelectedUnit() const { if (ObjectGuid selectionGUID = GetTarget()) return ObjectAccessor::GetUnit(*this, selectionGUID); - return NULL; + return nullptr; } Player* Player::GetSelectedPlayer() const { if (ObjectGuid selectionGUID = GetTarget()) return ObjectAccessor::GetPlayer(*this, selectionGUID); - return NULL; + return nullptr; } void Player::SendComboPoints() @@ -22281,7 +22385,7 @@ void Player::ClearComboPoints() void Player::SetGroup(Group* group, int8 subgroup) { - if (group == NULL) + if (group == nullptr) m_group.unlink(); else { @@ -22421,7 +22525,7 @@ void Player::SendUpdateToOutOfRangeGroupMembers() pet->ResetAuraUpdateMaskForRaid(); } -void Player::SendTransferAborted(uint32 mapid, TransferAbortReason reason, uint8 arg) +void Player::SendTransferAborted(uint32 mapid, TransferAbortReason reason, uint8 arg) const { WorldPacket data(SMSG_TRANSFER_ABORTED, 4+2); data << uint32(mapid); @@ -22440,7 +22544,7 @@ void Player::SendTransferAborted(uint32 mapid, TransferAbortReason reason, uint8 GetSession()->SendPacket(&data); } -void Player::SendInstanceResetWarning(uint32 mapid, Difficulty difficulty, uint32 time, bool welcome) +void Player::SendInstanceResetWarning(uint32 mapid, Difficulty difficulty, uint32 time, bool welcome) const { // type of warning, based on the time remaining until reset uint32 type; @@ -22564,7 +22668,8 @@ void Player::LearnCustomSpells() for (PlayerCreateInfoSpells::const_iterator itr = info->customSpells.begin(); itr != info->customSpells.end(); ++itr) { uint32 tspell = *itr; - TC_LOG_DEBUG("entities.player.loading", "PLAYER (Class: %u Race: %u): Adding initial spell, id = %u", uint32(getClass()), uint32(getRace()), tspell); + TC_LOG_DEBUG("entities.player.loading", "Player::LearnCustomSpells: Player '%s' (%s, Class: %u Race: %u): Adding initial spell (SpellID: %u)", + GetName().c_str(), GetGUID().ToString().c_str(), uint32(getClass()), uint32(getRace()), tspell); if (!IsInWorld()) // will send in INITIAL_SPELLS in list anyway at map add AddSpell(tspell, true, true, true, false); else // but send in normal spell in game learn case @@ -22736,7 +22841,7 @@ void Player::LearnSkillRewardedSpells(uint32 skillId, uint32 skillValue) } } -void Player::SendAurasForTarget(Unit* target) +void Player::SendAurasForTarget(Unit* target) const { if (!target || target->GetVisibleAuras()->empty()) // speedup things return; @@ -22777,7 +22882,7 @@ void Player::SetDailyQuestStatus(uint32 quest_id) if (!GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1+quest_daily_idx)) { SetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1+quest_daily_idx, quest_id); - m_lastDailyQuestTime = time(NULL); // last daily quest time + m_lastDailyQuestTime = time(nullptr); // last daily quest time m_DailyQuestChanged = true; break; } @@ -22785,7 +22890,7 @@ void Player::SetDailyQuestStatus(uint32 quest_id) } else { m_DFQuests.insert(quest_id); - m_lastDailyQuestTime = time(NULL); + m_lastDailyQuestTime = time(nullptr); m_DailyQuestChanged = true; } } @@ -22858,7 +22963,7 @@ void Player::ResetMonthlyQuestStatus() Battleground* Player::GetBattleground() const { if (GetBattlegroundId() == 0) - return NULL; + return nullptr; return sBattlegroundMgr->GetBattleground(GetBattlegroundId(), m_bgData.bgTypeID); } @@ -22917,7 +23022,7 @@ uint32 Player::AddBattlegroundQueueId(BattlegroundQueueTypeId val) return PLAYER_MAX_BATTLEGROUND_QUEUES; } -bool Player::HasFreeBattlegroundQueueId() +bool Player::HasFreeBattlegroundQueueId() const { for (uint8 i=0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i) if (m_bgBattlegroundQueueID[i].bgQueueTypeId == BATTLEGROUND_QUEUE_NONE) @@ -23105,7 +23210,7 @@ void Player::UpdateForQuestWorldObjects() void Player::SetSummonPoint(uint32 mapid, float x, float y, float z) { - m_summon_expire = time(NULL) + MAX_PLAYER_SUMMON_DELAY; + m_summon_expire = time(nullptr) + MAX_PLAYER_SUMMON_DELAY; m_summon_mapid = mapid; m_summon_x = x; m_summon_y = y; @@ -23121,7 +23226,7 @@ void Player::SummonIfPossible(bool agree) } // expire and auto declined - if (m_summon_expire < time(NULL)) + if (m_summon_expire < time(nullptr)) return; // stop taxi flight at summon @@ -23242,7 +23347,7 @@ bool Player::HasItemFitToSpellRequirements(SpellInfo const* spellInfo, Item cons break; } default: - TC_LOG_ERROR("entities.player", "HasItemFitToSpellRequirements: Not handled spell requirement for item class %u", spellInfo->EquippedItemClass); + TC_LOG_ERROR("entities.player", "Player::HasItemFitToSpellRequirements: Not handled spell requirement for item class %u", spellInfo->EquippedItemClass); break; } @@ -23368,7 +23473,7 @@ bool Player::GetsRecruitAFriendBonus(bool forXP) { if (Group* group = this->GetGroup()) { - for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) + for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) { Player* player = itr->GetSource(); if (!player) @@ -23417,7 +23522,7 @@ void Player::RewardPlayerAndGroupAtEvent(uint32 creature_id, WorldObject* pRewar // prepare data for near group iteration if (Group* group = GetGroup()) { - for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) + for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) { Player* player = itr->GetSource(); if (!player) @@ -23527,7 +23632,7 @@ void Player::SetClientControl(Unit* target, bool allowMove) void Player::SetMover(Unit* target) { - m_mover->m_movedPlayer = NULL; + m_mover->m_movedPlayer = nullptr; m_mover = target; m_mover->m_movedPlayer = this; } @@ -23572,7 +23677,7 @@ uint32 Player::GetCorpseReclaimDelay(bool pvp) const else if (!sWorld->getBoolConfig(CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE)) return 0; - time_t now = time(NULL); + time_t now = time(nullptr); // 0..2 full period // should be ceil(x)-1 but not floor(x) uint64 count = (now < m_deathExpireTime - 1) ? (m_deathExpireTime - 1 - now) / DEATH_EXPIRE_STEP : 0; @@ -23587,7 +23692,7 @@ void Player::UpdateCorpseReclaimDelay() (!pvp && !sWorld->getBoolConfig(CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE))) return; - time_t now = time(NULL); + time_t now = time(nullptr); if (now < m_deathExpireTime) { @@ -23603,7 +23708,7 @@ void Player::UpdateCorpseReclaimDelay() m_deathExpireTime = now + DEATH_EXPIRE_STEP; } -int32 Player::CalculateCorpseReclaimDelay(bool load) +int32 Player::CalculateCorpseReclaimDelay(bool load) const { Corpse* corpse = GetCorpse(); @@ -23631,7 +23736,7 @@ int32 Player::CalculateCorpseReclaimDelay(bool load) } time_t expected_time = corpse->GetGhostTime() + copseReclaimDelay[count]; - time_t now = time(NULL); + time_t now = time(nullptr); if (now >= expected_time) return -1; @@ -23644,7 +23749,7 @@ int32 Player::CalculateCorpseReclaimDelay(bool load) return delay * IN_MILLISECONDS; } -void Player::SendCorpseReclaimDelay(uint32 delay) +void Player::SendCorpseReclaimDelay(uint32 delay) const { WorldPacket data(SMSG_CORPSE_RECLAIM_DELAY, 4); data << uint32(delay); @@ -23655,12 +23760,12 @@ Player* Player::GetNextRandomRaidMember(float radius) { Group* group = GetGroup(); if (!group) - return NULL; + return nullptr; std::vector<Player*> nearMembers; nearMembers.reserve(group->GetMembersCount()); - for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) + for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) { Player* Target = itr->GetSource(); @@ -23671,7 +23776,7 @@ Player* Player::GetNextRandomRaidMember(float radius) } if (nearMembers.empty()) - return NULL; + return nullptr; uint32 randTarget = urand(0, nearMembers.size()-1); return nearMembers[randTarget]; @@ -23703,7 +23808,7 @@ PartyResult Player::CanUninviteFromGroup(ObjectGuid guidMember) const return ERR_PARTY_LFG_BOOT_LOOT_ROLLS; /// @todo Should also be sent when anyone has recently left combat, with an aprox ~5 seconds timer. - for (GroupReference const* itr = grp->GetFirstMember(); itr != NULL; itr = itr->next()) + for (GroupReference const* itr = grp->GetFirstMember(); itr != nullptr; itr = itr->next()) if (itr->GetSource() && itr->GetSource()->IsInCombat()) return ERR_PARTY_LFG_BOOT_IN_COMBAT; @@ -23727,12 +23832,12 @@ PartyResult Player::CanUninviteFromGroup(ObjectGuid guidMember) const return ERR_PARTY_RESULT_OK; } -bool Player::isUsingLfg() +bool Player::isUsingLfg() const { return sLFGMgr->GetState(GetGUID()) != lfg::LFG_STATE_NONE; } -bool Player::inRandomLfgDungeon() +bool Player::inRandomLfgDungeon() const { if (sLFGMgr->selectedRandomLfgDungeon(GetGUID())) { @@ -23762,12 +23867,12 @@ void Player::RemoveFromBattlegroundOrBattlefieldRaid() m_group.link(group, this); m_group.setSubGroup(GetOriginalSubGroup()); } - SetOriginalGroup(NULL); + SetOriginalGroup(nullptr); } void Player::SetOriginalGroup(Group* group, int8 subgroup) { - if (group == NULL) + if (group == nullptr) m_originalGroup.unlink(); else { @@ -23788,7 +23893,7 @@ void Player::UpdateUnderwaterState(Map* m, float x, float y, float z) if (_lastLiquid && _lastLiquid->SpellId) RemoveAurasDueToSpell(_lastLiquid->SpellId); - _lastLiquid = NULL; + _lastLiquid = nullptr; return; } @@ -23814,7 +23919,7 @@ void Player::UpdateUnderwaterState(Map* m, float x, float y, float z) else if (_lastLiquid && _lastLiquid->SpellId) { RemoveAurasDueToSpell(_lastLiquid->SpellId); - _lastLiquid = NULL; + _lastLiquid = nullptr; } @@ -23869,7 +23974,7 @@ void Player::SetCanBlock(bool value) UpdateBlockPercentage(); } -bool ItemPosCount::isContainedIn(ItemPosCountVec const& vec) const +bool ItemPosCount::isContainedIn(std::vector<ItemPosCount> const& vec) const { for (ItemPosCountVec::const_iterator itr = vec.begin(); itr != vec.end(); ++itr) if (itr->pos == pos) @@ -23877,15 +23982,15 @@ bool ItemPosCount::isContainedIn(ItemPosCountVec const& vec) const return false; } -void Player::StopCastingBindSight() +void Player::StopCastingBindSight() const { if (WorldObject* target = GetViewpoint()) { if (target->isType(TYPEMASK_UNIT)) { - ((Unit*)target)->RemoveAurasByType(SPELL_AURA_BIND_SIGHT, GetGUID()); - ((Unit*)target)->RemoveAurasByType(SPELL_AURA_MOD_POSSESS, GetGUID()); - ((Unit*)target)->RemoveAurasByType(SPELL_AURA_MOD_POSSESS_PET, GetGUID()); + static_cast<Unit*>(target)->RemoveAurasByType(SPELL_AURA_BIND_SIGHT, GetGUID()); + static_cast<Unit*>(target)->RemoveAurasByType(SPELL_AURA_MOD_POSSESS, GetGUID()); + static_cast<Unit*>(target)->RemoveAurasByType(SPELL_AURA_MOD_POSSESS_PET, GetGUID()); } } } @@ -23894,11 +23999,12 @@ void Player::SetViewpoint(WorldObject* target, bool apply) { if (apply) { - TC_LOG_DEBUG("maps", "Player::CreateViewpoint: Player %s create seer %u (TypeId: %u).", GetName().c_str(), target->GetEntry(), target->GetTypeId()); + TC_LOG_DEBUG("maps", "Player::CreateViewpoint: Player '%s' (%s) creates seer (Entry: %u, TypeId: %u).", + GetName().c_str(), GetGUID().ToString().c_str(), target->GetEntry(), target->GetTypeId()); if (!AddGuidValue(PLAYER_FARSIGHT, target->GetGUID())) { - TC_LOG_FATAL("entities.player", "Player::CreateViewpoint: Player %s cannot add new viewpoint!", GetName().c_str()); + TC_LOG_FATAL("entities.player", "Player::CreateViewpoint: Player '%s' (%s) cannot add new viewpoint!", GetName().c_str(), GetGUID().ToString().c_str()); return; } @@ -23906,20 +24012,20 @@ void Player::SetViewpoint(WorldObject* target, bool apply) UpdateVisibilityOf(target); if (target->isType(TYPEMASK_UNIT) && target != GetVehicleBase()) - ((Unit*)target)->AddPlayerToVision(this); + static_cast<Unit*>(target)->AddPlayerToVision(this); } else { - TC_LOG_DEBUG("maps", "Player::CreateViewpoint: Player %s remove seer", GetName().c_str()); + TC_LOG_DEBUG("maps", "Player::CreateViewpoint: Player %s removed seer", GetName().c_str()); if (!RemoveGuidValue(PLAYER_FARSIGHT, target->GetGUID())) { - TC_LOG_FATAL("entities.player", "Player::CreateViewpoint: Player %s cannot remove current viewpoint!", GetName().c_str()); + TC_LOG_FATAL("entities.player", "Player::CreateViewpoint: Player '%s' (%s) cannot remove current viewpoint!", GetName().c_str(), GetGUID().ToString().c_str()); return; } if (target->isType(TYPEMASK_UNIT) && target != GetVehicleBase()) - ((Unit*)target)->RemovePlayerFromVision(this); + static_cast<Unit*>(target)->RemovePlayerFromVision(this); //must immediately set seer back otherwise may crash m_seer = this; @@ -23957,11 +24063,11 @@ void Player::SetViewpoint(WorldObject* target, bool apply) WorldObject* Player::GetViewpoint() const { if (ObjectGuid guid = GetGuidValue(PLAYER_FARSIGHT)) - return (WorldObject*)ObjectAccessor::GetObjectByTypeMask(*this, guid, TYPEMASK_SEER); - return NULL; + return static_cast<WorldObject*>(ObjectAccessor::GetObjectByTypeMask(*this, guid, TYPEMASK_SEER)); + return nullptr; } -bool Player::CanUseBattlegroundObject(GameObject* gameobject) +bool Player::CanUseBattlegroundObject(GameObject* gameobject) const { // It is possible to call this method with a null pointer, only skipping faction check. if (gameobject) @@ -23980,14 +24086,14 @@ bool Player::CanUseBattlegroundObject(GameObject* gameobject) IsAlive()); // Alive } -bool Player::CanCaptureTowerPoint() +bool Player::CanCaptureTowerPoint() const { return (!HasStealthAura() && // not stealthed !HasInvisibilityAura() && // not invisible IsAlive()); // live player } -uint32 Player::GetBarberShopCost(uint8 newhairstyle, uint8 newhaircolor, uint8 newfacialhair, BarberShopStyleEntry const* newSkin) +uint32 Player::GetBarberShopCost(uint8 newhairstyle, uint8 newhaircolor, uint8 newfacialhair, BarberShopStyleEntry const* newSkin) const { uint8 level = getLevel(); @@ -24055,7 +24161,7 @@ void Player::SetGlyph(uint8 slot, uint32 glyph) SetUInt32Value(PLAYER_FIELD_GLYPHS_1 + slot, glyph); } -bool Player::isTotalImmune() +bool Player::isTotalImmune() const { AuraEffectList const& immune = GetAuraEffectsByType(SPELL_AURA_SCHOOL_IMMUNITY); @@ -24105,7 +24211,7 @@ void Player::SetTitle(CharTitlesEntry const* title, bool lost) GetSession()->SendPacket(&data); } -bool Player::isTotalImmunity() +bool Player::isTotalImmunity() const { AuraEffectList const& immune = GetAuraEffectsByType(SPELL_AURA_SCHOOL_IMMUNITY); @@ -24129,38 +24235,6 @@ bool Player::isTotalImmunity() return false; } -void Player::UpdateCharmedAI() -{ - //This should only called in Player::Update - Creature* charmer = GetCharmer()->ToCreature(); - - //kill self if charm aura has infinite duration - if (charmer->IsInEvadeMode()) - { - AuraEffectList const& auras = GetAuraEffectsByType(SPELL_AURA_MOD_CHARM); - for (AuraEffectList::const_iterator iter = auras.begin(); iter != auras.end(); ++iter) - if ((*iter)->GetCasterGUID() == charmer->GetGUID() && (*iter)->GetBase()->IsPermanent()) - { - charmer->DealDamage(this, GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); - return; - } - } - - if (!charmer->IsInCombat()) - GetMotionMaster()->MoveFollow(charmer, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); - - Unit* target = GetVictim(); - if (!target || !charmer->IsValidAttackTarget(target)) - { - target = charmer->SelectNearestTarget(); - if (!target) - return; - - GetMotionMaster()->MoveChase(target); - Attack(target, true); - } -} - uint32 Player::GetRuneBaseCooldown(uint8 index) { uint8 rune = GetBaseRune(index); @@ -24213,7 +24287,7 @@ void Player::RemoveRunesByAuraEffect(AuraEffect const* aura) if (m_runes->runes[i].ConvertAura == aura) { ConvertRune(i, GetBaseRune(i)); - SetRuneConvertAura(i, NULL); + SetRuneConvertAura(i, nullptr); } } } @@ -24221,11 +24295,11 @@ void Player::RemoveRunesByAuraEffect(AuraEffect const* aura) void Player::RestoreBaseRune(uint8 index) { AuraEffect const* aura = m_runes->runes[index].ConvertAura; - // If rune was converted by a non-pasive aura that still active we should keep it converted + // If rune was converted by a non-passive aura that still active we should keep it converted if (aura && !aura->GetSpellInfo()->HasAttribute(SPELL_ATTR0_PASSIVE)) return; ConvertRune(index, GetBaseRune(index)); - SetRuneConvertAura(index, NULL); + SetRuneConvertAura(index, nullptr); // Don't drop passive talents providing rune convertion if (!aura || aura->GetAuraType() != SPELL_AURA_CONVERT_RUNE) return; @@ -24247,7 +24321,7 @@ void Player::ConvertRune(uint8 index, RuneType newType) GetSession()->SendPacket(&data); } -void Player::ResyncRunes(uint8 count) +void Player::ResyncRunes(uint8 count) const { WorldPacket data(SMSG_RESYNC_RUNES, 4 + count * 2); data << uint32(count); @@ -24259,7 +24333,7 @@ void Player::ResyncRunes(uint8 count) GetSession()->SendPacket(&data); } -void Player::AddRunePower(uint8 index) +void Player::AddRunePower(uint8 index) const { WorldPacket data(SMSG_ADD_RUNE_POWER, 4); data << uint32(1 << index); // mask (0x00-0x3F probably) @@ -24293,7 +24367,7 @@ void Player::InitRunes() SetRuneCooldown(i, 0); // reset cooldowns SetRuneTimer(i, 0xFFFFFFFF); // Reset rune flags SetLastRuneGraceTimer(i, 0); - SetRuneConvertAura(i, NULL); + SetRuneConvertAura(i, nullptr); m_runes->SetRuneState(i); } @@ -24328,7 +24402,7 @@ void Player::AutoStoreLoot(uint8 bag, uint8 slot, uint32 loot_id, LootStore cons msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, lootItem->itemid, lootItem->count); if (msg != EQUIP_ERR_OK) { - SendEquipError(msg, NULL, NULL, lootItem->itemid); + SendEquipError(msg, nullptr, nullptr, lootItem->itemid); continue; } @@ -24339,15 +24413,15 @@ void Player::AutoStoreLoot(uint8 bag, uint8 slot, uint32 loot_id, LootStore cons void Player::StoreLootItem(uint8 lootSlot, Loot* loot) { - QuestItem* qitem = NULL; - QuestItem* ffaitem = NULL; - QuestItem* conditem = NULL; + QuestItem* qitem = nullptr; + QuestItem* ffaitem = nullptr; + QuestItem* conditem = nullptr; LootItem* item = loot->LootItemInSlot(lootSlot, this, &qitem, &ffaitem, &conditem); if (!item) { - SendEquipError(EQUIP_ERR_ALREADY_LOOTED, NULL, NULL); + SendEquipError(EQUIP_ERR_ALREADY_LOOTED, nullptr, nullptr); return; } @@ -24414,7 +24488,7 @@ void Player::StoreLootItem(uint8 lootSlot, Loot* loot) } else - SendEquipError(msg, NULL, NULL, item->itemid); + SendEquipError(msg, nullptr, nullptr, item->itemid); } uint32 Player::CalculateTalentsPoints() const @@ -24467,8 +24541,8 @@ void Player::_LoadSkills(PreparedQueryResult result) SkillRaceClassInfoEntry const* rcEntry = GetSkillRaceClassInfo(skill, getRace(), getClass()); if (!rcEntry) { - TC_LOG_ERROR("entities.player", "Character: %s (GUID: %u Race: %u Class: %u) has skill %u not allowed for his race/class combination", - GetName().c_str(), GetGUID().GetCounter(), uint32(getRace()), uint32(getClass()), skill); + TC_LOG_ERROR("entities.player", "Player::_LoadSkills: Player '%s' (%s, Race: %u, Class: %u) has forbidden skill %u for his race/class combination", + GetName().c_str(), GetGUID().ToString().c_str(), uint32(getRace()), uint32(getClass()), skill); mSkillStatus.insert(SkillStatusMap::value_type(skill, SkillStatusData(0, SKILL_DELETED))); continue; @@ -24491,7 +24565,8 @@ void Player::_LoadSkills(PreparedQueryResult result) if (value == 0) { - TC_LOG_ERROR("entities.player", "Character %u has skill %u with value 0. Will be deleted.", GetGUID().GetCounter(), skill); + TC_LOG_ERROR("entities.player", "Player::_LoadSkills: Player '%s' (%s) has skill %u with value 0, deleted.", + GetName().c_str(), GetGUID().ToString().c_str(), skill); PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_SKILL); @@ -24528,7 +24603,8 @@ void Player::_LoadSkills(PreparedQueryResult result) if (count >= PLAYER_MAX_SKILLS) // client limit { - TC_LOG_ERROR("entities.player", "Character %u has more than %u skills.", GetGUID().GetCounter(), PLAYER_MAX_SKILLS); + TC_LOG_ERROR("entities.player", "Player::_LoadSkills: Player '%s' (%s) has more than %u skills.", + GetName().c_str(), GetGUID().ToString().c_str(), PLAYER_MAX_SKILLS); break; } } @@ -24795,30 +24871,13 @@ void Player::LearnTalent(uint32 talentId, uint32 talentRank) uint32 tTab = talentInfo->TalentTab; if (talentInfo->Row > 0) - { - uint32 numRows = sTalentStore.GetNumRows(); - for (uint32 i = 0; i < numRows; i++) // Loop through all talents. - { - // Someday, someone needs to revamp - const TalentEntry* tmpTalent = sTalentStore.LookupEntry(i); - if (tmpTalent) // the way talents are tracked - { + for (uint32 i = 0; i < sTalentStore.GetNumRows(); i++) // Loop through all talents. + if (const TalentEntry* tmpTalent = sTalentStore.LookupEntry(i)) // the way talents are tracked if (tmpTalent->TalentTab == tTab) - { for (uint8 rank = 0; rank < MAX_TALENT_RANK; rank++) - { if (tmpTalent->RankID[rank] != 0) - { if (HasSpell(tmpTalent->RankID[rank])) - { spentPoints += (rank + 1); - } - } - } - } - } - } - } // not have required min points spent in talent tree if (spentPoints < (talentInfo->Row * MAX_TALENT_RANK)) @@ -24828,7 +24887,7 @@ void Player::LearnTalent(uint32 talentId, uint32 talentRank) uint32 spellid = talentInfo->RankID[talentRank]; if (spellid == 0) { - TC_LOG_ERROR("entities.player", "Talent.dbc have for talent: %u Rank: %u spell id = 0", talentId, talentRank); + TC_LOG_ERROR("entities.player", "Player::LearnTalent: Talent.dbc has no spellInfo for talent: %u (spell id = 0)", talentId); return; } @@ -24840,7 +24899,7 @@ void Player::LearnTalent(uint32 talentId, uint32 talentRank) LearnSpell(spellid, false); AddTalent(spellid, m_activeSpec, true); - TC_LOG_DEBUG("entities.player", "TalentID: %u Rank: %u Spell: %u Spec: %u\n", talentId, talentRank, spellid, m_activeSpec); + TC_LOG_DEBUG("misc", "Player::LearnTalent: TalentID: %u Spell: %u Group: %u\n", talentId, spellid, uint32(m_activeSpec)); // update free talent points SetFreeTalentPoints(CurTalentPoints - (talentRank - curtalent_maxrank + 1)); @@ -24965,7 +25024,7 @@ void Player::LearnPetTalent(ObjectGuid petGuid, uint32 talentId, uint32 talentRa uint32 spellid = talentInfo->RankID[talentRank]; if (spellid == 0) { - TC_LOG_ERROR("entities.player", "Talent.dbc have for talent: %u Rank: %u spell id = 0", talentId, talentRank); + TC_LOG_ERROR("entities.player", "Talent.dbc contains talent: %u Rank: %u spell id = 0", talentId, talentRank); return; } @@ -25292,7 +25351,8 @@ void Player::SetEquipmentSet(uint32 index, EquipmentSet eqset) if (!found) // something wrong... { - TC_LOG_ERROR("entities.player", "Player %s tried to save equipment set " UI64FMTD " (index %u), but that equipment set not found!", GetName().c_str(), eqset.Guid, index); + TC_LOG_ERROR("entities.player", "Player::SetEquipmentSet: Player '%s' (%s) tried to save nonexistent equipment set " UI64FMTD " (index: %u)", + GetName().c_str(), GetGUID().ToString().c_str(), eqset.Guid, index); return; } } @@ -25322,7 +25382,7 @@ void Player::_SaveEquipmentSets(SQLTransaction& trans) { uint32 index = itr->first; EquipmentSet& eqset = itr->second; - PreparedStatement* stmt = NULL; + PreparedStatement* stmt = nullptr; uint8 j = 0; switch (eqset.state) { @@ -25460,7 +25520,7 @@ void Player::_LoadGlyphs(PreparedQueryResult result) while (result->NextRow()); } -void Player::_SaveGlyphs(SQLTransaction& trans) +void Player::_SaveGlyphs(SQLTransaction& trans) const { PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_GLYPHS); stmt->setUInt32(0, GetGUID().GetCounter()); @@ -25544,7 +25604,7 @@ void Player::UpdateSpecCount(uint8 count) ActivateSpec(0); SQLTransaction trans = CharacterDatabase.BeginTransaction(); - PreparedStatement* stmt = NULL; + PreparedStatement* stmt; // Copy spec data if (count > curCount) @@ -25635,7 +25695,7 @@ void Player::ActivateSpec(uint8 spec) for (int8 rank = MAX_TALENT_RANK-1; rank >= 0; --rank) { - // skip non-existant talent ranks + // skip non-existing talent ranks if (talentInfo->RankID[rank] == 0) continue; RemoveSpell(talentInfo->RankID[rank], true); // removes the talent, and all dependant, learned, and chained spells.. @@ -25679,7 +25739,7 @@ void Player::ActivateSpec(uint8 spec) // learn highest talent rank that exists in newly activated spec for (int8 rank = MAX_TALENT_RANK-1; rank >= 0; --rank) { - // skip non-existant talent ranks + // skip non-existing talent ranks if (talentInfo->RankID[rank] == 0) continue; // if the talent can be found in the newly activated PlayerTalentMap @@ -25752,7 +25812,7 @@ uint32 Player::GetReputation(uint32 factionentry) const return GetReputationMgr().GetReputation(sFactionStore.LookupEntry(factionentry)); } -std::string const& Player::GetGuildName() +std::string const& Player::GetGuildName() const { return sGuildMgr->GetGuildById(GetGuildId())->GetName(); } @@ -25960,7 +26020,7 @@ void Player::SendItemRetrievalMail(uint32 itemEntry, uint32 count) MailDraft draft("Recovered Item", "We recovered a lost item in the twisting nether and noted that it was yours.$B$BPlease find said object enclosed."); // This is the text used in Cataclysm, it probably wasn't changed. SQLTransaction trans = CharacterDatabase.BeginTransaction(); - if (Item* item = Item::CreateItem(itemEntry, count, 0)) + if (Item* item = Item::CreateItem(itemEntry, count, nullptr)) { item->SaveToDB(trans); draft.AddItem(item); @@ -25991,7 +26051,7 @@ void Player::_LoadRandomBGStatus(PreparedQueryResult result) m_IsBGRandomWinner = true; } -float Player::GetAverageItemLevel() +float Player::GetAverageItemLevel() const { float sum = 0; uint32 count = 0; @@ -26169,7 +26229,7 @@ float Player::GetCollisionHeight(bool mounted) const } } -std::string Player::GetMapAreaAndZoneString() +std::string Player::GetMapAreaAndZoneString() const { uint32 areaId = GetAreaId(); std::string areaName = "Unknown"; @@ -26187,7 +26247,7 @@ std::string Player::GetMapAreaAndZoneString() return str.str(); } -std::string Player::GetCoordsMapAreaAndZoneString() +std::string Player::GetCoordsMapAreaAndZoneString() const { std::ostringstream str; str << Position::ToString() << " " << GetMapAreaAndZoneString(); @@ -26222,31 +26282,31 @@ Pet* Player::SummonPet(uint32 entry, float x, float y, float z, float ang, PetTy if (duration > 0) pet->SetDuration(duration); - return NULL; + return nullptr; } // petentry == 0 for hunter "call pet" (current pet summoned if any) if (!entry) { delete pet; - return NULL; + return nullptr; } pet->Relocate(x, y, z, ang); if (!pet->IsPositionValid()) { - TC_LOG_ERROR("misc", "Pet (guidlow %d, entry %d) not summoned. Suggested coordinates isn't valid (X: %f Y: %f)", pet->GetGUID().GetCounter(), pet->GetEntry(), pet->GetPositionX(), pet->GetPositionY()); + TC_LOG_ERROR("misc", "Player::SummonPet: Pet (%s, Entry: %d) not summoned. Suggested coordinates aren't valid (X: %f Y: %f)", pet->GetGUID().ToString().c_str(), pet->GetEntry(), pet->GetPositionX(), pet->GetPositionY()); delete pet; - return NULL; + return nullptr; } Map* map = GetMap(); uint32 pet_number = sObjectMgr->GeneratePetNumber(); if (!pet->Create(map->GenerateLowGuid<HighGuid::Pet>(), map, GetPhaseMask(), entry, pet_number)) { - TC_LOG_ERROR("misc", "no such creature entry %u", entry); + TC_LOG_ERROR("misc", "Player::SummonPet: No such creature entry %u", entry); delete pet; - return NULL; + return nullptr; } pet->SetCreatorGUID(GetGUID()); @@ -26269,7 +26329,7 @@ Pet* Player::SummonPet(uint32 entry, float x, float y, float z, float ang, PetTy pet->SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, 1000); pet->SetFullHealth(); pet->SetPower(POWER_MANA, pet->GetMaxPower(POWER_MANA)); - pet->SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, uint32(time(NULL))); // cast can't be helped in this case + pet->SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, uint32(time(nullptr))); // cast can't be helped in this case break; default: break; @@ -26313,7 +26373,7 @@ Pet* Player::SummonPet(uint32 entry, float x, float y, float z, float ang, PetTy return pet; } -void Player::SendSupercededSpell(uint32 oldSpell, uint32 newSpell) +void Player::SendSupercededSpell(uint32 oldSpell, uint32 newSpell) const { WorldPacket data(SMSG_SUPERCEDED_SPELL, 8); data << uint32(oldSpell) << uint32(newSpell); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 2388cf9d0c7..b2cb2aed226 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -54,6 +54,7 @@ class PlayerMenu; class PlayerSocial; class SpellCastTargets; class UpdateMask; +class PlayerAI; struct CharacterCustomizeInfo; @@ -116,7 +117,7 @@ struct PlayerTalent // Spell modifier (used for modify other spells) struct SpellModifier { - SpellModifier(Aura* _ownerAura = NULL) : op(SPELLMOD_DAMAGE), type(SPELLMOD_FLAT), charges(0), value(0), mask(), spellId(0), ownerAura(_ownerAura) { } + SpellModifier(Aura* _ownerAura = nullptr) : op(SPELLMOD_DAMAGE), type(SPELLMOD_FLAT), charges(0), value(0), mask(), spellId(0), ownerAura(_ownerAura) { } SpellModOp op : 8; SpellModType type : 8; int16 charges : 16; @@ -255,7 +256,7 @@ typedef std::list<PlayerCreateInfoSkill> PlayerCreateInfoSkills; struct PlayerInfo { // existence checked by displayId != 0 - PlayerInfo() : mapId(0), areaId(0), positionX(0.0f), positionY(0.0f), positionZ(0.0f), orientation(0.0f), displayId_m(0), displayId_f(0), levelInfo(NULL) { } + PlayerInfo() : mapId(0), areaId(0), positionX(0.0f), positionY(0.0f), positionZ(0.0f), orientation(0.0f), displayId_m(0), displayId_f(0), levelInfo(nullptr) { } uint32 mapId; uint32 areaId; @@ -286,7 +287,7 @@ struct PvPInfo struct DuelInfo { - DuelInfo() : initiator(NULL), opponent(NULL), startTimer(0), startTime(0), outOfBound(0), isMounted(false) { } + DuelInfo() : initiator(nullptr), opponent(nullptr), startTimer(0), startTime(0), outOfBound(0), isMounted(false) { } Player* initiator; Player* opponent; @@ -348,7 +349,7 @@ struct Runes struct EnchantDuration { - EnchantDuration() : item(NULL), slot(MAX_ENCHANTMENT_SLOT), leftduration(0) { } + EnchantDuration() : item(nullptr), slot(MAX_ENCHANTMENT_SLOT), leftduration(0) { } EnchantDuration(Item* _item, EnchantmentSlot _slot, uint32 _leftduration) : item(_item), slot(_slot), leftduration(_leftduration){ ASSERT(item); } @@ -854,7 +855,7 @@ struct InstancePlayerBind EXTENDED - won't be promoted to EXPIRED at next reset period, will instead be promoted to NORMAL */ BindExtensionState extendState; - InstancePlayerBind() : save(NULL), perm(false), extendState(EXTEND_STATE_NORMAL) { } + InstancePlayerBind() : save(nullptr), perm(false), extendState(EXTEND_STATE_NORMAL) { } }; struct AccessRequirement @@ -1022,6 +1023,8 @@ class Player : public Unit, public GridObject<Player> explicit Player(WorldSession* session); ~Player(); + PlayerAI* AI() const { return reinterpret_cast<PlayerAI*>(i_AI); } + void CleanupsBeforeDelete(bool finalCleanup = true) override; void AddToWorld() override; @@ -1058,12 +1061,12 @@ class Player : public Unit, public GridObject<Player> void SendInitialPacketsBeforeAddToMap(); void SendInitialPacketsAfterAddToMap(); - void SendSupercededSpell(uint32 oldSpell, uint32 newSpell); - void SendTransferAborted(uint32 mapid, TransferAbortReason reason, uint8 arg = 0); - void SendInstanceResetWarning(uint32 mapid, Difficulty difficulty, uint32 time, bool welcome); + void SendSupercededSpell(uint32 oldSpell, uint32 newSpell) const; + void SendTransferAborted(uint32 mapid, TransferAbortReason reason, uint8 arg = 0) const; + void SendInstanceResetWarning(uint32 mapid, Difficulty difficulty, uint32 time, bool welcome) const; - bool CanInteractWithQuestGiver(Object* questGiver); - Creature* GetNPCIfCanInteractWith(ObjectGuid const& guid, uint32 npcflagmask); + bool CanInteractWithQuestGiver(Object* questGiver) const; + Creature* GetNPCIfCanInteractWith(ObjectGuid const& guid, uint32 npcflagmask) const; GameObject* GetGameObjectIfCanInteractWith(ObjectGuid const& guid) const; GameObject* GetGameObjectIfCanInteractWith(ObjectGuid const& guid, GameobjectTypes type) const; @@ -1074,16 +1077,16 @@ class Player : public Unit, public GridObject<Player> uint8 GetChatTag() const; std::string autoReplyMsg; - uint32 GetBarberShopCost(uint8 newhairstyle, uint8 newhaircolor, uint8 newfacialhair, BarberShopStyleEntry const* newSkin=NULL); + uint32 GetBarberShopCost(uint8 newhairstyle, uint8 newhaircolor, uint8 newfacialhair, BarberShopStyleEntry const* newSkin = nullptr) const; - PlayerSocial *GetSocial() { return m_social; } + PlayerSocial *GetSocial() const { return m_social; } PlayerTaxi m_taxi; void InitTaxiNodesForLevel() { m_taxi.InitTaxiNodesForLevel(getRace(), getClass(), getLevel()); } - bool ActivateTaxiPathTo(std::vector<uint32> const& nodes, Creature* npc = NULL, uint32 spellid = 0); + bool ActivateTaxiPathTo(std::vector<uint32> const& nodes, Creature* npc = nullptr, uint32 spellid = 0); bool ActivateTaxiPathTo(uint32 taxi_path_id, uint32 spellid = 0); void CleanupAfterTaxiFlight(); - void ContinueTaxiFlight(); + void ContinueTaxiFlight() const; // mount_id can be used in scripting calls bool isAcceptWhispers() const { return (m_ExtraFlags & PLAYER_EXTRA_ACCEPT_WHISPERS) != 0; } void SetAcceptWhispers(bool on) { if (on) m_ExtraFlags |= PLAYER_EXTRA_ACCEPT_WHISPERS; else m_ExtraFlags &= ~PLAYER_EXTRA_ACCEPT_WHISPERS; } @@ -1150,8 +1153,8 @@ class Player : public Unit, public GridObject<Player> void SetVirtualItemSlot(uint8 i, Item* item); void SetSheath(SheathState sheathed) override; // overwrite Unit version uint8 FindEquipSlot(ItemTemplate const* proto, uint32 slot, bool swap) const; - uint32 GetItemCount(uint32 item, bool inBankAlso = false, Item* skipItem = NULL) const; - uint32 GetItemCountWithLimitCategory(uint32 limitCategory, Item* skipItem = NULL) const; + uint32 GetItemCount(uint32 item, bool inBankAlso = false, Item* skipItem = nullptr) const; + uint32 GetItemCountWithLimitCategory(uint32 limitCategory, Item* skipItem = nullptr) const; Item* GetItemByGuid(ObjectGuid guid) const; Item* GetItemByEntry(uint32 entry) const; Item* GetItemByPos(uint16 pos) const; @@ -1169,18 +1172,18 @@ class Player : public Unit, public GridObject<Player> static bool IsBagPos(uint16 pos); static bool IsBankPos(uint16 pos) { return IsBankPos(pos >> 8, pos & 255); } static bool IsBankPos(uint8 bag, uint8 slot); - bool IsValidPos(uint16 pos, bool explicit_pos) { return IsValidPos(pos >> 8, pos & 255, explicit_pos); } - bool IsValidPos(uint8 bag, uint8 slot, bool explicit_pos); + bool IsValidPos(uint16 pos, bool explicit_pos) const { return IsValidPos(pos >> 8, pos & 255, explicit_pos); } + bool IsValidPos(uint8 bag, uint8 slot, bool explicit_pos) const; uint8 GetBankBagSlotCount() const { return GetByteValue(PLAYER_BYTES_2, 2); } void SetBankBagSlotCount(uint8 count) { SetByteValue(PLAYER_BYTES_2, 2, count); } bool HasItemCount(uint32 item, uint32 count = 1, bool inBankAlso = false) const; - bool HasItemFitToSpellRequirements(SpellInfo const* spellInfo, Item const* ignoreItem = NULL) const; + bool HasItemFitToSpellRequirements(SpellInfo const* spellInfo, Item const* ignoreItem = nullptr) const; bool CanNoReagentCast(SpellInfo const* spellInfo) const; bool HasItemOrGemWithIdEquipped(uint32 item, uint32 count, uint8 except_slot = NULL_SLOT) const; bool HasItemOrGemWithLimitCategoryEquipped(uint32 limitCategory, uint32 count, uint8 except_slot = NULL_SLOT) const; InventoryResult CanTakeMoreSimilarItems(Item* pItem, uint32* itemLimitCategory = NULL) const { return CanTakeMoreSimilarItems(pItem->GetEntry(), pItem->GetCount(), pItem, NULL, itemLimitCategory); } InventoryResult CanTakeMoreSimilarItems(uint32 entry, uint32 count, uint32* itemLimitCategory = NULL) const { return CanTakeMoreSimilarItems(entry, count, NULL, NULL, itemLimitCategory); } - InventoryResult CanStoreNewItem(uint8 bag, uint8 slot, ItemPosCountVec& dest, uint32 item, uint32 count, uint32* no_space_count = NULL) const; + InventoryResult CanStoreNewItem(uint8 bag, uint8 slot, ItemPosCountVec& dest, uint32 item, uint32 count, uint32* no_space_count = nullptr) const; InventoryResult CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec& dest, Item* pItem, bool swap = false) const; InventoryResult CanStoreItems(Item** items, int count, uint32* itemLimitCategory) const; InventoryResult CanEquipNewItem(uint8 slot, uint16& dest, uint32 item, bool swap) const; @@ -1207,7 +1210,7 @@ class Player : public Unit, public GridObject<Player> void StoreLootItem(uint8 lootSlot, Loot* loot); InventoryResult CanTakeMoreSimilarItems(uint32 entry, uint32 count, Item* pItem, uint32* no_space_count = NULL, uint32* itemLimitCategory = NULL) const; - InventoryResult CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec& dest, uint32 entry, uint32 count, Item* pItem = NULL, bool swap = false, uint32* no_space_count = NULL) const; + InventoryResult CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec& dest, uint32 entry, uint32 count, Item* pItem = nullptr, bool swap = false, uint32* no_space_count = nullptr) const; void AddRefundReference(ObjectGuid it); void DeleteRefundReference(ObjectGuid it); @@ -1238,9 +1241,9 @@ class Player : public Unit, public GridObject<Player> Item* GetItemFromBuyBackSlot(uint32 slot); void RemoveItemFromBuyBackSlot(uint32 slot, bool del); uint32 GetMaxKeyringSize() const { return KEYRING_SLOT_END-KEYRING_SLOT_START; } - void SendEquipError(InventoryResult msg, Item* pItem, Item* pItem2 = NULL, uint32 itemid = 0); - void SendBuyError(BuyResult msg, Creature* creature, uint32 item, uint32 param); - void SendSellError(SellResult msg, Creature* creature, ObjectGuid guid, uint32 param); + void SendEquipError(InventoryResult msg, Item* pItem, Item* pItem2 = nullptr, uint32 itemid = 0) const; + void SendBuyError(BuyResult msg, Creature* creature, uint32 item, uint32 param) const; + void SendSellError(SellResult msg, Creature* creature, ObjectGuid guid, uint32 param) const; void AddWeaponProficiency(uint32 newflag) { m_WeaponProficiency |= newflag; } void AddArmorProficiency(uint32 newflag) { m_ArmorProficiency |= newflag; } uint32 GetWeaponProficiency() const { return m_WeaponProficiency; } @@ -1302,10 +1305,10 @@ class Player : public Unit, public GridObject<Player> void PrepareQuestMenu(ObjectGuid guid); void SendPreparedQuest(ObjectGuid guid); bool IsActiveQuest(uint32 quest_id) const; - Quest const* GetNextQuest(ObjectGuid guid, Quest const* quest); + Quest const* GetNextQuest(ObjectGuid guid, Quest const* quest) const; bool CanSeeStartQuest(Quest const* quest); bool CanTakeQuest(Quest const* quest, bool msg); - bool CanAddQuest(Quest const* quest, bool msg); + bool CanAddQuest(Quest const* quest, bool msg) const; bool CanCompleteQuest(uint32 quest_id); bool CanCompleteRepeatableQuest(Quest const* quest); bool CanRewardQuest(Quest const* quest, bool msg); @@ -1317,19 +1320,19 @@ class Player : public Unit, public GridObject<Player> void RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, bool announce = true); void FailQuest(uint32 quest_id); bool SatisfyQuestSkill(Quest const* qInfo, bool msg) const; - bool SatisfyQuestLevel(Quest const* qInfo, bool msg); - bool SatisfyQuestLog(bool msg); + bool SatisfyQuestLevel(Quest const* qInfo, bool msg) const; + bool SatisfyQuestLog(bool msg) const; bool SatisfyQuestPreviousQuest(Quest const* qInfo, bool msg); bool SatisfyQuestClass(Quest const* qInfo, bool msg) const; - bool SatisfyQuestRace(Quest const* qInfo, bool msg); + bool SatisfyQuestRace(Quest const* qInfo, bool msg) const; bool SatisfyQuestReputation(Quest const* qInfo, bool msg); - bool SatisfyQuestStatus(Quest const* qInfo, bool msg); + bool SatisfyQuestStatus(Quest const* qInfo, bool msg) const; bool SatisfyQuestConditions(Quest const* qInfo, bool msg); - bool SatisfyQuestTimed(Quest const* qInfo, bool msg); + bool SatisfyQuestTimed(Quest const* qInfo, bool msg) const; bool SatisfyQuestExclusiveGroup(Quest const* qInfo, bool msg); - bool SatisfyQuestNextChain(Quest const* qInfo, bool msg); + bool SatisfyQuestNextChain(Quest const* qInfo, bool msg) const; bool SatisfyQuestPrevChain(Quest const* qInfo, bool msg); - bool SatisfyQuestDay(Quest const* qInfo, bool msg); + bool SatisfyQuestDay(Quest const* qInfo, bool msg) const; bool SatisfyQuestWeek(Quest const* qInfo, bool msg); bool SatisfyQuestMonth(Quest const* qInfo, bool msg); bool SatisfyQuestSeasonal(Quest const* qInfo, bool msg); @@ -1364,7 +1367,7 @@ class Player : public Unit, public GridObject<Player> void SetQuestSlotTimer(uint16 slot, uint32 timer); void SwapQuestSlot(uint16 slot1, uint16 slot2); - uint16 GetReqKillOrCastCurrentCount(uint32 quest_id, int32 entry); + uint16 GetReqKillOrCastCurrentCount(uint32 quest_id, int32 entry) const; void AreaExploredOrEventHappens(uint32 questId); void GroupEventHappens(uint32 questId, WorldObject const* pEventObject); void ItemAddedQuestCheck(uint32 entry, uint32 count); @@ -1382,14 +1385,14 @@ class Player : public Unit, public GridObject<Player> void UpdateForQuestWorldObjects(); bool CanShareQuest(uint32 questId) const; - void SendQuestComplete(uint32 questId); - void SendQuestReward(Quest const* quest, uint32 XP); - void SendQuestFailed(uint32 questId, InventoryResult reason = EQUIP_ERR_OK); - void SendQuestTimerFailed(uint32 questId); + void SendQuestComplete(uint32 questId) const; + void SendQuestReward(Quest const* quest, uint32 XP) const; + void SendQuestFailed(uint32 questId, InventoryResult reason = EQUIP_ERR_OK) const; + void SendQuestTimerFailed(uint32 questId) const; void SendCanTakeQuestResponse(QuestFailedReason msg) const; - void SendQuestConfirmAccept(Quest const* quest, Player* pReceiver); - void SendPushToPartyResponse(Player* player, uint8 msg); - void SendQuestUpdateAddItem(Quest const* quest, uint32 itemIdx, uint16 count); + void SendQuestConfirmAccept(Quest const* quest, Player* pReceiver) const; + void SendPushToPartyResponse(Player* player, uint8 msg) const; + void SendQuestUpdateAddItem(Quest const* quest, uint32 itemIdx, uint16 count) const; void SendQuestUpdateAddCreatureOrGo(Quest const* quest, ObjectGuid guid, uint32 creatureOrGOIdx, uint16 oldCount, uint16 addCount); void SendQuestUpdateAddPlayer(Quest const* quest, uint16 oldCount, uint16 addCount); @@ -1427,10 +1430,9 @@ class Player : public Unit, public GridObject<Player> void SaveToDB(bool create = false); void SaveInventoryAndGoldToDB(SQLTransaction& trans); // fast save function for item/money cheating preventing - void SaveGoldToDB(SQLTransaction& trans); + void SaveGoldToDB(SQLTransaction& trans) const; static void SetUInt32ValueInArray(Tokenizer& data, uint16 index, uint32 value); - static void SetFloatValueInArray(Tokenizer& data, uint16 index, float value); static void Customize(CharacterCustomizeInfo const* customizeInfo, SQLTransaction& trans); static void SavePositionInDB(WorldLocation const& loc, uint16 zoneId, ObjectGuid guid, SQLTransaction& trans); @@ -1441,10 +1443,9 @@ class Player : public Unit, public GridObject<Player> bool m_mailsLoaded; bool m_mailsUpdated; - void SetBindPoint(ObjectGuid guid); - void SendTalentWipeConfirm(ObjectGuid guid); + void SetBindPoint(ObjectGuid guid) const; + void SendTalentWipeConfirm(ObjectGuid guid) const; void ResetPetTalents(); - void CalcRage(uint32 damage, bool attacker); void RegenerateAll(); void Regenerate(Powers power); void RegenerateHealth(); @@ -1472,13 +1473,13 @@ class Player : public Unit, public GridObject<Player> uint8 GetComboPoints() const { return m_comboPoints; } ObjectGuid GetComboTarget() const { return m_comboTarget; } - void AddComboPoints(Unit* target, int8 count, Spell* spell = NULL); + void AddComboPoints(Unit* target, int8 count, Spell* spell = nullptr); void GainSpellComboPoints(int8 count); void ClearComboPoints(); void SendComboPoints(); - void SendMailResult(uint32 mailId, MailResponseType mailAction, MailResponseResult mailError, uint32 equipError = 0, ObjectGuid::LowType item_guid = 0, uint32 item_count = 0); - void SendNewMail(); + void SendMailResult(uint32 mailId, MailResponseType mailAction, MailResponseResult mailError, uint32 equipError = 0, ObjectGuid::LowType item_guid = 0, uint32 item_count = 0) const; + void SendNewMail() const; void UpdateNextMailTimeAndUnreads(); void AddNewMailDeliverTime(time_t deliver_time); bool IsMailsLoaded() const { return m_mailsLoaded; } @@ -1509,19 +1510,19 @@ class Player : public Unit, public GridObject<Player> void AddMItem(Item* it); bool RemoveMItem(uint32 id); - void SendOnCancelExpectedVehicleRideAura(); + void SendOnCancelExpectedVehicleRideAura() const; void PetSpellInitialize(); void CharmSpellInitialize(); void PossessSpellInitialize(); void VehicleSpellInitialize(); - void SendRemoveControlBar(); + void SendRemoveControlBar() const; bool HasSpell(uint32 spell) const override; bool HasActiveSpell(uint32 spell) const; // show in spellbook TrainerSpellState GetTrainerSpellState(TrainerSpell const* trainer_spell) const; bool IsSpellFitByClassAndRace(uint32 spell_id) const; bool IsNeedCastPassiveSpellAtLearn(SpellInfo const* spellInfo) const; - void SendProficiency(ItemClass itemClass, uint32 itemSubclassMask); + void SendProficiency(ItemClass itemClass, uint32 itemSubclassMask) const; void SendInitialSpells(); bool AddSpell(uint32 spellId, bool active, bool learning, bool dependent, bool disabled, bool loading = false, uint32 fromSkill = 0); void LearnSpell(uint32 spell_id, bool dependent, uint32 fromSkill = 0); @@ -1537,7 +1538,7 @@ class Player : public Unit, public GridObject<Player> void RemoveTemporarySpell(uint32 spellId); void SetReputation(uint32 factionentry, uint32 value); uint32 GetReputation(uint32 factionentry) const; - std::string const& GetGuildName(); + std::string const& GetGuildName() const; uint32 GetFreeTalentPoints() const { return GetUInt32Value(PLAYER_CHARACTER_POINTS1); } void SetFreeTalentPoints(uint32 points); bool ResetTalents(bool no_cost = false); @@ -1576,18 +1577,18 @@ class Player : public Unit, public GridObject<Player> PlayerSpellMap & GetSpellMap() { return m_spells; } void AddSpellMod(SpellModifier* mod, bool apply); - bool IsAffectedBySpellmod(SpellInfo const* spellInfo, SpellModifier* mod, Spell* spell = NULL); - template <class T> T ApplySpellMod(uint32 spellId, SpellModOp op, T &basevalue, Spell* spell = NULL); + bool IsAffectedBySpellmod(SpellInfo const* spellInfo, SpellModifier* mod, Spell* spell = nullptr) const; + template <class T> T ApplySpellMod(uint32 spellId, SpellModOp op, T &basevalue, Spell* spell = nullptr); void RemoveSpellMods(Spell* spell); - void RestoreSpellMods(Spell* spell, uint32 ownerAuraId = 0, Aura* aura = NULL); - void RestoreAllSpellMods(uint32 ownerAuraId = 0, Aura* aura = NULL); + void RestoreSpellMods(Spell* spell, uint32 ownerAuraId = 0, Aura* aura = nullptr); + void RestoreAllSpellMods(uint32 ownerAuraId = 0, Aura* aura = nullptr); void DropModCharge(SpellModifier* mod, Spell* spell); void SetSpellModTakingSpell(Spell* spell, bool apply); void RemoveArenaSpellCooldowns(bool removeActivePetCooldowns = false); uint32 GetLastPotionId() const { return m_lastPotionId; } void SetLastPotionId(uint32 item_id) { m_lastPotionId = item_id; } - void UpdatePotionCooldown(Spell* spell = NULL); + void UpdatePotionCooldown(Spell* spell = nullptr); void setResurrectRequestData(ObjectGuid guid, uint32 mapId, float X, float Y, float Z, uint32 health, uint32 mana); void clearResurrectRequestData(); @@ -1595,7 +1596,7 @@ class Player : public Unit, public GridObject<Player> bool isResurrectRequested() const { return !m_resurrectGUID.IsEmpty(); } void ResurrectUsingRequestData(); - uint8 getCinematic() { return m_cinematic; } + uint8 getCinematic() const { return m_cinematic; } void setCinematic(uint8 cine) { m_cinematic = cine; } ActionButton* addActionButton(uint8 button, uint32 action, uint8 type); @@ -1603,11 +1604,11 @@ class Player : public Unit, public GridObject<Player> ActionButton const* GetActionButton(uint8 button); void SendInitialActionButtons() const { SendActionButtons(1); } void SendActionButtons(uint32 state) const; - bool IsActionButtonDataValid(uint8 button, uint32 action, uint8 type); + bool IsActionButtonDataValid(uint8 button, uint32 action, uint8 type) const; PvPInfo pvpInfo; void UpdatePvPState(bool onlyFFA = false); - void SetPvP(bool state); + void SetPvP(bool state) override; void UpdatePvP(bool state, bool override=false); void UpdateZone(uint32 newZone, uint32 newArea); void UpdateArea(uint32 newArea); @@ -1633,7 +1634,7 @@ class Player : public Unit, public GridObject<Player> bool IsInSameGroupWith(Player const* p) const; bool IsInSameRaidWith(Player const* p) const; void UninviteFromGroup(); - static void RemoveFromGroup(Group* group, ObjectGuid guid, RemoveMethod method = GROUP_REMOVEMETHOD_DEFAULT, ObjectGuid kicker = ObjectGuid::Empty, const char* reason = NULL); + static void RemoveFromGroup(Group* group, ObjectGuid guid, RemoveMethod method = GROUP_REMOVEMETHOD_DEFAULT, ObjectGuid kicker = ObjectGuid::Empty, const char* reason = nullptr); void RemoveFromGroup(RemoveMethod method = GROUP_REMOVEMETHOD_DEFAULT) { RemoveFromGroup(GetGroup(), GetGUID(), method); } void SendUpdateToOutOfRangeGroupMembers(); @@ -1700,13 +1701,13 @@ class Player : public Unit, public GridObject<Player> void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float& minDamage, float& maxDamage) override; void UpdateDefenseBonusesMod(); - inline void RecalculateRating(CombatRating cr) { ApplyRatingMod(cr, 0, true);} - float GetMeleeCritFromAgility(); - void GetDodgeFromAgility(float &diminishing, float &nondiminishing); + void RecalculateRating(CombatRating cr) { ApplyRatingMod(cr, 0, true);} + float GetMeleeCritFromAgility() const; + void GetDodgeFromAgility(float &diminishing, float &nondiminishing) const; float GetMissPercentageFromDefence() const; - float GetSpellCritFromIntellect(); - float OCTRegenHPPerSpirit(); - float OCTRegenMPPerSpirit(); + float GetSpellCritFromIntellect() const; + float OCTRegenHPPerSpirit() const; + float OCTRegenMPPerSpirit() const; float GetRatingMultiplier(CombatRating cr) const; float GetRatingBonusValue(CombatRating cr) const; uint32 GetBaseSpellPowerBonus() const { return m_baseSpellPower; } @@ -1744,26 +1745,26 @@ class Player : public Unit, public GridObject<Player> void BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) const override; void DestroyForPlayer(Player* target, bool onDeath = false) const override; - void SendLogXPGain(uint32 GivenXP, Unit* victim, uint32 BonusXP, bool recruitAFriend = false, float group_rate=1.0f); + void SendLogXPGain(uint32 GivenXP, Unit* victim, uint32 BonusXP, bool recruitAFriend = false, float group_rate=1.0f) const; // notifiers - void SendAttackSwingCantAttack(); - void SendAttackSwingCancelAttack(); - void SendAttackSwingDeadTarget(); - void SendAttackSwingNotInRange(); - void SendAttackSwingBadFacingAttack(); + void SendAttackSwingCantAttack() const; + void SendAttackSwingCancelAttack() const; + void SendAttackSwingDeadTarget() const; + void SendAttackSwingNotInRange() const; + void SendAttackSwingBadFacingAttack() const; void SendAutoRepeatCancel(Unit* target); - void SendExplorationExperience(uint32 Area, uint32 Experience); + void SendExplorationExperience(uint32 Area, uint32 Experience) const; - void SendDungeonDifficulty(bool IsInGroup); - void SendRaidDifficulty(bool IsInGroup, int32 forcedDifficulty = -1); + void SendDungeonDifficulty(bool IsInGroup) const; + void SendRaidDifficulty(bool IsInGroup, int32 forcedDifficulty = -1) const; void ResetInstances(uint8 method, bool isRaid); - void SendResetInstanceSuccess(uint32 MapId); - void SendResetInstanceFailed(uint32 reason, uint32 MapId); - void SendResetFailedNotify(uint32 mapid); + void SendResetInstanceSuccess(uint32 MapId) const; + void SendResetInstanceFailed(uint32 reason, uint32 MapId) const; + void SendResetFailedNotify(uint32 mapid) const; - virtual bool UpdatePosition(float x, float y, float z, float orientation, bool teleport = false) override; - bool UpdatePosition(const Position &pos, bool teleport = false) { return UpdatePosition(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), teleport); } + bool UpdatePosition(float x, float y, float z, float orientation, bool teleport = false) override; + bool UpdatePosition(const Position &pos, bool teleport = false) override { return UpdatePosition(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), teleport); } void UpdateUnderwaterState(Map* m, float x, float y, float z) override; void SendMessageToSet(WorldPacket* data, bool self) override { SendMessageToSetInRange(data, GetVisibilityRange(), self); } @@ -1804,11 +1805,11 @@ class Player : public Unit, public GridObject<Player> void UpdateMirrorTimers(); void StopMirrorTimers(); - bool IsMirrorTimerActive(MirrorTimerType type); + bool IsMirrorTimerActive(MirrorTimerType type) const; void SetMovement(PlayerMovementType pType); - bool CanJoinConstantChannelInZone(ChatChannelsEntry const* channel, AreaTableEntry const* zone); + bool CanJoinConstantChannelInZone(ChatChannelsEntry const* channel, AreaTableEntry const* zone) const; void JoinedChannel(Channel* c); void LeftChannel(Channel* c); @@ -1899,8 +1900,8 @@ class Player : public Unit, public GridObject<Player> uint32 GetDeathTimer() const { return m_deathTimer; } uint32 GetCorpseReclaimDelay(bool pvp) const; void UpdateCorpseReclaimDelay(); - int32 CalculateCorpseReclaimDelay(bool load = false); - void SendCorpseReclaimDelay(uint32 delay); + int32 CalculateCorpseReclaimDelay(bool load = false) const; + void SendCorpseReclaimDelay(uint32 delay) const; uint32 GetShieldBlockValue() const override; // overwrite Unit version (virtual) bool CanParry() const { return m_canParry; } @@ -1933,7 +1934,7 @@ class Player : public Unit, public GridObject<Player> void _ApplyItemBonuses(ItemTemplate const* proto, uint8 slot, bool apply, bool only_level_scale = false); void _ApplyWeaponDamage(uint8 slot, ItemTemplate const* proto, ScalingStatValuesEntry const* ssv, bool apply); void _ApplyAmmoBonuses(); - bool EnchantmentFitsRequirements(uint32 enchantmentcondition, int8 slot); + bool EnchantmentFitsRequirements(uint32 enchantmentcondition, int8 slot) const; void ToggleMetaGemsActive(uint8 exceptslot, bool apply); void CorrectMetaGemEnchants(uint8 slot, bool apply); void InitDataForForm(bool reapplyMods = false); @@ -1950,21 +1951,21 @@ class Player : public Unit, public GridObject<Player> void DeleteEquipmentSet(uint64 setGuid); void SendInitWorldStates(uint32 zone, uint32 area); - void SendUpdateWorldState(uint32 Field, uint32 Value); - void SendDirectMessage(WorldPacket* data); - void SendBGWeekendWorldStates(); - void SendBattlefieldWorldStates(); + void SendUpdateWorldState(uint32 Field, uint32 Value) const; + void SendDirectMessage(WorldPacket const* data) const; + void SendBGWeekendWorldStates() const; + void SendBattlefieldWorldStates() const; - void SendAurasForTarget(Unit* target); + void SendAurasForTarget(Unit* target) const; PlayerMenu* PlayerTalkClass; std::vector<ItemSetEffect*> ItemSetEff; void SendLoot(ObjectGuid guid, LootType loot_type); - void SendLootError(ObjectGuid guid, LootError error); - void SendLootRelease(ObjectGuid guid); - void SendNotifyLootItemRemoved(uint8 lootSlot); - void SendNotifyLootMoneyRemoved(); + void SendLootError(ObjectGuid guid, LootError error) const; + void SendLootRelease(ObjectGuid guid) const; + void SendNotifyLootItemRemoved(uint8 lootSlot) const; + void SendNotifyLootMoneyRemoved() const; /*********************************************************/ /*** BATTLEGROUND SYSTEM ***/ @@ -1985,7 +1986,7 @@ class Player : public Unit, public GridObject<Player> void SetBattlegroundId(uint32 val, BattlegroundTypeId bgTypeId); uint32 AddBattlegroundQueueId(BattlegroundQueueTypeId val); - bool HasFreeBattlegroundQueueId(); + bool HasFreeBattlegroundQueueId() const; void RemoveBattlegroundQueueId(BattlegroundQueueTypeId val); void SetInviteForBattlegroundQueueType(BattlegroundQueueTypeId bgQueueTypeId, uint32 instanceId); bool IsInvitedForBattlegroundInstance(uint32 instanceId) const; @@ -2002,10 +2003,10 @@ class Player : public Unit, public GridObject<Player> void ClearAfkReports() { m_bgData.bgAfkReporter.clear(); } bool GetBGAccessByLevel(BattlegroundTypeId bgTypeId) const; - bool isTotalImmunity(); - bool CanUseBattlegroundObject(GameObject* gameobject); - bool isTotalImmune(); - bool CanCaptureTowerPoint(); + bool isTotalImmunity() const; + bool CanUseBattlegroundObject(GameObject* gameobject) const; + bool isTotalImmune() const; + bool CanCaptureTowerPoint() const; bool GetRandomWinner() const { return m_IsBGRandomWinner; } void SetRandomWinner(bool isWinner); @@ -2016,13 +2017,13 @@ class Player : public Unit, public GridObject<Player> OutdoorPvP* GetOutdoorPvP() const; // returns true if the player is in active state for outdoor pvp objective capturing, false otherwise - bool IsOutdoorPvPActive(); + bool IsOutdoorPvPActive() const; /*********************************************************/ /*** ENVIROMENTAL SYSTEM ***/ /*********************************************************/ - bool IsImmuneToEnvironmentalDamage(); + bool IsImmuneToEnvironmentalDamage() const; uint32 EnvironmentalDamage(EnviromentalDamage type, uint32 damage); /*********************************************************/ @@ -2052,7 +2053,7 @@ class Player : public Unit, public GridObject<Player> void SetViewpoint(WorldObject* target, bool apply); WorldObject* GetViewpoint() const; void StopCastingCharm(); - void StopCastingBindSight(); + void StopCastingBindSight() const; uint32 GetSaveTimer() const { return m_nextSave; } void SetSaveTimer(uint32 timer) { m_nextSave = timer; } @@ -2085,7 +2086,7 @@ class Player : public Unit, public GridObject<Player> bool IsVisibleGloballyFor(Player const* player) const; - void SendInitialVisiblePackets(Unit* target); + void SendInitialVisiblePackets(Unit* target) const; void UpdateObjectVisibility(bool forced = true) override; void UpdateVisibilityForPlayer(); void UpdateVisibilityOf(WorldObject* target); @@ -2100,8 +2101,8 @@ class Player : public Unit, public GridObject<Player> void SetAtLoginFlag(AtLoginFlags f) { m_atLoginFlags |= f; } void RemoveAtLoginFlag(AtLoginFlags flags, bool persist = false); - bool isUsingLfg(); - bool inRandomLfgDungeon(); + bool isUsingLfg() const; + bool inRandomLfgDungeon() const; typedef std::set<uint32> DFQuestsDoneList; DFQuestsDoneList m_DFQuests; @@ -2113,8 +2114,8 @@ class Player : public Unit, public GridObject<Player> void ResummonPetTemporaryUnSummonedIfAny(); bool IsPetNeedBeTemporaryUnsummoned() const; - void SendCinematicStart(uint32 CinematicSequenceId); - void SendMovieStart(uint32 MovieId); + void SendCinematicStart(uint32 CinematicSequenceId) const; + void SendMovieStart(uint32 MovieId) const; /*********************************************************/ /*** INSTANCE SYSTEM ***/ @@ -2152,10 +2153,10 @@ class Player : public Unit, public GridObject<Player> /*** GROUP SYSTEM ***/ /*********************************************************/ - Group* GetGroupInvite() { return m_groupInvite; } + Group* GetGroupInvite() const { return m_groupInvite; } void SetGroupInvite(Group* group) { m_groupInvite = group; } Group* GetGroup() { return m_group.getTarget(); } - const Group* GetGroup() const { return (const Group*)m_group.getTarget(); } + Group const* GetGroup() const { return const_cast<Group const*>(m_group.getTarget()); } GroupReference& GetGroupRef() { return m_group; } void SetGroup(Group* group, int8 subgroup = -1); uint8 GetSubGroup() const { return m_group.getSubGroup(); } @@ -2169,7 +2170,7 @@ class Player : public Unit, public GridObject<Player> // Battleground / Battlefield Group System void SetBattlegroundOrBattlefieldRaid(Group* group, int8 subgroup = -1); void RemoveFromBattlegroundOrBattlefieldRaid(); - Group* GetOriginalGroup() { return m_originalGroup.getTarget(); } + Group* GetOriginalGroup() const { return m_originalGroup.getTarget(); } GroupReference& GetOriginalGroupRef() { return m_originalGroup; } uint8 GetOriginalSubGroup() const { return m_originalGroup.getSubGroup(); } void SetOriginalGroup(Group* group, int8 subgroup = -1); @@ -2202,8 +2203,8 @@ class Player : public Unit, public GridObject<Player> void RemoveRunesByAuraEffect(AuraEffect const* aura); void RestoreBaseRune(uint8 index); void ConvertRune(uint8 index, RuneType newType); - void ResyncRunes(uint8 count); - void AddRunePower(uint8 index); + void ResyncRunes(uint8 count) const; + void AddRunePower(uint8 index) const; void InitRunes(); void SendRespondInspectAchievements(Player* player) const; @@ -2227,7 +2228,7 @@ class Player : public Unit, public GridObject<Player> void SetChampioningFaction(uint32 faction) { m_ChampioningFaction = faction; } Spell* m_spellModTakingSpell; - float GetAverageItemLevel(); + float GetAverageItemLevel() const; bool isDebugAreaTriggers; void ClearWhisperWhiteList() { WhisperList.clear(); } @@ -2246,8 +2247,8 @@ class Player : public Unit, public GridObject<Player> //! Return collision height sent to client float GetCollisionHeight(bool mounted) const; - std::string GetMapAreaAndZoneString(); - std::string GetCoordsMapAreaAndZoneString(); + std::string GetMapAreaAndZoneString() const; + std::string GetCoordsMapAreaAndZoneString() const; protected: // Gamemaster whisper whitelist @@ -2338,9 +2339,9 @@ class Player : public Unit, public GridObject<Player> void _SaveSpells(SQLTransaction& trans); void _SaveEquipmentSets(SQLTransaction& trans); void _SaveBGData(SQLTransaction& trans); - void _SaveGlyphs(SQLTransaction& trans); + void _SaveGlyphs(SQLTransaction& trans) const; void _SaveTalents(SQLTransaction& trans); - void _SaveStats(SQLTransaction& trans); + void _SaveStats(SQLTransaction& trans) const; void _SaveInstanceTimeRestrictions(SQLTransaction& trans); /*********************************************************/ @@ -2350,7 +2351,7 @@ class Player : public Unit, public GridObject<Player> void SendMirrorTimer(MirrorTimerType Type, uint32 MaxValue, uint32 CurrentValue, int32 Regen); void StopMirrorTimer(MirrorTimerType Type); void HandleDrowning(uint32 time_diff); - int32 getMaxTimer(MirrorTimerType timer); + int32 getMaxTimer(MirrorTimerType timer) const; /*********************************************************/ /*** HONOR SYSTEM ***/ @@ -2533,8 +2534,6 @@ class Player : public Unit, public GridObject<Player> MapReference m_mapRef; - void UpdateCharmedAI(); - uint32 m_lastFallTime; float m_lastFallZ; diff --git a/src/server/game/Entities/Player/SocialMgr.cpp b/src/server/game/Entities/Player/SocialMgr.cpp index ffb2d8a7dd8..809bdd0bf6f 100644 --- a/src/server/game/Entities/Player/SocialMgr.cpp +++ b/src/server/game/Entities/Player/SocialMgr.cpp @@ -195,6 +195,12 @@ SocialMgr::SocialMgr() { } SocialMgr::~SocialMgr() { } +SocialMgr* SocialMgr::instance() +{ + static SocialMgr instance; + return &instance; +} + void SocialMgr::GetFriendInfo(Player* player, ObjectGuid::LowType friendGUID, FriendInfo &friendInfo) { if (!player) diff --git a/src/server/game/Entities/Player/SocialMgr.h b/src/server/game/Entities/Player/SocialMgr.h index 8f8ed04b5fb..0512e61033c 100644 --- a/src/server/game/Entities/Player/SocialMgr.h +++ b/src/server/game/Entities/Player/SocialMgr.h @@ -128,11 +128,7 @@ class SocialMgr ~SocialMgr(); public: - static SocialMgr* instance() - { - static SocialMgr instance; - return &instance; - } + static SocialMgr* instance(); // Misc void RemovePlayerSocial(ObjectGuid::LowType guid) { m_socialMap.erase(guid); } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index c21301c27b2..6711ed2d157 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -45,6 +45,7 @@ #include "PetAI.h" #include "Pet.h" #include "Player.h" +#include "PlayerAI.h" #include "QuestDef.h" #include "ReputationMgr.h" #include "SpellAuraEffects.h" @@ -3748,6 +3749,77 @@ void Unit::RemoveAura(Aura* aura, AuraRemoveMode mode) RemoveAura(aurApp, mode); } +void Unit::RemoveAppliedAuras(std::function<bool(AuraApplication const*)> const& check) +{ + for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();) + { + if (check(iter->second)) + { + RemoveAura(iter); + continue; + } + ++iter; + } +} + +void Unit::RemoveOwnedAuras(std::function<bool(Aura const*)> const& check) +{ + for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();) + { + if (check(iter->second)) + { + RemoveOwnedAura(iter); + continue; + } + ++iter; + } +} + +void Unit::RemoveAppliedAuras(uint32 spellId, std::function<bool(AuraApplication const*)> const& check) +{ + for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);) + { + if (check(iter->second)) + { + RemoveAura(iter); + continue; + } + ++iter; + } +} + +void Unit::RemoveOwnedAuras(uint32 spellId, std::function<bool(Aura const*)> const& check) +{ + for (AuraMap::iterator iter = m_ownedAuras.lower_bound(spellId); iter != m_ownedAuras.upper_bound(spellId);) + { + if (check(iter->second)) + { + RemoveOwnedAura(iter); + continue; + } + ++iter; + } +} + +void Unit::RemoveAurasByType(AuraType auraType, std::function<bool(AuraApplication const*)> const& check) +{ + for (AuraEffectList::iterator iter = m_modAuras[auraType].begin(); iter != m_modAuras[auraType].end();) + { + Aura* aura = (*iter)->GetBase(); + AuraApplication * aurApp = aura->GetApplicationOfTarget(GetGUID()); + ASSERT(aurApp); + + ++iter; + if (check(aurApp)) + { + uint32 removedAuras = m_removedAurasCount; + RemoveAura(aurApp); + if (m_removedAurasCount > removedAuras + 1) + iter = m_modAuras[auraType].begin(); + } + } +} + void Unit::RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID, uint8 reqEffMask, AuraRemoveMode removeMode) { for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);) @@ -8980,10 +9052,10 @@ bool Unit::Attack(Unit* victim, bool meleeAttack) if (GetTypeId() == TYPEID_UNIT && !IsPet()) { // should not let player enter combat by right clicking target - doesn't helps + AddThreat(victim, 0.0f); SetInCombatWith(victim); if (victim->GetTypeId() == TYPEID_PLAYER) victim->SetInCombatWith(this); - AddThreat(victim, 0.0f); ToCreature()->SendAIReaction(AI_REACTION_HOSTILE); ToCreature()->CallAssistance(); @@ -9227,7 +9299,7 @@ Unit* Unit::GetCharmer() const if (ObjectGuid charmerGUID = GetCharmerGUID()) return ObjectAccessor::GetUnit(*this, charmerGUID); - return NULL; + return nullptr; } Player* Unit::GetCharmerOrOwnerPlayerOrPlayerItself() const @@ -12341,7 +12413,7 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced) if (Creature* creature = ToCreature()) { uint32 immuneMask = creature->GetCreatureTemplate()->MechanicImmuneMask; - if (immuneMask & (1 << MECHANIC_SNARE) || immuneMask & (1 << MECHANIC_DAZE)) + if (immuneMask & (1 << (MECHANIC_SNARE - 1)) || immuneMask & (1 << (MECHANIC_DAZE - 1))) break; } @@ -12433,6 +12505,7 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced) return; } + data << GetPackGUID(); BuildMovementPacket(&data); data << float(GetSpeed(mtype)); SendMessageToSet(&data, true); @@ -13652,28 +13725,76 @@ void Unit::CleanupsBeforeDelete(bool finalCleanup) void Unit::UpdateCharmAI() { - if (GetTypeId() == TYPEID_PLAYER) - return; - - if (i_disabledAI) // disabled AI must be primary AI - { - if (!IsCharmed()) - { - delete i_AI; - i_AI = i_disabledAI; - i_disabledAI = NULL; - } - } - else + switch (GetTypeId()) { - if (IsCharmed()) + case TYPEID_UNIT: + if (i_disabledAI) // disabled AI must be primary AI + { + if (!IsCharmed()) + { + delete i_AI; + i_AI = i_disabledAI; + i_disabledAI = nullptr; + } + } + else + { + if (IsCharmed()) + { + i_disabledAI = i_AI; + if (isPossessed() || IsVehicle()) + i_AI = new PossessedAI(ToCreature()); + else + i_AI = new PetAI(ToCreature()); + } + } + break; + case TYPEID_PLAYER: { - i_disabledAI = i_AI; - if (isPossessed() || IsVehicle()) - i_AI = new PossessedAI(ToCreature()); + if (IsCharmed()) // if we are currently being charmed, then we should apply charm AI + { + i_disabledAI = i_AI; + + UnitAI* newAI = nullptr; + // first, we check if the creature's own AI specifies an override playerai for its owned players + if (Unit* charmer = GetCharmer()) + { + if (Creature* creatureCharmer = charmer->ToCreature()) + { + if (PlayerAI* charmAI = creatureCharmer->IsAIEnabled ? creatureCharmer->AI()->GetAIForCharmedPlayer(ToPlayer()) : nullptr) + newAI = charmAI; + } + else + { + TC_LOG_ERROR("misc", "Attempt to assign charm AI to player %s who is charmed by non-creature %s.", GetGUID().ToString().c_str(), GetCharmerGUID().ToString().c_str()); + } + } + if (!newAI) // otherwise, we default to the generic one + newAI = new SimpleCharmedPlayerAI(ToPlayer()); + i_AI = newAI; + } else - i_AI = new PetAI(ToCreature()); + { + if (i_AI) + { + // we allow the charmed PlayerAI to clean up + i_AI->OnCharmed(false); + // then delete it + delete i_AI; + } + else + { + TC_LOG_ERROR("misc", "Attempt to remove charm AI from player %s who doesn't currently have charm AI.", GetGUID().ToString().c_str()); + } + // and restore our previous PlayerAI (if we had one) + i_AI = i_disabledAI; + i_disabledAI = nullptr; + // IsAIEnabled gets handled in the caller + } + break; } + default: + TC_LOG_ERROR("misc", "Attempt to update charm AI for unit %s, which is neither player nor creature.", GetGUID().ToString().c_str()); } } @@ -15902,11 +16023,17 @@ bool Unit::SetCharmedBy(Unit* charmer, CharmType type, AuraApplication const* au ToCreature()->AI()->OnCharmed(true); GetMotionMaster()->MoveIdle(); } - else + else if (Player* player = ToPlayer()) { - Player* player = ToPlayer(); if (player->isAFK()) player->ToggleAFK(); + + if (charmer->GetTypeId() == TYPEID_UNIT) // we are charmed by a creature + { + // change AI to charmed AI on next Update tick + NeedChangeAI = true; + IsAIEnabled = false; + } player->SetClientControl(this, false); } @@ -16064,7 +16191,14 @@ void Unit::RemoveCharmedBy(Unit* charmer) } if (Player* player = ToPlayer()) + { + if (charmer->GetTypeId() == TYPEID_UNIT) // charmed by a creature, this means we had PlayerAI + { + NeedChangeAI = true; + IsAIEnabled = false; + } player->SetClientControl(this, true); + } // a guardian should always have charminfo if (playerCharmer && this != charmer->GetFirstControlled()) diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 4565160dc93..0c4ee979748 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -586,7 +586,7 @@ enum DamageEffectType }; // Value masks for UNIT_FIELD_FLAGS -enum UnitFlags +enum UnitFlags : uint32 { UNIT_FLAG_SERVER_CONTROLLED = 0x00000001, // set only when unit movement is controlled by server - by SPLINE/MONSTER_MOVE packets, together with UNIT_FLAG_STUNNED; only set to units controlled by client; client function CGUnit_C::IsClientControlled returns false when set for owner UNIT_FLAG_NON_ATTACKABLE = 0x00000002, // not attackable @@ -1383,7 +1383,8 @@ class Unit : public WorldObject bool IsContestedGuard() const; bool IsPvP() const { return HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_PVP); } bool IsFFAPvP() const { return HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP); } - void SetPvP(bool state); + virtual void SetPvP(bool state); + uint32 GetCreatureType() const; uint32 GetCreatureTypeMask() const; @@ -1561,7 +1562,7 @@ class Unit : public WorldObject void SendTeleportPacket(Position& pos); virtual bool UpdatePosition(float x, float y, float z, float ang, bool teleport = false); // returns true if unit's position really changed - bool UpdatePosition(const Position &pos, bool teleport = false); + virtual bool UpdatePosition(const Position &pos, bool teleport = false); void UpdateOrientation(float orientation); void UpdateHeight(float newZ); @@ -1704,6 +1705,16 @@ class Unit : public WorldObject void RemoveAura(AuraApplication * aurApp, AuraRemoveMode mode = AURA_REMOVE_BY_DEFAULT); void RemoveAura(Aura* aur, AuraRemoveMode mode = AURA_REMOVE_BY_DEFAULT); + // Convenience methods removing auras by predicate + void RemoveAppliedAuras(std::function<bool(AuraApplication const*)> const& check); + void RemoveOwnedAuras(std::function<bool(Aura const*)> const& check); + + // Optimized overloads taking advantage of map key + void RemoveAppliedAuras(uint32 spellId, std::function<bool(AuraApplication const*)> const& check); + void RemoveOwnedAuras(uint32 spellId, std::function<bool(Aura const*)> const& check); + + void RemoveAurasByType(AuraType auraType, std::function<bool(AuraApplication const*)> const& check); + void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID = ObjectGuid::Empty, uint8 reqEffMask = 0, AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT); void RemoveAuraFromStack(uint32 spellId, ObjectGuid casterGUID = ObjectGuid::Empty, AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT); void RemoveAurasDueToSpellByDispel(uint32 spellId, uint32 dispellerSpellId, ObjectGuid casterGUID, Unit* dispeller, uint8 chargesRemoved = 1); diff --git a/src/server/game/Events/GameEventMgr.cpp b/src/server/game/Events/GameEventMgr.cpp index b2871786034..bb8e89d4829 100644 --- a/src/server/game/Events/GameEventMgr.cpp +++ b/src/server/game/Events/GameEventMgr.cpp @@ -29,6 +29,12 @@ #include "UnitAI.h" #include "GameObjectAI.h" +GameEventMgr* GameEventMgr::instance() +{ + static GameEventMgr instance; + return &instance; +} + bool GameEventMgr::CheckOneGameEvent(uint16 entry) const { switch (mGameEvent[entry].state) @@ -221,7 +227,7 @@ void GameEventMgr::LoadFromDB() uint8 event_id = fields[0].GetUInt8(); if (event_id == 0) { - TC_LOG_ERROR("sql.sql", "`game_event` game event entry 0 is reserved and can't be used."); + TC_LOG_ERROR("sql.sql", "`game_event`: game event entry 0 is reserved and can't be used."); continue; } @@ -240,7 +246,7 @@ void GameEventMgr::LoadFromDB() if (pGameEvent.length == 0 && pGameEvent.state == GAMEEVENT_NORMAL) // length>0 is validity check { - TC_LOG_ERROR("sql.sql", "`game_event` game event id (%i) isn't a world event and has length = 0, thus it can't be used.", event_id); + TC_LOG_ERROR("sql.sql", "`game_event`: game event id (%i) is not a world event and has length = 0, thus cannot be used.", event_id); continue; } @@ -248,7 +254,7 @@ void GameEventMgr::LoadFromDB() { if (!sHolidaysStore.LookupEntry(pGameEvent.holiday_id)) { - TC_LOG_ERROR("sql.sql", "`game_event` game event id (%i) have not existed holiday id %u.", event_id, pGameEvent.holiday_id); + TC_LOG_ERROR("sql.sql", "`game_event`: game event id (%i) contains nonexisting holiday id %u.", event_id, pGameEvent.holiday_id); pGameEvent.holiday_id = HOLIDAY_NONE; } } @@ -259,7 +265,7 @@ void GameEventMgr::LoadFromDB() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u game events in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u game events in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } @@ -283,7 +289,7 @@ void GameEventMgr::LoadFromDB() if (event_id >= mGameEvent.size()) { - TC_LOG_ERROR("sql.sql", "`game_event_save` game event entry (%i) is out of range compared to max event entry in `game_event`", event_id); + TC_LOG_ERROR("sql.sql", "`game_event_save`: game event entry (%i) is out of range compared to max event entry in `game_event`.", event_id); continue; } @@ -294,7 +300,7 @@ void GameEventMgr::LoadFromDB() } else { - TC_LOG_ERROR("sql.sql", "game_event_save includes event save for non-worldevent id %u", event_id); + TC_LOG_ERROR("sql.sql", "game_event_save includes event save for non-worldevent id %u.", event_id); continue; } @@ -302,7 +308,7 @@ void GameEventMgr::LoadFromDB() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u game event saves in game events in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u game event saves in game events in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } } @@ -326,7 +332,7 @@ void GameEventMgr::LoadFromDB() if (event_id >= mGameEvent.size()) { - TC_LOG_ERROR("sql.sql", "`game_event_prerequisite` game event id (%i) is out of range compared to max event id in `game_event`", event_id); + TC_LOG_ERROR("sql.sql", "`game_event_prerequisite`: game event id (%i) is out of range compared to max event id in `game_event`.", event_id); continue; } @@ -335,14 +341,14 @@ void GameEventMgr::LoadFromDB() uint16 prerequisite_event = fields[1].GetUInt32(); if (prerequisite_event >= mGameEvent.size()) { - TC_LOG_ERROR("sql.sql", "`game_event_prerequisite` game event prerequisite id (%i) is out of range compared to max event id in `game_event`", prerequisite_event); + TC_LOG_ERROR("sql.sql", "`game_event_prerequisite`: game event prerequisite id (%i) is out of range compared to max event id in `game_event`.", prerequisite_event); continue; } mGameEvent[event_id].prerequisite_events.insert(prerequisite_event); } else { - TC_LOG_ERROR("sql.sql", "game_event_prerequisiste includes event entry for non-worldevent id %u", event_id); + TC_LOG_ERROR("sql.sql", "game_event_prerequisiste includes event entry for non-worldevent id %u.", event_id); continue; } @@ -350,7 +356,7 @@ void GameEventMgr::LoadFromDB() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u game event prerequisites in game events in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u game event prerequisites in game events in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } } @@ -363,7 +369,7 @@ void GameEventMgr::LoadFromDB() QueryResult result = WorldDatabase.Query("SELECT guid, eventEntry FROM game_event_creature"); if (!result) - TC_LOG_INFO("server.loading", ">> Loaded 0 creatures in game events. DB table `game_event_creature` is empty"); + TC_LOG_INFO("server.loading", ">> Loaded 0 creatures in game events. DB table `game_event_creature` is empty."); else { uint32 count = 0; @@ -385,7 +391,7 @@ void GameEventMgr::LoadFromDB() if (internal_event_id < 0 || internal_event_id >= int32(mGameEventCreatureGuids.size())) { - TC_LOG_ERROR("sql.sql", "`game_event_creature` game event id (%i) is out of range compared to max event id in `game_event`", event_id); + TC_LOG_ERROR("sql.sql", "`game_event_creature`: game event id (%i) is out of range compared to max event id in `game_event`.", event_id); continue; } @@ -396,7 +402,7 @@ void GameEventMgr::LoadFromDB() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u creatures in game events in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u creatures in game events in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } } @@ -431,7 +437,7 @@ void GameEventMgr::LoadFromDB() if (internal_event_id < 0 || internal_event_id >= int32(mGameEventGameobjectGuids.size())) { - TC_LOG_ERROR("sql.sql", "`game_event_gameobject` game event id (%i) is out of range compared to max event id in `game_event`", event_id); + TC_LOG_ERROR("sql.sql", "`game_event_gameobject`: game event id (%i) is out of range compared to max event id in `game_event`.", event_id); continue; } @@ -442,7 +448,7 @@ void GameEventMgr::LoadFromDB() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u gameobjects in game events in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u gameobjects in game events in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } } @@ -469,7 +475,7 @@ void GameEventMgr::LoadFromDB() if (event_id >= mGameEventModelEquip.size()) { - TC_LOG_ERROR("sql.sql", "`game_event_model_equip` game event id (%u) is out of range compared to max event id in `game_event`", event_id); + TC_LOG_ERROR("sql.sql", "`game_event_model_equip`: game event id (%u) is out of range compared to max event id in `game_event`.", event_id); continue; } @@ -485,7 +491,7 @@ void GameEventMgr::LoadFromDB() int8 equipId = static_cast<int8>(newModelEquipSet.equipment_id); if (!sObjectMgr->GetEquipmentInfo(entry, equipId)) { - TC_LOG_ERROR("sql.sql", "Table `game_event_model_equip` have creature (Guid: %u, entry: %u) with equipment_id %u not found in table `creature_equip_template`, set to no equipment.", + TC_LOG_ERROR("sql.sql", "Table `game_event_model_equip` contains creature (Guid: %u, entry: %u) with equipment_id %u not found in table `creature_equip_template`. Setting entry to no equipment.", guid, entry, newModelEquipSet.equipment_id); continue; } @@ -497,7 +503,7 @@ void GameEventMgr::LoadFromDB() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u model/equipment changes in game events in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u model/equipment changes in game events in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } } @@ -523,7 +529,7 @@ void GameEventMgr::LoadFromDB() if (event_id >= mGameEventCreatureQuests.size()) { - TC_LOG_ERROR("sql.sql", "`game_event_creature_quest` game event id (%u) is out of range compared to max event id in `game_event`", event_id); + TC_LOG_ERROR("sql.sql", "`game_event_creature_quest`: game event id (%u) is out of range compared to max event id in `game_event`.", event_id); continue; } @@ -534,7 +540,7 @@ void GameEventMgr::LoadFromDB() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u quests additions in game events in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u quests additions in game events in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } } @@ -560,7 +566,7 @@ void GameEventMgr::LoadFromDB() if (event_id >= mGameEventGameObjectQuests.size()) { - TC_LOG_ERROR("sql.sql", "`game_event_gameobject_quest` game event id (%u) is out of range compared to max event id in `game_event`", event_id); + TC_LOG_ERROR("sql.sql", "`game_event_gameobject_quest`: game event id (%u) is out of range compared to max event id in `game_event`.", event_id); continue; } @@ -571,7 +577,7 @@ void GameEventMgr::LoadFromDB() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u quests additions in game events in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u quests additions in game events in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } } @@ -598,7 +604,7 @@ void GameEventMgr::LoadFromDB() if (event_id >= mGameEvent.size()) { - TC_LOG_ERROR("sql.sql", "`game_event_quest_condition` game event id (%u) is out of range compared to max event id in `game_event`", event_id); + TC_LOG_ERROR("sql.sql", "`game_event_quest_condition`: game event id (%u) is out of range compared to max event id in `game_event`.", event_id); continue; } @@ -610,7 +616,7 @@ void GameEventMgr::LoadFromDB() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u quest event conditions in game events in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u quest event conditions in game events in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } } @@ -635,7 +641,7 @@ void GameEventMgr::LoadFromDB() if (event_id >= mGameEvent.size()) { - TC_LOG_ERROR("sql.sql", "`game_event_condition` game event id (%u) is out of range compared to max event id in `game_event`", event_id); + TC_LOG_ERROR("sql.sql", "`game_event_condition`: game event id (%u) is out of range compared to max event id in `game_event`.", event_id); continue; } @@ -648,7 +654,7 @@ void GameEventMgr::LoadFromDB() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u conditions in game events in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u conditions in game events in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } } @@ -673,7 +679,7 @@ void GameEventMgr::LoadFromDB() if (event_id >= mGameEvent.size()) { - TC_LOG_ERROR("sql.sql", "`game_event_condition_save` game event id (%u) is out of range compared to max event id in `game_event`", event_id); + TC_LOG_ERROR("sql.sql", "`game_event_condition_save`: game event id (%u) is out of range compared to max event id in `game_event`.", event_id); continue; } @@ -684,7 +690,7 @@ void GameEventMgr::LoadFromDB() } else { - TC_LOG_ERROR("sql.sql", "game_event_condition_save contains not present condition evt id %u cond id %u", event_id, condition); + TC_LOG_ERROR("sql.sql", "game_event_condition_save contains not present condition event id %u condition id %u.", event_id, condition); continue; } @@ -692,7 +698,7 @@ void GameEventMgr::LoadFromDB() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u condition saves in game events in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u condition saves in game events in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } } @@ -718,7 +724,7 @@ void GameEventMgr::LoadFromDB() if (event_id >= mGameEvent.size()) { - TC_LOG_ERROR("sql.sql", "`game_event_npcflag` game event id (%u) is out of range compared to max event id in `game_event`", event_id); + TC_LOG_ERROR("sql.sql", "`game_event_npcflag`: game event id (%u) is out of range compared to max event id in `game_event`.", event_id); continue; } @@ -728,7 +734,7 @@ void GameEventMgr::LoadFromDB() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u npcflags in game events in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u npcflags in game events in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } } @@ -753,13 +759,13 @@ void GameEventMgr::LoadFromDB() if (!sObjectMgr->GetQuestTemplate(questId)) { - TC_LOG_ERROR("sql.sql", "`game_event_seasonal_questrelation` quest id (%u) does not exist in `quest_template`", questId); + TC_LOG_ERROR("sql.sql", "`game_event_seasonal_questrelation`: quest id (%u) does not exist in `quest_template`.", questId); continue; } if (eventEntry >= mGameEvent.size()) { - TC_LOG_ERROR("sql.sql", "`game_event_seasonal_questrelation` event id (%u) is out of range compared to max event in `game_event`", eventEntry); + TC_LOG_ERROR("sql.sql", "`game_event_seasonal_questrelation`: event id (%u) is out of range compared to max event in `game_event`.", eventEntry); continue; } @@ -768,7 +774,7 @@ void GameEventMgr::LoadFromDB() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u quests additions in game events in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u quests additions in game events in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } } @@ -792,7 +798,7 @@ void GameEventMgr::LoadFromDB() if (event_id >= mGameEventVendors.size()) { - TC_LOG_ERROR("sql.sql", "`game_event_npc_vendor` game event id (%u) is out of range compared to max event id in `game_event`", event_id); + TC_LOG_ERROR("sql.sql", "`game_event_npc_vendor`: game event id (%u) is out of range compared to max event id in `game_event`.", event_id); continue; } @@ -830,7 +836,7 @@ void GameEventMgr::LoadFromDB() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u vendor additions in game events in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u vendor additions in game events in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } } @@ -854,7 +860,7 @@ void GameEventMgr::LoadFromDB() if (event_id >= mGameEvent.size()) { - TC_LOG_ERROR("sql.sql", "`game_event_battleground_holiday` game event id (%u) is out of range compared to max event id in `game_event`", event_id); + TC_LOG_ERROR("sql.sql", "`game_event_battleground_holiday`: game event id (%u) is out of range compared to max event id in `game_event`.", event_id); continue; } @@ -864,7 +870,7 @@ void GameEventMgr::LoadFromDB() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u battleground holidays in game events in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u battleground holidays in game events in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } } @@ -892,13 +898,13 @@ void GameEventMgr::LoadFromDB() if (internal_event_id < 0 || internal_event_id >= int32(mGameEventPoolIds.size())) { - TC_LOG_ERROR("sql.sql", "`game_event_pool` game event id (%i) is out of range compared to max event id in `game_event`", event_id); + TC_LOG_ERROR("sql.sql", "`game_event_pool`: game event id (%i) is out of range compared to max event id in `game_event`.", event_id); continue; } if (!sPoolMgr->CheckPool(entry)) { - TC_LOG_ERROR("sql.sql", "Pool Id (%u) has all creatures or gameobjects with explicit chance sum <>100 and no equal chance defined. The pool system cannot pick one to spawn.", entry); + TC_LOG_ERROR("sql.sql", "Pool Id (%u) has all creatures or gameobjects with explicit chance sum <> 100 and no equal chance defined. The pool system cannot pick one to spawn.", entry); continue; } @@ -909,7 +915,7 @@ void GameEventMgr::LoadFromDB() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u pools for game events in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u pools for game events in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } } } @@ -971,7 +977,7 @@ void GameEventMgr::StartArenaSeason() if (!result) { - TC_LOG_ERROR("gameevent", "ArenaSeason (%u) must be an existant Arena Season", season); + TC_LOG_ERROR("gameevent", "ArenaSeason (%u) must be an existing Arena Season.", season); return; } @@ -980,7 +986,7 @@ void GameEventMgr::StartArenaSeason() if (eventId >= mGameEvent.size()) { - TC_LOG_ERROR("gameevent", "EventEntry %u for ArenaSeason (%u) does not exists", eventId, season); + TC_LOG_ERROR("gameevent", "EventEntry %u for ArenaSeason (%u) does not exist.", eventId, season); return; } @@ -1171,7 +1177,7 @@ void GameEventMgr::GameEventSpawn(int16 event_id) if (internal_event_id < 0 || internal_event_id >= int32(mGameEventCreatureGuids.size())) { - TC_LOG_ERROR("gameevent", "GameEventMgr::GameEventSpawn attempt access to out of range mGameEventCreatureGuids element %i (size: %zu)", + TC_LOG_ERROR("gameevent", "GameEventMgr::GameEventSpawn attempted access to out of range mGameEventCreatureGuids element %i (size: %zu).", internal_event_id, mGameEventCreatureGuids.size()); return; } @@ -1198,7 +1204,7 @@ void GameEventMgr::GameEventSpawn(int16 event_id) if (internal_event_id < 0 || internal_event_id >= int32(mGameEventGameobjectGuids.size())) { - TC_LOG_ERROR("gameevent", "GameEventMgr::GameEventSpawn attempt access to out of range mGameEventGameobjectGuids element %i (size: %zu)", + TC_LOG_ERROR("gameevent", "GameEventMgr::GameEventSpawn attempted access to out of range mGameEventGameobjectGuids element %i (size: %zu).", internal_event_id, mGameEventGameobjectGuids.size()); return; } @@ -1231,7 +1237,7 @@ void GameEventMgr::GameEventSpawn(int16 event_id) if (internal_event_id < 0 || internal_event_id >= int32(mGameEventPoolIds.size())) { - TC_LOG_ERROR("gameevent", "GameEventMgr::GameEventSpawn attempt access to out of range mGameEventPoolIds element %u (size: %zu)", + TC_LOG_ERROR("gameevent", "GameEventMgr::GameEventSpawn attempted access to out of range mGameEventPoolIds element %u (size: %zu).", internal_event_id, mGameEventPoolIds.size()); return; } @@ -1246,7 +1252,7 @@ void GameEventMgr::GameEventUnspawn(int16 event_id) if (internal_event_id < 0 || internal_event_id >= int32(mGameEventCreatureGuids.size())) { - TC_LOG_ERROR("gameevent", "GameEventMgr::GameEventUnspawn attempt access to out of range mGameEventCreatureGuids element %i (size: %zu)", + TC_LOG_ERROR("gameevent", "GameEventMgr::GameEventUnspawn attempted access to out of range mGameEventCreatureGuids element %i (size: %zu).", internal_event_id, mGameEventCreatureGuids.size()); return; } @@ -1276,7 +1282,7 @@ void GameEventMgr::GameEventUnspawn(int16 event_id) if (internal_event_id < 0 || internal_event_id >= int32(mGameEventGameobjectGuids.size())) { - TC_LOG_ERROR("gameevent", "GameEventMgr::GameEventUnspawn attempt access to out of range mGameEventGameobjectGuids element %i (size: %zu)", + TC_LOG_ERROR("gameevent", "GameEventMgr::GameEventUnspawn attempted access to out of range mGameEventGameobjectGuids element %i (size: %zu).", internal_event_id, mGameEventGameobjectGuids.size()); return; } @@ -1305,7 +1311,7 @@ void GameEventMgr::GameEventUnspawn(int16 event_id) } if (internal_event_id < 0 || internal_event_id >= int32(mGameEventPoolIds.size())) { - TC_LOG_ERROR("gameevent", "GameEventMgr::GameEventUnspawn attempt access to out of range mGameEventPoolIds element %u (size: %zu)", internal_event_id, mGameEventPoolIds.size()); + TC_LOG_ERROR("gameevent", "GameEventMgr::GameEventUnspawn attempted access to out of range mGameEventPoolIds element %u (size: %zu).", internal_event_id, mGameEventPoolIds.size()); return; } diff --git a/src/server/game/Events/GameEventMgr.h b/src/server/game/Events/GameEventMgr.h index b8d281dfdd7..d2982a402f2 100644 --- a/src/server/game/Events/GameEventMgr.h +++ b/src/server/game/Events/GameEventMgr.h @@ -100,11 +100,7 @@ class GameEventMgr ~GameEventMgr() { } public: - static GameEventMgr* instance() - { - static GameEventMgr instance; - return &instance; - } + static GameEventMgr* instance(); typedef std::set<uint16> ActiveEvents; typedef std::vector<GameEventData> GameEventDataMap; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index f45634e9684..fc7d668ae0b 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -235,6 +235,12 @@ ObjectMgr::ObjectMgr(): } } +ObjectMgr* ObjectMgr::instance() +{ + static ObjectMgr instance; + return &instance; +} + ObjectMgr::~ObjectMgr() { for (QuestMap::iterator i = _questTemplates.begin(); i != _questTemplates.end(); ++i) @@ -6502,7 +6508,12 @@ uint32 ObjectMgr::GenerateMailID() uint32 ObjectMgr::GeneratePetNumber() { - return ++_hiPetNumber; + if (_hiPetNumber >= 0xFFFFFFFE) + { + TC_LOG_ERROR("misc", "_hiPetNumber Id overflow!! Can't continue, shutting down server. "); + World::StopNow(ERROR_EXIT_CODE); + } + return _hiPetNumber++; } uint32 ObjectMgr::GenerateCreatureSpawnId() diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index ae1258713f5..3d6ae293edb 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -680,11 +680,13 @@ class ObjectMgr ~ObjectMgr(); public: - static ObjectMgr* instance() - { - static ObjectMgr instance; - return &instance; - } + ObjectMgr(ObjectMgr const&) = delete; + ObjectMgr(ObjectMgr&&) = delete; + + ObjectMgr& operator= (ObjectMgr const&) = delete; + ObjectMgr& operator= (ObjectMgr&&) = delete; + + static ObjectMgr* instance(); typedef std::unordered_map<uint32, Item*> ItemMap; diff --git a/src/server/game/Grids/GridReference.h b/src/server/game/Grids/GridReference.h index b1f2e92a840..f5766382822 100644 --- a/src/server/game/Grids/GridReference.h +++ b/src/server/game/Grids/GridReference.h @@ -28,18 +28,18 @@ template<class OBJECT> class GridReference : public Reference<GridRefManager<OBJECT>, OBJECT> { protected: - void targetObjectBuildLink() + void targetObjectBuildLink() override { // called from link() this->getTarget()->insertFirst(this); this->getTarget()->incSize(); } - void targetObjectDestroyLink() + void targetObjectDestroyLink() override { // called from unlink() if (this->isValid()) this->getTarget()->decSize(); } - void sourceObjectDestroyLink() + void sourceObjectDestroyLink() override { // called from invalidate() this->getTarget()->decSize(); diff --git a/src/server/game/Groups/GroupMgr.cpp b/src/server/game/Groups/GroupMgr.cpp index 0fd2e7c7095..a5aa432aadc 100644 --- a/src/server/game/Groups/GroupMgr.cpp +++ b/src/server/game/Groups/GroupMgr.cpp @@ -92,6 +92,12 @@ ObjectGuid::LowType GroupMgr::GenerateGroupId() return NextGroupId++; } +GroupMgr* GroupMgr::instance() +{ + static GroupMgr instance; + return &instance; +} + Group* GroupMgr::GetGroupByGUID(ObjectGuid::LowType groupId) const { GroupContainer::const_iterator itr = GroupStore.find(groupId); diff --git a/src/server/game/Groups/GroupMgr.h b/src/server/game/Groups/GroupMgr.h index 9afdddd0f18..ee6ae18f3ea 100644 --- a/src/server/game/Groups/GroupMgr.h +++ b/src/server/game/Groups/GroupMgr.h @@ -27,11 +27,7 @@ private: ~GroupMgr(); public: - static GroupMgr* instance() - { - static GroupMgr instance; - return &instance; - } + static GroupMgr* instance(); typedef std::map<ObjectGuid::LowType, Group*> GroupContainer; typedef std::vector<Group*> GroupDbContainer; diff --git a/src/server/game/Guilds/GuildMgr.cpp b/src/server/game/Guilds/GuildMgr.cpp index 2d4fb849fb5..a4d245cbc9b 100644 --- a/src/server/game/Guilds/GuildMgr.cpp +++ b/src/server/game/Guilds/GuildMgr.cpp @@ -79,6 +79,12 @@ std::string GuildMgr::GetGuildNameById(ObjectGuid::LowType guildId) const return ""; } +GuildMgr* GuildMgr::instance() +{ + static GuildMgr instance; + return &instance; +} + Guild* GuildMgr::GetGuildByLeader(ObjectGuid guid) const { for (GuildContainer::const_iterator itr = GuildStore.begin(); itr != GuildStore.end(); ++itr) diff --git a/src/server/game/Guilds/GuildMgr.h b/src/server/game/Guilds/GuildMgr.h index a97a59cafe0..d8662f50f43 100644 --- a/src/server/game/Guilds/GuildMgr.h +++ b/src/server/game/Guilds/GuildMgr.h @@ -27,11 +27,7 @@ private: ~GuildMgr(); public: - static GuildMgr* instance() - { - static GuildMgr instance; - return &instance; - } + static GuildMgr* instance(); Guild* GetGuildByLeader(ObjectGuid guid) const; Guild* GetGuildById(ObjectGuid::LowType guildId) const; diff --git a/src/server/game/Handlers/AddonHandler.cpp b/src/server/game/Handlers/AddonHandler.cpp index ad44e0993e4..c72fc08982c 100644 --- a/src/server/game/Handlers/AddonHandler.cpp +++ b/src/server/game/Handlers/AddonHandler.cpp @@ -21,6 +21,12 @@ #include "Opcodes.h" #include "Log.h" +AddonHandler* AddonHandler::instance() +{ + static AddonHandler instance; + return &instance; +} + bool AddonHandler::BuildAddonPacket(WorldPacket* source, WorldPacket* target) { ByteBuffer AddOnPacked; diff --git a/src/server/game/Handlers/AddonHandler.h b/src/server/game/Handlers/AddonHandler.h index 1e8081e0913..0113695895a 100644 --- a/src/server/game/Handlers/AddonHandler.h +++ b/src/server/game/Handlers/AddonHandler.h @@ -26,11 +26,7 @@ class AddonHandler { public: - static AddonHandler* instance() - { - static AddonHandler instance; - return &instance; - } + static AddonHandler* instance(); bool BuildAddonPacket(WorldPacket* Source, WorldPacket* Target); diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index e0d790312d2..2b4b77dc7a9 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -228,11 +228,11 @@ void WorldSession::HandleCharEnum(PreparedQueryResult result) if (Player::BuildEnumData(result, &data)) { // Do not allow banned characters to log in - if (!(*result)[20].GetUInt32()) + if (!(*result)[23].GetUInt32()) _legitCharacters.insert(guid); if (!sWorld->HasCharacterInfo(guid)) // This can happen if characters are inserted into the database manually. Core hasn't loaded name data yet. - sWorld->AddCharacterInfo(guid, GetAccountId(), (*result)[1].GetString(), (*result)[4].GetUInt8(), (*result)[2].GetUInt8(), (*result)[3].GetUInt8(), (*result)[7].GetUInt8()); + sWorld->AddCharacterInfo(guid, GetAccountId(), (*result)[1].GetString(), (*result)[4].GetUInt8(), (*result)[2].GetUInt8(), (*result)[3].GetUInt8(), (*result)[10].GetUInt8()); ++num; } } @@ -627,13 +627,13 @@ void WorldSession::HandleCharCreateCallback(PreparedQueryResult result, Characte PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_REALM_CHARACTERS_BY_REALM); stmt->setUInt32(0, GetAccountId()); - stmt->setUInt32(1, realmID); + stmt->setUInt32(1, realm.Id.Realm); trans->Append(stmt); stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_REALM_CHARACTERS); stmt->setUInt32(0, createInfo->CharCount); stmt->setUInt32(1, GetAccountId()); - stmt->setUInt32(2, realmID); + stmt->setUInt32(2, realm.Id.Realm); trans->Append(stmt); LoginDatabase.CommitTransaction(trans); diff --git a/src/server/game/Handlers/MailHandler.cpp b/src/server/game/Handlers/MailHandler.cpp index aaf6ca39d09..36df5b64f1b 100644 --- a/src/server/game/Handlers/MailHandler.cpp +++ b/src/server/game/Handlers/MailHandler.cpp @@ -35,7 +35,7 @@ bool WorldSession::CanOpenMailBox(ObjectGuid guid) { if (!HasPermission(rbac::RBAC_PERM_COMMAND_MAILBOX)) { - TC_LOG_WARN("cheat", "%s attempt open mailbox in cheating way.", _player->GetName().c_str()); + TC_LOG_WARN("cheat", "%s attempted to open mailbox by using a cheat.", _player->GetName().c_str()); return false; } } @@ -108,7 +108,7 @@ void WorldSession::HandleSendMail(WorldPacket& recvData) if (!receiverGuid) { - TC_LOG_INFO("network", "Player %u is sending mail to %s (GUID: not existed!) with subject %s " + TC_LOG_INFO("network", "Player %u is sending mail to %s (GUID: non-existing!) with subject %s " "and body %s includes %u items, %u copper and %u COD copper with unk1 = %u, unk2 = %u", player->GetGUID().GetCounter(), receiverName.c_str(), subject.c_str(), body.c_str(), items_count, money, COD, stationery, package); @@ -117,7 +117,7 @@ void WorldSession::HandleSendMail(WorldPacket& recvData) } TC_LOG_INFO("network", "Player %u is sending mail to %s (%s) with subject %s and body %s " - "includes %u items, %u copper and %u COD copper with unk1 = %u, unk2 = %u", + "including %u items, %u copper and %u COD copper with unk1 = %u, unk2 = %u", player->GetGUID().GetCounter(), receiverName.c_str(), receiverGuid.ToString().c_str(), subject.c_str(), body.c_str(), items_count, money, COD, stationery, package); diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 5f5a66e7b20..7e25699352b 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -569,7 +569,7 @@ void WorldSession::HandleAddFriendOpcodeCallBack(PreparedQueryResult result, std team = Player::TeamForRace(fields[1].GetUInt8()); friendAccountId = fields[2].GetUInt32(); - if (HasPermission(rbac::RBAC_PERM_ALLOW_GM_FRIEND) || AccountMgr::IsPlayerAccount(AccountMgr::GetSecurity(friendAccountId, realmID))) + if (HasPermission(rbac::RBAC_PERM_ALLOW_GM_FRIEND) || AccountMgr::IsPlayerAccount(AccountMgr::GetSecurity(friendAccountId, realm.Id.Realm))) { if (friendGuid) { @@ -1203,7 +1203,7 @@ void WorldSession::HandleInspectOpcode(WorldPacket& recvData) WorldPacket data(SMSG_INSPECT_TALENT, guid_size+4+talent_points); data << player->GetPackGUID(); - if (sWorld->getBoolConfig(CONFIG_TALENTS_INSPECTING) || _player->IsGameMaster()) + if (GetPlayer()->CanBeGameMaster() || sWorld->getIntConfig(CONFIG_TALENTS_INSPECTING) + (GetPlayer()->GetTeamId() == player->GetTeamId()) > 1) player->BuildPlayerTalentsInfoData(&data); else { diff --git a/src/server/game/Instances/InstanceSaveMgr.cpp b/src/server/game/Instances/InstanceSaveMgr.cpp index 3538262ed35..88677fc04f4 100644 --- a/src/server/game/Instances/InstanceSaveMgr.cpp +++ b/src/server/game/Instances/InstanceSaveMgr.cpp @@ -38,6 +38,12 @@ InstanceSaveManager::~InstanceSaveManager() { } +InstanceSaveManager* InstanceSaveManager::instance() +{ + static InstanceSaveManager instance; + return &instance; +} + void InstanceSaveManager::Unload() { lock_instLists = true; diff --git a/src/server/game/Instances/InstanceSaveMgr.h b/src/server/game/Instances/InstanceSaveMgr.h index d2b3237b3cf..255b68165e3 100644 --- a/src/server/game/Instances/InstanceSaveMgr.h +++ b/src/server/game/Instances/InstanceSaveMgr.h @@ -158,11 +158,7 @@ class InstanceSaveManager public: typedef std::unordered_map<uint32 /*InstanceId*/, InstanceSave*> InstanceSaveHashMap; - static InstanceSaveManager* instance() - { - static InstanceSaveManager instance; - return &instance; - } + static InstanceSaveManager* instance(); void Unload(); diff --git a/src/server/game/Mails/Mail.cpp b/src/server/game/Mails/Mail.cpp index b0e8a1ebe02..bc31a3c8c06 100644 --- a/src/server/game/Mails/Mail.cpp +++ b/src/server/game/Mails/Mail.cpp @@ -49,8 +49,8 @@ MailSender::MailSender(Object* sender, MailStationery stationery) : m_stationery break; default: m_messageType = MAIL_NORMAL; - m_senderId = 0; // will show mail from not existed player - TC_LOG_ERROR("misc", "MailSender::MailSender - Mail have unexpected sender typeid (%u)", sender->GetTypeId()); + m_senderId = 0; // will show mail from non-existing player + TC_LOG_ERROR("misc", "MailSender::MailSender - Mail message contains unexpected sender typeid (%u).", sender->GetTypeId()); break; } } diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index ccc599b6de8..7b94895c3de 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -129,9 +129,9 @@ void Map::LoadMMap(int gx, int gy) bool mmapLoadResult = MMAP::MMapFactory::createOrGetMMapManager()->loadMap((sWorld->GetDataPath() + "mmaps").c_str(), GetId(), gx, gy); if (mmapLoadResult) - TC_LOG_DEBUG("maps", "MMAP loaded name:%s, id:%d, x:%d, y:%d (mmap rep.: x:%d, y:%d)", GetMapName(), GetId(), gx, gy, gx, gy); + TC_LOG_DEBUG("mmaps", "MMAP loaded name:%s, id:%d, x:%d, y:%d (mmap rep.: x:%d, y:%d)", GetMapName(), GetId(), gx, gy, gx, gy); else - TC_LOG_ERROR("maps", "Could not load MMAP name:%s, id:%d, x:%d, y:%d (mmap rep.: x:%d, y:%d)", GetMapName(), GetId(), gx, gy, gx, gy); + TC_LOG_ERROR("mmaps", "Could not load MMAP name:%s, id:%d, x:%d, y:%d (mmap rep.: x:%d, y:%d)", GetMapName(), GetId(), gx, gy, gx, gy); } void Map::LoadVMap(int gx, int gy) @@ -209,6 +209,13 @@ void Map::LoadMapAndVMap(int gx, int gy) } } +void Map::LoadAllCells() +{ + for (uint32 cellX = 0; cellX < TOTAL_NUMBER_OF_CELLS_PER_MAP; cellX++) + for (uint32 cellY = 0; cellY < TOTAL_NUMBER_OF_CELLS_PER_MAP; cellY++) + LoadGrid((cellX + 0.5f - CENTER_GRID_CELL_ID) * SIZE_OF_GRID_CELL, (cellY + 0.5f - CENTER_GRID_CELL_ID) * SIZE_OF_GRID_CELL); +} + void Map::InitStateMachine() { si_GridStates[GRID_STATE_INVALID] = new InvalidState; @@ -594,7 +601,7 @@ bool Map::AddToMap(T* obj) //something, such as vehicle, needs to be update immediately //also, trigger needs to cast spell, if not update, cannot see visual - obj->UpdateObjectVisibility(true); + obj->UpdateObjectVisibilityOnCreate(); return true; } diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index bc2bf72f271..1da3f40c1d0 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -308,6 +308,7 @@ class Map : public GridRefManager<NGridType> bool GetUnloadLock(const GridCoord &p) const { return getNGrid(p.x_coord, p.y_coord)->getUnloadLock(); } void SetUnloadLock(const GridCoord &p, bool on) { getNGrid(p.x_coord, p.y_coord)->setUnloadExplicitLock(on); } void LoadGrid(float x, float y); + void LoadAllCells(); bool UnloadGrid(NGridType& ngrid, bool pForce); virtual void UnloadAll(); diff --git a/src/server/game/Maps/MapInstanced.cpp b/src/server/game/Maps/MapInstanced.cpp index 47b9b376b1e..58decc05354 100644 --- a/src/server/game/Maps/MapInstanced.cpp +++ b/src/server/game/Maps/MapInstanced.cpp @@ -230,6 +230,9 @@ InstanceMap* MapInstanced::CreateInstance(uint32 InstanceId, InstanceSave* save, bool load_data = save != NULL; map->CreateInstanceData(load_data); + if (sWorld->getBoolConfig(CONFIG_INSTANCEMAP_LOAD_GRIDS)) + map->LoadAllCells(); + m_InstancedMaps[InstanceId] = map; return map; } diff --git a/src/server/game/Maps/MapManager.cpp b/src/server/game/Maps/MapManager.cpp index e5f364e39f4..c1882b3dc75 100644 --- a/src/server/game/Maps/MapManager.cpp +++ b/src/server/game/Maps/MapManager.cpp @@ -62,6 +62,12 @@ void MapManager::InitializeVisibilityDistanceInfo() (*iter).second->InitVisibilityDistance(); } +MapManager* MapManager::instance() +{ + static MapManager instance; + return &instance; +} + Map* MapManager::CreateBaseMap(uint32 id) { Map* map = FindBaseMap(id); diff --git a/src/server/game/Maps/MapManager.h b/src/server/game/Maps/MapManager.h index 7f9621593d4..b13d6552022 100644 --- a/src/server/game/Maps/MapManager.h +++ b/src/server/game/Maps/MapManager.h @@ -31,11 +31,7 @@ struct TransportCreatureProto; class MapManager { public: - static MapManager* instance() - { - static MapManager instance; - return &instance; - } + static MapManager* instance(); Map* CreateBaseMap(uint32 mapId); Map* FindBaseNonInstanceMap(uint32 mapId) const; diff --git a/src/server/game/Maps/TransportMgr.cpp b/src/server/game/Maps/TransportMgr.cpp index afbddc5e686..c94dd860dea 100644 --- a/src/server/game/Maps/TransportMgr.cpp +++ b/src/server/game/Maps/TransportMgr.cpp @@ -36,6 +36,12 @@ TransportMgr::TransportMgr() { } TransportMgr::~TransportMgr() { } +TransportMgr* TransportMgr::instance() +{ + static TransportMgr instance; + return &instance; +} + void TransportMgr::Unload() { _transportTemplates.clear(); diff --git a/src/server/game/Maps/TransportMgr.h b/src/server/game/Maps/TransportMgr.h index 0bfb5b7a410..32fca6bd26e 100644 --- a/src/server/game/Maps/TransportMgr.h +++ b/src/server/game/Maps/TransportMgr.h @@ -101,11 +101,7 @@ class TransportMgr friend void LoadDBCStores(std::string const&); public: - static TransportMgr* instance() - { - static TransportMgr instance; - return &instance; - } + static TransportMgr* instance(); void Unload(); diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index 62c2a3a1981..dcee5ff7071 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -208,7 +208,9 @@ enum TrinityStrings LANG_INVALID_GAMEOBJECT_TYPE = 176, LANG_GAMEOBJECT_DAMAGED = 177, LANG_GRID_POSITION = 178, - // Room for more level 1 179-199 not used + // 179-185 used in 6.x branch + LANG_TRANSPORT_POSITION = 186, + // Room for more level 1 187-199 not used // level 2 chat LANG_NO_SELECTION = 200, diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index 05948b987ad..2a57524cb3c 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -193,7 +193,7 @@ void MotionMaster::MoveRandom(float spawndist) { if (_owner->GetTypeId() == TYPEID_UNIT) { - TC_LOG_DEBUG("misc", "Creature (GUID: %u) start moving random", _owner->GetGUID().GetCounter()); + TC_LOG_DEBUG("misc", "Creature (GUID: %u) started random movement.", _owner->GetGUID().GetCounter()); Mutate(new RandomMovementGenerator<Creature>(spawndist), MOTION_SLOT_IDLE); } } @@ -204,22 +204,22 @@ void MotionMaster::MoveTargetedHome() if (_owner->GetTypeId() == TYPEID_UNIT && !_owner->ToCreature()->GetCharmerOrOwnerGUID()) { - TC_LOG_DEBUG("misc", "Creature (Entry: %u GUID: %u) targeted home", _owner->GetEntry(), _owner->GetGUID().GetCounter()); + TC_LOG_DEBUG("misc", "Creature (Entry: %u GUID: %u) targeted home.", _owner->GetEntry(), _owner->GetGUID().GetCounter()); Mutate(new HomeMovementGenerator<Creature>(), MOTION_SLOT_ACTIVE); } else if (_owner->GetTypeId() == TYPEID_UNIT && _owner->ToCreature()->GetCharmerOrOwnerGUID()) { - TC_LOG_DEBUG("misc", "Pet or controlled creature (Entry: %u GUID: %u) targeting home", _owner->GetEntry(), _owner->GetGUID().GetCounter()); + TC_LOG_DEBUG("misc", "Pet or controlled creature (Entry: %u GUID: %u) is targeting home.", _owner->GetEntry(), _owner->GetGUID().GetCounter()); Unit* target = _owner->ToCreature()->GetCharmerOrOwner(); if (target) { - TC_LOG_DEBUG("misc", "Following %s (GUID: %u)", target->GetTypeId() == TYPEID_PLAYER ? "player" : "creature", target->GetTypeId() == TYPEID_PLAYER ? target->GetGUID().GetCounter() : ((Creature*)target)->GetSpawnId()); + TC_LOG_DEBUG("misc", "Following %s (GUID: %u).", target->GetTypeId() == TYPEID_PLAYER ? "player" : "creature", target->GetTypeId() == TYPEID_PLAYER ? target->GetGUID().GetCounter() : ((Creature*)target)->GetSpawnId()); Mutate(new FollowMovementGenerator<Creature>(target, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE), MOTION_SLOT_ACTIVE); } } else { - TC_LOG_ERROR("misc", "Player (GUID: %u) attempt targeted home", _owner->GetGUID().GetCounter()); + TC_LOG_ERROR("misc", "Player (GUID: %u) attempted to move towards target home.", _owner->GetGUID().GetCounter()); } } @@ -272,14 +272,14 @@ void MotionMaster::MoveFollow(Unit* target, float dist, float angle, MovementSlo //_owner->AddUnitState(UNIT_STATE_FOLLOW); if (_owner->GetTypeId() == TYPEID_PLAYER) { - TC_LOG_DEBUG("misc", "Player (GUID: %u) follow to %s (GUID: %u)", _owner->GetGUID().GetCounter(), + TC_LOG_DEBUG("misc", "Player (GUID: %u) follows %s (GUID: %u).", _owner->GetGUID().GetCounter(), target->GetTypeId() == TYPEID_PLAYER ? "player" : "creature", target->GetTypeId() == TYPEID_PLAYER ? target->GetGUID().GetCounter() : target->ToCreature()->GetSpawnId()); Mutate(new FollowMovementGenerator<Player>(target, dist, angle), slot); } else { - TC_LOG_DEBUG("misc", "Creature (Entry: %u GUID: %u) follow to %s (GUID: %u)", + TC_LOG_DEBUG("misc", "Creature (Entry: %u GUID: %u) follows %s (GUID: %u).", _owner->GetEntry(), _owner->GetGUID().GetCounter(), target->GetTypeId() == TYPEID_PLAYER ? "player" : "creature", target->GetTypeId() == TYPEID_PLAYER ? target->GetGUID().GetCounter() : target->ToCreature()->GetSpawnId()); @@ -291,12 +291,12 @@ void MotionMaster::MovePoint(uint32 id, float x, float y, float z, bool generate { if (_owner->GetTypeId() == TYPEID_PLAYER) { - TC_LOG_DEBUG("misc", "Player (GUID: %u) targeted point (Id: %u X: %f Y: %f Z: %f)", _owner->GetGUID().GetCounter(), id, x, y, z); + TC_LOG_DEBUG("misc", "Player (GUID: %u) targeted point (Id: %u X: %f Y: %f Z: %f).", _owner->GetGUID().GetCounter(), id, x, y, z); Mutate(new PointMovementGenerator<Player>(id, x, y, z, generatePath), MOTION_SLOT_ACTIVE); } else { - TC_LOG_DEBUG("misc", "Creature (Entry: %u GUID: %u) targeted point (ID: %u X: %f Y: %f Z: %f)", + TC_LOG_DEBUG("misc", "Creature (Entry: %u GUID: %u) targeted point (ID: %u X: %f Y: %f Z: %f).", _owner->GetEntry(), _owner->GetGUID().GetCounter(), id, x, y, z); Mutate(new PointMovementGenerator<Creature>(id, x, y, z, generatePath), MOTION_SLOT_ACTIVE); } @@ -307,7 +307,7 @@ void MotionMaster::MoveLand(uint32 id, Position const& pos) float x, y, z; pos.GetPosition(x, y, z); - TC_LOG_DEBUG("misc", "Creature (Entry: %u) landing point (ID: %u X: %f Y: %f Z: %f)", _owner->GetEntry(), id, x, y, z); + TC_LOG_DEBUG("misc", "Creature (Entry: %u) landing point (ID: %u X: %f Y: %f Z: %f).", _owner->GetEntry(), id, x, y, z); Movement::MoveSplineInit init(_owner); init.MoveTo(x, y, z); @@ -321,7 +321,7 @@ void MotionMaster::MoveTakeoff(uint32 id, Position const& pos) float x, y, z; pos.GetPosition(x, y, z); - TC_LOG_DEBUG("misc", "Creature (Entry: %u) landing point (ID: %u X: %f Y: %f Z: %f)", _owner->GetEntry(), id, x, y, z); + TC_LOG_DEBUG("misc", "Creature (Entry: %u) landing point (ID: %u X: %f Y: %f Z: %f).", _owner->GetEntry(), id, x, y, z); Movement::MoveSplineInit init(_owner); init.MoveTo(x, y, z); @@ -371,7 +371,7 @@ void MotionMaster::MoveJumpTo(float angle, float speedXY, float speedZ) void MotionMaster::MoveJump(float x, float y, float z, float o, float speedXY, float speedZ, uint32 id, bool hasOrientation /* = false*/) { - TC_LOG_DEBUG("misc", "Unit (GUID: %u) jump to point (X: %f Y: %f Z: %f)", _owner->GetGUID().GetCounter(), x, y, z); + TC_LOG_DEBUG("misc", "Unit (GUID: %u) jumps to point (X: %f Y: %f Z: %f).", _owner->GetGUID().GetCounter(), x, y, z); if (speedXY <= 0.1f) return; @@ -449,7 +449,7 @@ void MotionMaster::MoveFall(uint32 id /*=0*/) float tz = _owner->GetMap()->GetHeight(_owner->GetPhaseMask(), _owner->GetPositionX(), _owner->GetPositionY(), _owner->GetPositionZ(), true, MAX_FALL_DISTANCE); if (tz <= INVALID_HEIGHT) { - TC_LOG_DEBUG("misc", "MotionMaster::MoveFall: unable retrive a proper height at map %u (x: %f, y: %f, z: %f).", + TC_LOG_DEBUG("misc", "MotionMaster::MoveFall: unable to retrieve a proper height at map %u (x: %f, y: %f, z: %f).", _owner->GetMap()->GetId(), _owner->GetPositionX(), _owner->GetPositionY(), _owner->GetPositionZ()); return; } @@ -478,12 +478,12 @@ void MotionMaster::MoveCharge(float x, float y, float z, float speed /*= SPEED_C if (_owner->GetTypeId() == TYPEID_PLAYER) { - TC_LOG_DEBUG("misc", "Player (GUID: %u) charge point (X: %f Y: %f Z: %f)", _owner->GetGUID().GetCounter(), x, y, z); + TC_LOG_DEBUG("misc", "Player (GUID: %u) charged point (X: %f Y: %f Z: %f).", _owner->GetGUID().GetCounter(), x, y, z); Mutate(new PointMovementGenerator<Player>(id, x, y, z, generatePath, speed), MOTION_SLOT_CONTROLLED); } else { - TC_LOG_DEBUG("misc", "Creature (Entry: %u GUID: %u) charge point (X: %f Y: %f Z: %f)", + TC_LOG_DEBUG("misc", "Creature (Entry: %u GUID: %u) charged point (X: %f Y: %f Z: %f).", _owner->GetEntry(), _owner->GetGUID().GetCounter(), x, y, z); Mutate(new PointMovementGenerator<Creature>(id, x, y, z, generatePath, speed), MOTION_SLOT_CONTROLLED); } @@ -506,7 +506,7 @@ void MotionMaster::MoveSeekAssistance(float x, float y, float z) { if (_owner->GetTypeId() == TYPEID_PLAYER) { - TC_LOG_ERROR("misc", "Player (GUID: %u) attempt to seek assistance", _owner->GetGUID().GetCounter()); + TC_LOG_ERROR("misc", "Player (GUID: %u) attempted to seek assistance.", _owner->GetGUID().GetCounter()); } else { @@ -522,11 +522,11 @@ void MotionMaster::MoveSeekAssistanceDistract(uint32 time) { if (_owner->GetTypeId() == TYPEID_PLAYER) { - TC_LOG_ERROR("misc", "Player (GUID: %u) attempt to call distract after assistance", _owner->GetGUID().GetCounter()); + TC_LOG_ERROR("misc", "Player (GUID: %u) attempted to call distract assistance.", _owner->GetGUID().GetCounter()); } else { - TC_LOG_DEBUG("misc", "Creature (Entry: %u GUID: %u) is distracted after assistance call (Time: %u)", + TC_LOG_DEBUG("misc", "Creature (Entry: %u GUID: %u) is distracted after assistance call (Time: %u).", _owner->GetEntry(), _owner->GetGUID().GetCounter(), time); Mutate(new AssistanceDistractMovementGenerator(time), MOTION_SLOT_ACTIVE); } @@ -539,14 +539,14 @@ void MotionMaster::MoveFleeing(Unit* enemy, uint32 time) if (_owner->GetTypeId() == TYPEID_PLAYER) { - TC_LOG_DEBUG("misc", "Player (GUID: %u) flee from %s (GUID: %u)", _owner->GetGUID().GetCounter(), + TC_LOG_DEBUG("misc", "Player (GUID: %u) flees from %s (GUID: %u).", _owner->GetGUID().GetCounter(), enemy->GetTypeId() == TYPEID_PLAYER ? "player" : "creature", enemy->GetTypeId() == TYPEID_PLAYER ? enemy->GetGUID().GetCounter() : enemy->ToCreature()->GetSpawnId()); Mutate(new FleeingMovementGenerator<Player>(enemy->GetGUID()), MOTION_SLOT_CONTROLLED); } else { - TC_LOG_DEBUG("misc", "Creature (Entry: %u GUID: %u) flee from %s (GUID: %u)%s", + TC_LOG_DEBUG("misc", "Creature (Entry: %u GUID: %u) flees from %s (GUID: %u)%s.", _owner->GetEntry(), _owner->GetGUID().GetCounter(), enemy->GetTypeId() == TYPEID_PLAYER ? "player" : "creature", enemy->GetTypeId() == TYPEID_PLAYER ? enemy->GetGUID().GetCounter() : enemy->ToCreature()->GetSpawnId(), @@ -564,20 +564,20 @@ void MotionMaster::MoveTaxiFlight(uint32 path, uint32 pathnode) { if (path < sTaxiPathNodesByPath.size()) { - TC_LOG_DEBUG("misc", "%s taxi to (Path %u node %u)", _owner->GetName().c_str(), path, pathnode); + TC_LOG_DEBUG("misc", "%s taxi to (Path %u node %u).", _owner->GetName().c_str(), path, pathnode); FlightPathMovementGenerator* mgen = new FlightPathMovementGenerator(pathnode); mgen->LoadPath(_owner->ToPlayer()); Mutate(mgen, MOTION_SLOT_CONTROLLED); } else { - TC_LOG_ERROR("misc", "%s attempt taxi to (not existed Path %u node %u)", + TC_LOG_ERROR("misc", "%s attempted taxi to (non-existing Path %u node %u).", _owner->GetName().c_str(), path, pathnode); } } else { - TC_LOG_ERROR("misc", "Creature (Entry: %u GUID: %u) attempt taxi to (Path %u node %u)", + TC_LOG_ERROR("misc", "Creature (Entry: %u GUID: %u) attempted taxi to (Path %u node %u).", _owner->GetEntry(), _owner->GetGUID().GetCounter(), path, pathnode); } } @@ -589,11 +589,11 @@ void MotionMaster::MoveDistract(uint32 timer) if (_owner->GetTypeId() == TYPEID_PLAYER) { - TC_LOG_DEBUG("misc", "Player (GUID: %u) distracted (timer: %u)", _owner->GetGUID().GetCounter(), timer); + TC_LOG_DEBUG("misc", "Player (GUID: %u) distracted (timer: %u).", _owner->GetGUID().GetCounter(), timer); } else { - TC_LOG_DEBUG("misc", "Creature (Entry: %u GUID: %u) (timer: %u)", + TC_LOG_DEBUG("misc", "Creature (Entry: %u GUID: %u) distracted (timer: %u)", _owner->GetEntry(), _owner->GetGUID().GetCounter(), timer); } @@ -645,7 +645,7 @@ void MotionMaster::MovePath(uint32 path_id, bool repeatable) //Mutate(new WaypointMovementGenerator<Player>(path_id, repeatable)): Mutate(new WaypointMovementGenerator<Creature>(path_id, repeatable), MOTION_SLOT_IDLE); - TC_LOG_DEBUG("misc", "%s (GUID: %u) start moving over path(Id:%u, repeatable: %s)", + TC_LOG_DEBUG("misc", "%s (GUID: %u) starts moving over path(Id:%u, repeatable: %s).", _owner->GetTypeId() == TYPEID_PLAYER ? "Player" : "Creature", _owner->GetGUID().GetCounter(), path_id, repeatable ? "YES" : "NO"); } diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h index 7103eaace55..9250b666484 100755 --- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.h @@ -50,7 +50,7 @@ class TargetedMovementGeneratorMedium : public MovementGeneratorMedium< T, D >, bool DoUpdate(T*, uint32); Unit* GetTarget() const { return i_target.getTarget(); } - void unitSpeedChanged() { i_recalculateTravel = true; } + void unitSpeedChanged() override { i_recalculateTravel = true; } bool IsReachable() const { return (i_path) ? (i_path->GetPathType() & PATHFIND_NORMAL) : true; } protected: void _setTargetLocation(T* owner, bool updateDestination); diff --git a/src/server/game/Movement/Waypoints/WaypointManager.cpp b/src/server/game/Movement/Waypoints/WaypointManager.cpp index e0639e38e77..dc935263927 100644 --- a/src/server/game/Movement/Waypoints/WaypointManager.cpp +++ b/src/server/game/Movement/Waypoints/WaypointManager.cpp @@ -94,6 +94,12 @@ void WaypointMgr::Load() TC_LOG_INFO("server.loading", ">> Loaded %u waypoints in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); } +WaypointMgr* WaypointMgr::instance() +{ + static WaypointMgr instance; + return &instance; +} + void WaypointMgr::ReloadPath(uint32 id) { WaypointPathContainer::iterator itr = _waypointStore.find(id); diff --git a/src/server/game/Movement/Waypoints/WaypointManager.h b/src/server/game/Movement/Waypoints/WaypointManager.h index d519eee4793..a1f98c52b0b 100644 --- a/src/server/game/Movement/Waypoints/WaypointManager.h +++ b/src/server/game/Movement/Waypoints/WaypointManager.h @@ -47,11 +47,7 @@ typedef std::unordered_map<uint32, WaypointPath> WaypointPathContainer; class WaypointMgr { public: - static WaypointMgr* instance() - { - static WaypointMgr instance; - return &instance; - } + static WaypointMgr* instance(); // Attempts to reload a single path from database void ReloadPath(uint32 id); diff --git a/src/server/game/OutdoorPvP/OutdoorPvPMgr.cpp b/src/server/game/OutdoorPvP/OutdoorPvPMgr.cpp index 8296cdfb7ea..7f0695e16b3 100644 --- a/src/server/game/OutdoorPvP/OutdoorPvPMgr.cpp +++ b/src/server/game/OutdoorPvP/OutdoorPvPMgr.cpp @@ -37,6 +37,12 @@ void OutdoorPvPMgr::Die() delete itr->second; } +OutdoorPvPMgr* OutdoorPvPMgr::instance() +{ + static OutdoorPvPMgr instance; + return &instance; +} + void OutdoorPvPMgr::InitOutdoorPvP() { uint32 oldMSTime = getMSTime(); diff --git a/src/server/game/OutdoorPvP/OutdoorPvPMgr.h b/src/server/game/OutdoorPvP/OutdoorPvPMgr.h index 8a113987882..b1158075c57 100644 --- a/src/server/game/OutdoorPvP/OutdoorPvPMgr.h +++ b/src/server/game/OutdoorPvP/OutdoorPvPMgr.h @@ -42,11 +42,7 @@ class OutdoorPvPMgr ~OutdoorPvPMgr() { }; public: - static OutdoorPvPMgr* instance() - { - static OutdoorPvPMgr instance; - return &instance; - } + static OutdoorPvPMgr* instance(); // create outdoor pvp events void InitOutdoorPvP(); diff --git a/src/server/game/Pools/PoolMgr.cpp b/src/server/game/Pools/PoolMgr.cpp index 12fb8a06b62..81d318fb1d9 100644 --- a/src/server/game/Pools/PoolMgr.cpp +++ b/src/server/game/Pools/PoolMgr.cpp @@ -570,6 +570,12 @@ void PoolMgr::Initialize() mCreatureSearchMap.clear(); } +PoolMgr* PoolMgr::instance() +{ + static PoolMgr instance; + return &instance; +} + void PoolMgr::LoadFromDB() { // Pool templates diff --git a/src/server/game/Pools/PoolMgr.h b/src/server/game/Pools/PoolMgr.h index 51e0bcb4cac..6c48a011b73 100644 --- a/src/server/game/Pools/PoolMgr.h +++ b/src/server/game/Pools/PoolMgr.h @@ -108,11 +108,7 @@ class PoolMgr ~PoolMgr() { }; public: - static PoolMgr* instance() - { - static PoolMgr instance; - return &instance; - } + static PoolMgr* instance(); void LoadFromDB(); void LoadQuestPools(); diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp index 2922e4ef58d..07ac1a2ed5b 100644 --- a/src/server/game/Scripting/ScriptLoader.cpp +++ b/src/server/game/Scripting/ScriptLoader.cpp @@ -18,1404 +18,36 @@ #include "ScriptLoader.h" #include "World.h" -// spells -void AddSC_deathknight_spell_scripts(); -void AddSC_druid_spell_scripts(); -void AddSC_generic_spell_scripts(); -void AddSC_hunter_spell_scripts(); -void AddSC_mage_spell_scripts(); -void AddSC_paladin_spell_scripts(); -void AddSC_priest_spell_scripts(); -void AddSC_rogue_spell_scripts(); -void AddSC_shaman_spell_scripts(); -void AddSC_warlock_spell_scripts(); -void AddSC_warrior_spell_scripts(); -void AddSC_quest_spell_scripts(); -void AddSC_item_spell_scripts(); -void AddSC_holiday_spell_scripts(); - +void AddSpellsScripts(); void AddSC_SmartScripts(); - -//Commands -void AddSC_account_commandscript(); -void AddSC_achievement_commandscript(); -void AddSC_ahbot_commandscript(); -void AddSC_arena_commandscript(); -void AddSC_ban_commandscript(); -void AddSC_bf_commandscript(); -void AddSC_cast_commandscript(); -void AddSC_character_commandscript(); -void AddSC_cheat_commandscript(); -void AddSC_debug_commandscript(); -void AddSC_deserter_commandscript(); -void AddSC_disable_commandscript(); -void AddSC_event_commandscript(); -void AddSC_gm_commandscript(); -void AddSC_go_commandscript(); -void AddSC_gobject_commandscript(); -void AddSC_group_commandscript(); -void AddSC_guild_commandscript(); -void AddSC_honor_commandscript(); -void AddSC_instance_commandscript(); -void AddSC_learn_commandscript(); -void AddSC_lfg_commandscript(); -void AddSC_list_commandscript(); -void AddSC_lookup_commandscript(); -void AddSC_message_commandscript(); -void AddSC_misc_commandscript(); -void AddSC_mmaps_commandscript(); -void AddSC_modify_commandscript(); -void AddSC_npc_commandscript(); -void AddSC_pet_commandscript(); -void AddSC_quest_commandscript(); -void AddSC_rbac_commandscript(); -void AddSC_reload_commandscript(); -void AddSC_reset_commandscript(); -void AddSC_send_commandscript(); -void AddSC_server_commandscript(); -void AddSC_tele_commandscript(); -void AddSC_ticket_commandscript(); -void AddSC_titles_commandscript(); -void AddSC_wp_commandscript(); +void AddCommandsScripts(); #ifdef SCRIPTS -//world -void AddSC_areatrigger_scripts(); -void AddSC_emerald_dragons(); -void AddSC_generic_creature(); -void AddSC_go_scripts(); -void AddSC_guards(); -void AddSC_item_scripts(); -void AddSC_npc_professions(); -void AddSC_npc_innkeeper(); -void AddSC_npcs_special(); -void AddSC_achievement_scripts(); -void AddSC_action_ip_logger(); -void AddSC_duel_reset(); - -//eastern kingdoms -void AddSC_alterac_valley(); //Alterac Valley -void AddSC_boss_balinda(); -void AddSC_boss_drekthar(); -void AddSC_boss_galvangar(); -void AddSC_boss_vanndar(); -void AddSC_blackrock_depths(); //Blackrock Depths -void AddSC_boss_ambassador_flamelash(); -void AddSC_boss_draganthaurissan(); -void AddSC_boss_general_angerforge(); -void AddSC_boss_high_interrogator_gerstahn(); -void AddSC_boss_magmus(); -void AddSC_boss_moira_bronzebeard(); -void AddSC_boss_tomb_of_seven(); -void AddSC_instance_blackrock_depths(); -void AddSC_boss_drakkisath(); //Blackrock Spire -void AddSC_boss_halycon(); -void AddSC_boss_highlordomokk(); -void AddSC_boss_mothersmolderweb(); -void AddSC_boss_overlordwyrmthalak(); -void AddSC_boss_shadowvosh(); -void AddSC_boss_thebeast(); -void AddSC_boss_warmastervoone(); -void AddSC_boss_quatermasterzigris(); -void AddSC_boss_pyroguard_emberseer(); -void AddSC_boss_gyth(); -void AddSC_boss_rend_blackhand(); -void AddSC_boss_gizrul_the_slavener(); -void AddSC_boss_urok_doomhowl(); -void AddSC_boss_lord_valthalak(); -void AddSC_instance_blackrock_spire(); -void AddSC_boss_razorgore(); //Blackwing lair -void AddSC_boss_vaelastrasz(); -void AddSC_boss_broodlord(); -void AddSC_boss_firemaw(); -void AddSC_boss_ebonroc(); -void AddSC_boss_flamegor(); -void AddSC_boss_chromaggus(); -void AddSC_boss_nefarian(); -void AddSC_instance_blackwing_lair(); -void AddSC_deadmines(); //Deadmines -void AddSC_instance_deadmines(); -void AddSC_boss_mr_smite(); -void AddSC_gnomeregan(); //Gnomeregan -void AddSC_instance_gnomeregan(); -void AddSC_boss_attumen(); //Karazhan -void AddSC_boss_curator(); -void AddSC_boss_maiden_of_virtue(); -void AddSC_boss_shade_of_aran(); -void AddSC_boss_malchezaar(); -void AddSC_boss_terestian_illhoof(); -void AddSC_boss_moroes(); -void AddSC_bosses_opera(); -void AddSC_boss_netherspite(); -void AddSC_instance_karazhan(); -void AddSC_karazhan(); -void AddSC_boss_nightbane(); -void AddSC_boss_felblood_kaelthas(); // Magister's Terrace -void AddSC_boss_selin_fireheart(); -void AddSC_boss_vexallus(); -void AddSC_boss_priestess_delrissa(); -void AddSC_instance_magisters_terrace(); -void AddSC_magisters_terrace(); -void AddSC_boss_lucifron(); //Molten core -void AddSC_boss_magmadar(); -void AddSC_boss_gehennas(); -void AddSC_boss_garr(); -void AddSC_boss_baron_geddon(); -void AddSC_boss_shazzrah(); -void AddSC_boss_golemagg(); -void AddSC_boss_sulfuron(); -void AddSC_boss_majordomo(); -void AddSC_boss_ragnaros(); -void AddSC_instance_molten_core(); -void AddSC_instance_ragefire_chasm(); //Ragefire Chasm -void AddSC_the_scarlet_enclave(); //Scarlet Enclave -void AddSC_the_scarlet_enclave_c1(); -void AddSC_the_scarlet_enclave_c2(); -void AddSC_the_scarlet_enclave_c5(); -void AddSC_boss_arcanist_doan(); //Scarlet Monastery -void AddSC_boss_azshir_the_sleepless(); -void AddSC_boss_bloodmage_thalnos(); -void AddSC_boss_headless_horseman(); -void AddSC_boss_herod(); -void AddSC_boss_high_inquisitor_fairbanks(); -void AddSC_boss_houndmaster_loksey(); -void AddSC_boss_interrogator_vishas(); -void AddSC_boss_scorn(); -void AddSC_instance_scarlet_monastery(); -void AddSC_boss_mograine_and_whitemane(); -void AddSC_boss_darkmaster_gandling(); //Scholomance -void AddSC_boss_death_knight_darkreaver(); -void AddSC_boss_theolenkrastinov(); -void AddSC_boss_illuciabarov(); -void AddSC_boss_instructormalicia(); -void AddSC_boss_jandicebarov(); -void AddSC_boss_kormok(); -void AddSC_boss_lordalexeibarov(); -void AddSC_boss_lorekeeperpolkelt(); -void AddSC_boss_rasfrost(); -void AddSC_boss_theravenian(); -void AddSC_boss_vectus(); -void AddSC_boss_kirtonos_the_herald(); -void AddSC_instance_scholomance(); -void AddSC_shadowfang_keep(); //Shadowfang keep -void AddSC_instance_shadowfang_keep(); -void AddSC_boss_magistrate_barthilas(); //Stratholme -void AddSC_boss_maleki_the_pallid(); -void AddSC_boss_nerubenkan(); -void AddSC_boss_cannon_master_willey(); -void AddSC_boss_baroness_anastari(); -void AddSC_boss_ramstein_the_gorger(); -void AddSC_boss_timmy_the_cruel(); -void AddSC_boss_postmaster_malown(); -void AddSC_boss_baron_rivendare(); -void AddSC_boss_dathrohan_balnazzar(); -void AddSC_boss_order_of_silver_hand(); -void AddSC_instance_stratholme(); -void AddSC_stratholme(); -void AddSC_sunken_temple(); // Sunken Temple -void AddSC_instance_sunken_temple(); -void AddSC_instance_sunwell_plateau(); //Sunwell Plateau -void AddSC_boss_kalecgos(); -void AddSC_boss_brutallus(); -void AddSC_boss_felmyst(); -void AddSC_boss_eredar_twins(); -void AddSC_boss_muru(); -void AddSC_boss_kiljaeden(); -void AddSC_sunwell_plateau(); -void AddSC_boss_archaedas(); //Uldaman -void AddSC_boss_ironaya(); -void AddSC_uldaman(); -void AddSC_instance_uldaman(); -void AddSC_instance_the_stockade(); //The Stockade -void AddSC_boss_akilzon(); //Zul'Aman -void AddSC_boss_halazzi(); -void AddSC_boss_hex_lord_malacrass(); -void AddSC_boss_janalai(); -void AddSC_boss_nalorakk(); -void AddSC_boss_zuljin(); -void AddSC_instance_zulaman(); -void AddSC_zulaman(); -void AddSC_boss_jeklik(); //Zul'Gurub -void AddSC_boss_venoxis(); -void AddSC_boss_marli(); -void AddSC_boss_mandokir(); -void AddSC_boss_gahzranka(); -void AddSC_boss_thekal(); -void AddSC_boss_arlokk(); -void AddSC_boss_jindo(); -void AddSC_boss_hakkar(); -void AddSC_boss_grilek(); -void AddSC_boss_hazzarah(); -void AddSC_boss_renataki(); -void AddSC_boss_wushoolay(); -void AddSC_instance_zulgurub(); - -//void AddSC_alterac_mountains(); -void AddSC_arathi_highlands(); -void AddSC_blasted_lands(); -void AddSC_burning_steppes(); -void AddSC_duskwood(); -void AddSC_eastern_plaguelands(); -void AddSC_ghostlands(); -void AddSC_hinterlands(); -void AddSC_isle_of_queldanas(); -void AddSC_loch_modan(); -void AddSC_redridge_mountains(); -void AddSC_silverpine_forest(); -void AddSC_stormwind_city(); -void AddSC_stranglethorn_vale(); -void AddSC_swamp_of_sorrows(); -void AddSC_tirisfal_glades(); -void AddSC_undercity(); -void AddSC_western_plaguelands(); -void AddSC_wetlands(); - -//kalimdor -void AddSC_blackfathom_deeps(); //Blackfathom Depths -void AddSC_boss_gelihast(); -void AddSC_boss_kelris(); -void AddSC_boss_aku_mai(); -void AddSC_instance_blackfathom_deeps(); -void AddSC_hyjal(); //CoT Battle for Mt. Hyjal -void AddSC_boss_archimonde(); -void AddSC_instance_mount_hyjal(); -void AddSC_hyjal_trash(); -void AddSC_boss_rage_winterchill(); -void AddSC_boss_anetheron(); -void AddSC_boss_kazrogal(); -void AddSC_boss_azgalor(); -void AddSC_boss_captain_skarloc(); //CoT Old Hillsbrad -void AddSC_boss_epoch_hunter(); -void AddSC_boss_lieutenant_drake(); -void AddSC_instance_old_hillsbrad(); -void AddSC_old_hillsbrad(); -void AddSC_boss_aeonus(); //CoT The Black Morass -void AddSC_boss_chrono_lord_deja(); -void AddSC_boss_temporus(); -void AddSC_the_black_morass(); -void AddSC_instance_the_black_morass(); -void AddSC_boss_epoch(); //CoT Culling Of Stratholme -void AddSC_boss_infinite_corruptor(); -void AddSC_boss_salramm(); -void AddSC_boss_mal_ganis(); -void AddSC_boss_meathook(); -void AddSC_culling_of_stratholme(); -void AddSC_instance_culling_of_stratholme(); -void AddSC_instance_dire_maul(); //Dire Maul -void AddSC_boss_celebras_the_cursed(); //Maraudon -void AddSC_boss_landslide(); -void AddSC_boss_noxxion(); -void AddSC_boss_ptheradras(); -void AddSC_instance_maraudon(); -void AddSC_boss_onyxia(); //Onyxia's Lair -void AddSC_instance_onyxias_lair(); -void AddSC_boss_tuten_kash(); //Razorfen Downs -void AddSC_boss_mordresh_fire_eye(); -void AddSC_boss_glutton(); -void AddSC_boss_amnennar_the_coldbringer(); -void AddSC_razorfen_downs(); -void AddSC_instance_razorfen_downs(); -void AddSC_razorfen_kraul(); //Razorfen Kraul -void AddSC_instance_razorfen_kraul(); -void AddSC_boss_kurinnaxx(); //Ruins of ahn'qiraj -void AddSC_boss_rajaxx(); -void AddSC_boss_moam(); -void AddSC_boss_buru(); -void AddSC_boss_ayamiss(); -void AddSC_boss_ossirian(); -void AddSC_instance_ruins_of_ahnqiraj(); -void AddSC_boss_cthun(); //Temple of ahn'qiraj -void AddSC_boss_viscidus(); -void AddSC_boss_fankriss(); -void AddSC_boss_huhuran(); -void AddSC_bug_trio(); -void AddSC_boss_sartura(); -void AddSC_boss_skeram(); -void AddSC_boss_twinemperors(); -void AddSC_boss_ouro(); -void AddSC_npc_anubisath_sentinel(); -void AddSC_instance_temple_of_ahnqiraj(); -void AddSC_wailing_caverns(); //Wailing caverns -void AddSC_instance_wailing_caverns(); -void AddSC_boss_zum_rah(); //Zul'Farrak -void AddSC_zulfarrak(); -void AddSC_instance_zulfarrak(); - -void AddSC_ashenvale(); -void AddSC_azshara(); -void AddSC_azuremyst_isle(); -void AddSC_bloodmyst_isle(); -void AddSC_boss_azuregos(); -void AddSC_darkshore(); -void AddSC_desolace(); -void AddSC_durotar(); -void AddSC_dustwallow_marsh(); -void AddSC_felwood(); -void AddSC_feralas(); -void AddSC_moonglade(); -void AddSC_orgrimmar(); -void AddSC_silithus(); -void AddSC_stonetalon_mountains(); -void AddSC_tanaris(); -void AddSC_the_barrens(); -void AddSC_thousand_needles(); -void AddSC_thunder_bluff(); -void AddSC_ungoro_crater(); -void AddSC_winterspring(); - -// Northrend - -void AddSC_boss_slad_ran(); -void AddSC_boss_moorabi(); -void AddSC_boss_drakkari_colossus(); -void AddSC_boss_gal_darah(); -void AddSC_boss_eck(); -void AddSC_instance_gundrak(); - -// Azjol-Nerub - Azjol-Nerub -void AddSC_boss_krik_thir(); -void AddSC_boss_hadronox(); -void AddSC_boss_anub_arak(); -void AddSC_instance_azjol_nerub(); - -// Azjol-Nerub - Ahn'kahet -void AddSC_boss_elder_nadox(); -void AddSC_boss_taldaram(); -void AddSC_boss_amanitar(); -void AddSC_boss_jedoga_shadowseeker(); -void AddSC_boss_volazj(); -void AddSC_instance_ahnkahet(); - -// Drak'Tharon Keep -void AddSC_boss_trollgore(); -void AddSC_boss_novos(); -void AddSC_boss_king_dred(); -void AddSC_boss_tharon_ja(); -void AddSC_instance_drak_tharon_keep(); - -void AddSC_boss_argent_challenge(); //Trial of the Champion -void AddSC_boss_black_knight(); -void AddSC_boss_grand_champions(); -void AddSC_instance_trial_of_the_champion(); -void AddSC_trial_of_the_champion(); -void AddSC_boss_anubarak_trial(); //Trial of the Crusader -void AddSC_boss_faction_champions(); -void AddSC_boss_jaraxxus(); -void AddSC_boss_northrend_beasts(); -void AddSC_boss_twin_valkyr(); -void AddSC_trial_of_the_crusader(); -void AddSC_instance_trial_of_the_crusader(); -void AddSC_boss_anubrekhan(); //Naxxramas -void AddSC_boss_maexxna(); -void AddSC_boss_patchwerk(); -void AddSC_boss_grobbulus(); -void AddSC_boss_razuvious(); -void AddSC_boss_kelthuzad(); -void AddSC_boss_loatheb(); -void AddSC_boss_noth(); -void AddSC_boss_gluth(); -void AddSC_boss_sapphiron(); -void AddSC_boss_four_horsemen(); -void AddSC_boss_faerlina(); -void AddSC_boss_heigan(); -void AddSC_boss_gothik(); -void AddSC_boss_thaddius(); -void AddSC_instance_naxxramas(); -void AddSC_boss_nexus_commanders(); // The Nexus Nexus -void AddSC_boss_magus_telestra(); -void AddSC_boss_anomalus(); -void AddSC_boss_ormorok(); -void AddSC_boss_keristrasza(); -void AddSC_instance_nexus(); -void AddSC_boss_drakos(); //The Nexus The Oculus -void AddSC_boss_urom(); -void AddSC_boss_varos(); -void AddSC_boss_eregos(); -void AddSC_instance_oculus(); -void AddSC_oculus(); -void AddSC_boss_malygos(); // The Nexus: Eye of Eternity -void AddSC_instance_eye_of_eternity(); -void AddSC_boss_sartharion(); //Obsidian Sanctum -void AddSC_obsidian_sanctum(); -void AddSC_instance_obsidian_sanctum(); -void AddSC_boss_bjarngrim(); //Ulduar Halls of Lightning -void AddSC_boss_loken(); -void AddSC_boss_ionar(); -void AddSC_boss_volkhan(); -void AddSC_instance_halls_of_lightning(); -void AddSC_boss_maiden_of_grief(); //Ulduar Halls of Stone -void AddSC_boss_krystallus(); -void AddSC_boss_sjonnir(); -void AddSC_instance_halls_of_stone(); -void AddSC_halls_of_stone(); -void AddSC_boss_auriaya(); //Ulduar Ulduar -void AddSC_boss_flame_leviathan(); -void AddSC_boss_ignis(); -void AddSC_boss_razorscale(); -void AddSC_boss_xt002(); -void AddSC_boss_kologarn(); -void AddSC_boss_assembly_of_iron(); -void AddSC_boss_general_vezax(); -void AddSC_boss_mimiron(); -void AddSC_boss_hodir(); -void AddSC_boss_freya(); -void AddSC_boss_yogg_saron(); -void AddSC_boss_algalon_the_observer(); -void AddSC_instance_ulduar(); - -// Utgarde Keep - Utgarde Keep -void AddSC_boss_keleseth(); -void AddSC_boss_skarvald_dalronn(); -void AddSC_boss_ingvar_the_plunderer(); -void AddSC_instance_utgarde_keep(); -void AddSC_utgarde_keep(); - -// Utgarde Keep - Utgarde Pinnacle -void AddSC_boss_svala(); -void AddSC_boss_palehoof(); -void AddSC_boss_skadi(); -void AddSC_boss_ymiron(); -void AddSC_instance_utgarde_pinnacle(); - -// Vault of Archavon -void AddSC_boss_archavon(); -void AddSC_boss_emalon(); -void AddSC_boss_koralon(); -void AddSC_boss_toravon(); -void AddSC_instance_vault_of_archavon(); - -void AddSC_boss_cyanigosa(); //Violet Hold -void AddSC_boss_erekem(); -void AddSC_boss_ichoron(); -void AddSC_boss_lavanthor(); -void AddSC_boss_moragg(); -void AddSC_boss_xevozz(); -void AddSC_boss_zuramat(); -void AddSC_instance_violet_hold(); -void AddSC_violet_hold(); -void AddSC_instance_forge_of_souls(); //Forge of Souls -void AddSC_forge_of_souls(); -void AddSC_boss_bronjahm(); -void AddSC_boss_devourer_of_souls(); -void AddSC_instance_pit_of_saron(); //Pit of Saron -void AddSC_pit_of_saron(); -void AddSC_boss_garfrost(); -void AddSC_boss_ick(); -void AddSC_boss_tyrannus(); -void AddSC_instance_halls_of_reflection(); // Halls of Reflection -void AddSC_halls_of_reflection(); -void AddSC_boss_falric(); -void AddSC_boss_marwyn(); -void AddSC_boss_lord_marrowgar(); // Icecrown Citadel -void AddSC_boss_lady_deathwhisper(); -void AddSC_boss_icecrown_gunship_battle(); -void AddSC_boss_deathbringer_saurfang(); -void AddSC_boss_festergut(); -void AddSC_boss_rotface(); -void AddSC_boss_professor_putricide(); -void AddSC_boss_blood_prince_council(); -void AddSC_boss_blood_queen_lana_thel(); -void AddSC_boss_valithria_dreamwalker(); -void AddSC_boss_sindragosa(); -void AddSC_boss_the_lich_king(); -void AddSC_icecrown_citadel_teleport(); -void AddSC_instance_icecrown_citadel(); -void AddSC_icecrown_citadel(); -void AddSC_instance_ruby_sanctum(); // Ruby Sanctum -void AddSC_ruby_sanctum(); -void AddSC_boss_baltharus_the_warborn(); -void AddSC_boss_saviana_ragefire(); -void AddSC_boss_general_zarithrian(); -void AddSC_boss_halion(); - -void AddSC_dalaran(); -void AddSC_borean_tundra(); -void AddSC_dragonblight(); -void AddSC_grizzly_hills(); -void AddSC_howling_fjord(); -void AddSC_icecrown(); -void AddSC_sholazar_basin(); -void AddSC_storm_peaks(); -void AddSC_wintergrasp(); -void AddSC_zuldrak(); -void AddSC_crystalsong_forest(); -void AddSC_isle_of_conquest(); - -// Outland - -// Auchindoun - Auchenai Crypts -void AddSC_boss_shirrak_the_dead_watcher(); -void AddSC_boss_exarch_maladaar(); -void AddSC_instance_auchenai_crypts(); - -// Auchindoun - Mana Tombs -void AddSC_boss_pandemonius(); -void AddSC_boss_nexusprince_shaffar(); -void AddSC_instance_mana_tombs(); - -// Auchindoun - Sekketh Halls -void AddSC_boss_darkweaver_syth(); -void AddSC_boss_talon_king_ikiss(); -void AddSC_boss_anzu(); -void AddSC_instance_sethekk_halls(); - -// Auchindoun - Shadow Labyrinth -void AddSC_boss_ambassador_hellmaw(); -void AddSC_boss_blackheart_the_inciter(); -void AddSC_boss_grandmaster_vorpil(); -void AddSC_boss_murmur(); -void AddSC_instance_shadow_labyrinth(); - -// Black Temple -void AddSC_black_temple(); -void AddSC_boss_illidan(); -void AddSC_boss_shade_of_akama(); -void AddSC_boss_supremus(); -void AddSC_boss_gurtogg_bloodboil(); -void AddSC_boss_mother_shahraz(); -void AddSC_boss_reliquary_of_souls(); -void AddSC_boss_teron_gorefiend(); -void AddSC_boss_najentus(); -void AddSC_boss_illidari_council(); -void AddSC_instance_black_temple(); - -// Coilfang Reservoir - Serpent Shrine Cavern -void AddSC_boss_fathomlord_karathress(); -void AddSC_boss_hydross_the_unstable(); -void AddSC_boss_lady_vashj(); -void AddSC_boss_leotheras_the_blind(); -void AddSC_boss_morogrim_tidewalker(); -void AddSC_instance_serpentshrine_cavern(); -void AddSC_boss_the_lurker_below(); - -// Coilfang Reservoir - The Steam Vault -void AddSC_boss_hydromancer_thespia(); -void AddSC_boss_mekgineer_steamrigger(); -void AddSC_boss_warlord_kalithresh(); -void AddSC_instance_steam_vault(); - -// Coilfang Reservoir - The Slave Pens -void AddSC_instance_the_slave_pens(); -void AddSC_boss_mennu_the_betrayer(); -void AddSC_boss_rokmar_the_crackler(); -void AddSC_boss_quagmirran(); - -// Coilfang Reservoir - The Underbog -void AddSC_instance_the_underbog(); -void AddSC_boss_hungarfen(); -void AddSC_boss_the_black_stalker(); - -// Gruul's Lair -void AddSC_boss_gruul(); -void AddSC_boss_high_king_maulgar(); -void AddSC_instance_gruuls_lair(); -void AddSC_boss_broggok(); //HC Blood Furnace -void AddSC_boss_kelidan_the_breaker(); -void AddSC_boss_the_maker(); -void AddSC_instance_blood_furnace(); -void AddSC_boss_magtheridon(); //HC Magtheridon's Lair -void AddSC_instance_magtheridons_lair(); -void AddSC_boss_grand_warlock_nethekurse(); //HC Shattered Halls -void AddSC_boss_warbringer_omrogg(); -void AddSC_boss_warchief_kargath_bladefist(); -void AddSC_shattered_halls(); -void AddSC_instance_shattered_halls(); -void AddSC_boss_watchkeeper_gargolmar(); //HC Ramparts -void AddSC_boss_omor_the_unscarred(); -void AddSC_boss_vazruden_the_herald(); -void AddSC_instance_ramparts(); -void AddSC_arcatraz(); //TK Arcatraz -void AddSC_boss_zereketh_the_unbound(); -void AddSC_boss_dalliah_the_doomsayer(); -void AddSC_boss_wrath_scryer_soccothrates(); -void AddSC_boss_harbinger_skyriss(); -void AddSC_instance_arcatraz(); -void AddSC_boss_high_botanist_freywinn(); //TK Botanica -void AddSC_boss_laj(); -void AddSC_boss_warp_splinter(); -void AddSC_boss_thorngrin_the_tender(); -void AddSC_boss_commander_sarannis(); -void AddSC_instance_the_botanica(); -void AddSC_boss_alar(); //TK The Eye -void AddSC_boss_kaelthas(); -void AddSC_boss_void_reaver(); -void AddSC_boss_high_astromancer_solarian(); -void AddSC_instance_the_eye(); -void AddSC_the_eye(); -void AddSC_boss_gatewatcher_iron_hand(); //TK The Mechanar -void AddSC_boss_gatewatcher_gyrokill(); -void AddSC_boss_nethermancer_sepethrea(); -void AddSC_boss_pathaleon_the_calculator(); -void AddSC_boss_mechano_lord_capacitus(); -void AddSC_instance_mechanar(); - -void AddSC_blades_edge_mountains(); -void AddSC_boss_doomlordkazzak(); -void AddSC_boss_doomwalker(); -void AddSC_hellfire_peninsula(); -void AddSC_nagrand(); -void AddSC_netherstorm(); -void AddSC_shadowmoon_valley(); -void AddSC_shattrath_city(); -void AddSC_terokkar_forest(); -void AddSC_zangarmarsh(); - -// Events -void AddSC_event_childrens_week(); - -// Pets -void AddSC_deathknight_pet_scripts(); -void AddSC_generic_pet_scripts(); -void AddSC_hunter_pet_scripts(); -void AddSC_mage_pet_scripts(); -void AddSC_priest_pet_scripts(); -void AddSC_shaman_pet_scripts(); - -// battlegrounds - -// outdoor pvp -void AddSC_outdoorpvp_ep(); -void AddSC_outdoorpvp_hp(); -void AddSC_outdoorpvp_na(); -void AddSC_outdoorpvp_si(); -void AddSC_outdoorpvp_tf(); -void AddSC_outdoorpvp_zm(); - -// player -void AddSC_chat_log(); -void AddSC_action_ip_logger(); - +void AddWorldScripts(); +void AddEasternKingdomsScripts(); +void AddKalimdorScripts(); +void AddOutlandScripts(); +void AddNorthrendScripts(); +void AddEventsScripts(); +void AddPetScripts(); +void AddOutdoorPvPScripts(); +void AddCustomScripts(); #endif void AddScripts() { - AddSpellScripts(); + AddSpellsScripts(); AddSC_SmartScripts(); - AddCommandScripts(); + AddCommandsScripts(); #ifdef SCRIPTS AddWorldScripts(); AddEasternKingdomsScripts(); AddKalimdorScripts(); AddOutlandScripts(); AddNorthrendScripts(); - AddEventScripts(); + AddEventsScripts(); AddPetScripts(); - AddBattlegroundScripts(); AddOutdoorPvPScripts(); AddCustomScripts(); #endif } - -void AddSpellScripts() -{ - AddSC_deathknight_spell_scripts(); - AddSC_druid_spell_scripts(); - AddSC_generic_spell_scripts(); - AddSC_hunter_spell_scripts(); - AddSC_mage_spell_scripts(); - AddSC_paladin_spell_scripts(); - AddSC_priest_spell_scripts(); - AddSC_rogue_spell_scripts(); - AddSC_shaman_spell_scripts(); - AddSC_warlock_spell_scripts(); - AddSC_warrior_spell_scripts(); - AddSC_quest_spell_scripts(); - AddSC_item_spell_scripts(); - AddSC_holiday_spell_scripts(); -} - -void AddCommandScripts() -{ - AddSC_account_commandscript(); - AddSC_achievement_commandscript(); - AddSC_ahbot_commandscript(); - AddSC_arena_commandscript(); - AddSC_ban_commandscript(); - AddSC_bf_commandscript(); - AddSC_cast_commandscript(); - AddSC_character_commandscript(); - AddSC_cheat_commandscript(); - AddSC_debug_commandscript(); - AddSC_deserter_commandscript(); - AddSC_disable_commandscript(); - AddSC_event_commandscript(); - AddSC_gm_commandscript(); - AddSC_go_commandscript(); - AddSC_gobject_commandscript(); - AddSC_group_commandscript(); - AddSC_guild_commandscript(); - AddSC_honor_commandscript(); - AddSC_instance_commandscript(); - AddSC_learn_commandscript(); - AddSC_lookup_commandscript(); - AddSC_lfg_commandscript(); - AddSC_list_commandscript(); - AddSC_message_commandscript(); - AddSC_misc_commandscript(); - AddSC_mmaps_commandscript(); - AddSC_modify_commandscript(); - AddSC_npc_commandscript(); - AddSC_quest_commandscript(); - AddSC_pet_commandscript(); - AddSC_rbac_commandscript(); - AddSC_reload_commandscript(); - AddSC_reset_commandscript(); - AddSC_send_commandscript(); - AddSC_server_commandscript(); - AddSC_tele_commandscript(); - AddSC_ticket_commandscript(); - AddSC_titles_commandscript(); - AddSC_wp_commandscript(); -} - -void AddWorldScripts() -{ -#ifdef SCRIPTS - AddSC_areatrigger_scripts(); - AddSC_emerald_dragons(); - AddSC_generic_creature(); - AddSC_go_scripts(); - AddSC_guards(); - AddSC_item_scripts(); - AddSC_npc_professions(); - AddSC_npc_innkeeper(); - AddSC_npcs_special(); - AddSC_achievement_scripts(); - AddSC_chat_log(); // location: scripts\World\chat_log.cpp - // To avoid duplicate code, we check once /*ONLY*/ if logging is permitted or not. - if (sWorld->getBoolConfig(CONFIG_IP_BASED_ACTION_LOGGING)) - AddSC_action_ip_logger(); // location: scripts\World\action_ip_logger.cpp - AddSC_duel_reset(); -#endif -} - -void AddEasternKingdomsScripts() -{ -#ifdef SCRIPTS - AddSC_alterac_valley(); //Alterac Valley - AddSC_boss_balinda(); - AddSC_boss_drekthar(); - AddSC_boss_galvangar(); - AddSC_boss_vanndar(); - AddSC_blackrock_depths(); //Blackrock Depths - AddSC_boss_ambassador_flamelash(); - AddSC_boss_draganthaurissan(); - AddSC_boss_general_angerforge(); - AddSC_boss_high_interrogator_gerstahn(); - AddSC_boss_magmus(); - AddSC_boss_moira_bronzebeard(); - AddSC_boss_tomb_of_seven(); - AddSC_instance_blackrock_depths(); - AddSC_boss_drakkisath(); //Blackrock Spire - AddSC_boss_halycon(); - AddSC_boss_highlordomokk(); - AddSC_boss_mothersmolderweb(); - AddSC_boss_overlordwyrmthalak(); - AddSC_boss_shadowvosh(); - AddSC_boss_thebeast(); - AddSC_boss_warmastervoone(); - AddSC_boss_quatermasterzigris(); - AddSC_boss_pyroguard_emberseer(); - AddSC_boss_gyth(); - AddSC_boss_rend_blackhand(); - AddSC_boss_gizrul_the_slavener(); - AddSC_boss_urok_doomhowl(); - AddSC_boss_lord_valthalak(); - AddSC_instance_blackrock_spire(); - AddSC_boss_razorgore(); //Blackwing lair - AddSC_boss_vaelastrasz(); - AddSC_boss_broodlord(); - AddSC_boss_firemaw(); - AddSC_boss_ebonroc(); - AddSC_boss_flamegor(); - AddSC_boss_chromaggus(); - AddSC_boss_nefarian(); - AddSC_instance_blackwing_lair(); - AddSC_deadmines(); //Deadmines - AddSC_boss_mr_smite(); - AddSC_instance_deadmines(); - AddSC_gnomeregan(); //Gnomeregan - AddSC_instance_gnomeregan(); - AddSC_boss_attumen(); //Karazhan - AddSC_boss_curator(); - AddSC_boss_maiden_of_virtue(); - AddSC_boss_shade_of_aran(); - AddSC_boss_malchezaar(); - AddSC_boss_terestian_illhoof(); - AddSC_boss_moroes(); - AddSC_bosses_opera(); - AddSC_boss_netherspite(); - AddSC_instance_karazhan(); - AddSC_karazhan(); - AddSC_boss_nightbane(); - AddSC_boss_felblood_kaelthas(); // Magister's Terrace - AddSC_boss_selin_fireheart(); - AddSC_boss_vexallus(); - AddSC_boss_priestess_delrissa(); - AddSC_instance_magisters_terrace(); - AddSC_magisters_terrace(); - AddSC_boss_lucifron(); //Molten core - AddSC_boss_magmadar(); - AddSC_boss_gehennas(); - AddSC_boss_garr(); - AddSC_boss_baron_geddon(); - AddSC_boss_shazzrah(); - AddSC_boss_golemagg(); - AddSC_boss_sulfuron(); - AddSC_boss_majordomo(); - AddSC_boss_ragnaros(); - AddSC_instance_molten_core(); - AddSC_instance_ragefire_chasm(); //Ragefire Chasm - AddSC_the_scarlet_enclave(); //Scarlet Enclave - AddSC_the_scarlet_enclave_c1(); - AddSC_the_scarlet_enclave_c2(); - AddSC_the_scarlet_enclave_c5(); - AddSC_boss_arcanist_doan(); //Scarlet Monastery - AddSC_boss_azshir_the_sleepless(); - AddSC_boss_bloodmage_thalnos(); - AddSC_boss_headless_horseman(); - AddSC_boss_herod(); - AddSC_boss_high_inquisitor_fairbanks(); - AddSC_boss_houndmaster_loksey(); - AddSC_boss_interrogator_vishas(); - AddSC_boss_scorn(); - AddSC_instance_scarlet_monastery(); - AddSC_boss_mograine_and_whitemane(); - AddSC_boss_darkmaster_gandling(); //Scholomance - AddSC_boss_death_knight_darkreaver(); - AddSC_boss_theolenkrastinov(); - AddSC_boss_illuciabarov(); - AddSC_boss_instructormalicia(); - AddSC_boss_jandicebarov(); - AddSC_boss_kormok(); - AddSC_boss_lordalexeibarov(); - AddSC_boss_lorekeeperpolkelt(); - AddSC_boss_rasfrost(); - AddSC_boss_theravenian(); - AddSC_boss_vectus(); - AddSC_boss_kirtonos_the_herald(); - AddSC_instance_scholomance(); - AddSC_shadowfang_keep(); //Shadowfang keep - AddSC_instance_shadowfang_keep(); - AddSC_boss_magistrate_barthilas(); //Stratholme - AddSC_boss_maleki_the_pallid(); - AddSC_boss_nerubenkan(); - AddSC_boss_cannon_master_willey(); - AddSC_boss_baroness_anastari(); - AddSC_boss_ramstein_the_gorger(); - AddSC_boss_timmy_the_cruel(); - AddSC_boss_postmaster_malown(); - AddSC_boss_baron_rivendare(); - AddSC_boss_dathrohan_balnazzar(); - AddSC_boss_order_of_silver_hand(); - AddSC_instance_stratholme(); - AddSC_stratholme(); - AddSC_sunken_temple(); // Sunken Temple - AddSC_instance_sunken_temple(); - AddSC_instance_sunwell_plateau(); //Sunwell Plateau - AddSC_boss_kalecgos(); - AddSC_boss_brutallus(); - AddSC_boss_felmyst(); - AddSC_boss_eredar_twins(); - AddSC_boss_muru(); - AddSC_boss_kiljaeden(); - AddSC_sunwell_plateau(); - AddSC_instance_the_stockade(); //The Stockade - AddSC_boss_archaedas(); //Uldaman - AddSC_boss_ironaya(); - AddSC_uldaman(); - AddSC_instance_uldaman(); - AddSC_boss_akilzon(); //Zul'Aman - AddSC_boss_halazzi(); - AddSC_boss_hex_lord_malacrass(); - AddSC_boss_janalai(); - AddSC_boss_nalorakk(); - AddSC_boss_zuljin(); - AddSC_instance_zulaman(); - AddSC_zulaman(); - AddSC_boss_jeklik(); //Zul'Gurub - AddSC_boss_venoxis(); - AddSC_boss_marli(); - AddSC_boss_mandokir(); - AddSC_boss_gahzranka(); - AddSC_boss_thekal(); - AddSC_boss_arlokk(); - AddSC_boss_jindo(); - AddSC_boss_hakkar(); - AddSC_boss_grilek(); - AddSC_boss_hazzarah(); - AddSC_boss_renataki(); - AddSC_boss_wushoolay(); - AddSC_instance_zulgurub(); - - //AddSC_alterac_mountains(); - AddSC_arathi_highlands(); - AddSC_blasted_lands(); - AddSC_burning_steppes(); - AddSC_duskwood(); - AddSC_eastern_plaguelands(); - AddSC_ghostlands(); - AddSC_hinterlands(); - AddSC_isle_of_queldanas(); - AddSC_loch_modan(); - AddSC_redridge_mountains(); - AddSC_silverpine_forest(); - AddSC_stormwind_city(); - AddSC_stranglethorn_vale(); - AddSC_swamp_of_sorrows(); - AddSC_tirisfal_glades(); - AddSC_undercity(); - AddSC_western_plaguelands(); - AddSC_wetlands(); -#endif -} - -void AddKalimdorScripts() -{ -#ifdef SCRIPTS - AddSC_blackfathom_deeps(); //Blackfathom Depths - AddSC_boss_gelihast(); - AddSC_boss_kelris(); - AddSC_boss_aku_mai(); - AddSC_instance_blackfathom_deeps(); - AddSC_hyjal(); //CoT Battle for Mt. Hyjal - AddSC_boss_archimonde(); - AddSC_instance_mount_hyjal(); - AddSC_hyjal_trash(); - AddSC_boss_rage_winterchill(); - AddSC_boss_anetheron(); - AddSC_boss_kazrogal(); - AddSC_boss_azgalor(); - AddSC_boss_captain_skarloc(); //CoT Old Hillsbrad - AddSC_boss_epoch_hunter(); - AddSC_boss_lieutenant_drake(); - AddSC_instance_old_hillsbrad(); - AddSC_old_hillsbrad(); - AddSC_boss_aeonus(); //CoT The Black Morass - AddSC_boss_chrono_lord_deja(); - AddSC_boss_temporus(); - AddSC_the_black_morass(); - AddSC_instance_the_black_morass(); - AddSC_boss_epoch(); //CoT Culling Of Stratholme - AddSC_boss_infinite_corruptor(); - AddSC_boss_salramm(); - AddSC_boss_mal_ganis(); - AddSC_boss_meathook(); - AddSC_culling_of_stratholme(); - AddSC_instance_culling_of_stratholme(); - AddSC_instance_dire_maul(); //Dire Maul - AddSC_boss_celebras_the_cursed(); //Maraudon - AddSC_boss_landslide(); - AddSC_boss_noxxion(); - AddSC_boss_ptheradras(); - AddSC_instance_maraudon(); - AddSC_boss_onyxia(); //Onyxia's Lair - AddSC_instance_onyxias_lair(); - AddSC_boss_tuten_kash(); //Razorfen Downs - AddSC_boss_mordresh_fire_eye(); - AddSC_boss_glutton(); - AddSC_boss_amnennar_the_coldbringer(); - AddSC_razorfen_downs(); - AddSC_instance_razorfen_downs(); - AddSC_razorfen_kraul(); //Razorfen Kraul - AddSC_instance_razorfen_kraul(); - AddSC_boss_kurinnaxx(); //Ruins of ahn'qiraj - AddSC_boss_rajaxx(); - AddSC_boss_moam(); - AddSC_boss_buru(); - AddSC_boss_ayamiss(); - AddSC_boss_ossirian(); - AddSC_instance_ruins_of_ahnqiraj(); - AddSC_boss_cthun(); //Temple of ahn'qiraj - AddSC_boss_viscidus(); - AddSC_boss_fankriss(); - AddSC_boss_huhuran(); - AddSC_bug_trio(); - AddSC_boss_sartura(); - AddSC_boss_skeram(); - AddSC_boss_twinemperors(); - AddSC_boss_ouro(); - AddSC_npc_anubisath_sentinel(); - AddSC_instance_temple_of_ahnqiraj(); - AddSC_wailing_caverns(); //Wailing caverns - AddSC_instance_wailing_caverns(); - AddSC_boss_zum_rah(); //Zul'Farrak - AddSC_zulfarrak(); - AddSC_instance_zulfarrak(); - - AddSC_ashenvale(); - AddSC_azshara(); - AddSC_azuremyst_isle(); - AddSC_bloodmyst_isle(); - AddSC_boss_azuregos(); - AddSC_darkshore(); - AddSC_desolace(); - AddSC_durotar(); - AddSC_dustwallow_marsh(); - AddSC_felwood(); - AddSC_feralas(); - AddSC_moonglade(); - AddSC_orgrimmar(); - AddSC_silithus(); - AddSC_stonetalon_mountains(); - AddSC_tanaris(); - AddSC_the_barrens(); - AddSC_thousand_needles(); - AddSC_thunder_bluff(); - AddSC_ungoro_crater(); - AddSC_winterspring(); -#endif -} - -void AddOutlandScripts() -{ -#ifdef SCRIPTS - // Auchindoun - Auchenai Crypts - AddSC_boss_shirrak_the_dead_watcher(); - AddSC_boss_exarch_maladaar(); - AddSC_instance_auchenai_crypts(); - - // Auchindoun - Mana Tombs - AddSC_boss_pandemonius(); - AddSC_boss_nexusprince_shaffar(); - AddSC_instance_mana_tombs(); - - // Auchindoun - Sekketh Halls - AddSC_boss_darkweaver_syth(); - AddSC_boss_talon_king_ikiss(); - AddSC_boss_anzu(); - AddSC_instance_sethekk_halls(); - - // Auchindoun - Shadow Labyrinth - AddSC_boss_ambassador_hellmaw(); - AddSC_boss_blackheart_the_inciter(); - AddSC_boss_grandmaster_vorpil(); - AddSC_boss_murmur(); - AddSC_instance_shadow_labyrinth(); - - // Black Temple - AddSC_black_temple(); - AddSC_boss_illidan(); - AddSC_boss_shade_of_akama(); - AddSC_boss_supremus(); - AddSC_boss_gurtogg_bloodboil(); - AddSC_boss_mother_shahraz(); - AddSC_boss_reliquary_of_souls(); - AddSC_boss_teron_gorefiend(); - AddSC_boss_najentus(); - AddSC_boss_illidari_council(); - AddSC_instance_black_temple(); - - // Coilfang Reservoir - Serpent Shrine Cavern - AddSC_boss_fathomlord_karathress(); - AddSC_boss_hydross_the_unstable(); - AddSC_boss_lady_vashj(); - AddSC_boss_leotheras_the_blind(); - AddSC_boss_morogrim_tidewalker(); - AddSC_instance_serpentshrine_cavern(); - AddSC_boss_the_lurker_below(); - - // Coilfang Reservoir - The Steam Vault - AddSC_instance_steam_vault(); - AddSC_boss_hydromancer_thespia(); - AddSC_boss_mekgineer_steamrigger(); - AddSC_boss_warlord_kalithresh(); - - // Coilfang Reservoir - The Slave Pens - AddSC_instance_the_slave_pens(); - AddSC_boss_mennu_the_betrayer(); - AddSC_boss_rokmar_the_crackler(); - AddSC_boss_quagmirran(); - - // Coilfang Reservoir - The Underbog - AddSC_instance_the_underbog(); - AddSC_boss_hungarfen(); - AddSC_boss_the_black_stalker(); - - // Gruul's Lair - AddSC_boss_gruul(); - AddSC_boss_high_king_maulgar(); - AddSC_instance_gruuls_lair(); - AddSC_boss_broggok(); //HC Blood Furnace - AddSC_boss_kelidan_the_breaker(); - AddSC_boss_the_maker(); - AddSC_instance_blood_furnace(); - AddSC_boss_magtheridon(); //HC Magtheridon's Lair - AddSC_instance_magtheridons_lair(); - AddSC_boss_grand_warlock_nethekurse(); //HC Shattered Halls - AddSC_boss_warbringer_omrogg(); - AddSC_boss_warchief_kargath_bladefist(); - AddSC_shattered_halls(); - AddSC_instance_shattered_halls(); - AddSC_boss_watchkeeper_gargolmar(); //HC Ramparts - AddSC_boss_omor_the_unscarred(); - AddSC_boss_vazruden_the_herald(); - AddSC_instance_ramparts(); - AddSC_arcatraz(); //TK Arcatraz - AddSC_boss_zereketh_the_unbound(); - AddSC_boss_dalliah_the_doomsayer(); - AddSC_boss_wrath_scryer_soccothrates(); - AddSC_boss_harbinger_skyriss(); - AddSC_instance_arcatraz(); - AddSC_boss_high_botanist_freywinn(); //TK Botanica - AddSC_boss_laj(); - AddSC_boss_warp_splinter(); - AddSC_boss_thorngrin_the_tender(); - AddSC_boss_commander_sarannis(); - AddSC_instance_the_botanica(); - AddSC_boss_alar(); //TK The Eye - AddSC_boss_kaelthas(); - AddSC_boss_void_reaver(); - AddSC_boss_high_astromancer_solarian(); - AddSC_instance_the_eye(); - AddSC_the_eye(); - AddSC_boss_gatewatcher_iron_hand(); //TK The Mechanar - AddSC_boss_gatewatcher_gyrokill(); - AddSC_boss_nethermancer_sepethrea(); - AddSC_boss_pathaleon_the_calculator(); - AddSC_boss_mechano_lord_capacitus(); - AddSC_instance_mechanar(); - - AddSC_blades_edge_mountains(); - AddSC_boss_doomlordkazzak(); - AddSC_boss_doomwalker(); - AddSC_hellfire_peninsula(); - AddSC_nagrand(); - AddSC_netherstorm(); - AddSC_shadowmoon_valley(); - AddSC_shattrath_city(); - AddSC_terokkar_forest(); - AddSC_zangarmarsh(); -#endif -} - -void AddNorthrendScripts() -{ -#ifdef SCRIPTS - AddSC_boss_slad_ran(); //Gundrak - AddSC_boss_moorabi(); - AddSC_boss_drakkari_colossus(); - AddSC_boss_gal_darah(); - AddSC_boss_eck(); - AddSC_instance_gundrak(); - - // Azjol-Nerub - Ahn'kahet - AddSC_boss_elder_nadox(); - AddSC_boss_taldaram(); - AddSC_boss_amanitar(); - AddSC_boss_jedoga_shadowseeker(); - AddSC_boss_volazj(); - AddSC_instance_ahnkahet(); - - // Azjol-Nerub - Azjol-Nerub - AddSC_boss_krik_thir(); - AddSC_boss_hadronox(); - AddSC_boss_anub_arak(); - AddSC_instance_azjol_nerub(); - - // Drak'Tharon Keep - AddSC_boss_trollgore(); - AddSC_boss_novos(); - AddSC_boss_king_dred(); - AddSC_boss_tharon_ja(); - AddSC_instance_drak_tharon_keep(); - - AddSC_boss_argent_challenge(); //Trial of the Champion - AddSC_boss_black_knight(); - AddSC_boss_grand_champions(); - AddSC_instance_trial_of_the_champion(); - AddSC_trial_of_the_champion(); - AddSC_boss_anubarak_trial(); //Trial of the Crusader - AddSC_boss_faction_champions(); - AddSC_boss_jaraxxus(); - AddSC_trial_of_the_crusader(); - AddSC_boss_twin_valkyr(); - AddSC_boss_northrend_beasts(); - AddSC_instance_trial_of_the_crusader(); - AddSC_boss_anubrekhan(); //Naxxramas - AddSC_boss_maexxna(); - AddSC_boss_patchwerk(); - AddSC_boss_grobbulus(); - AddSC_boss_razuvious(); - AddSC_boss_kelthuzad(); - AddSC_boss_loatheb(); - AddSC_boss_noth(); - AddSC_boss_gluth(); - AddSC_boss_sapphiron(); - AddSC_boss_four_horsemen(); - AddSC_boss_faerlina(); - AddSC_boss_heigan(); - AddSC_boss_gothik(); - AddSC_boss_thaddius(); - AddSC_instance_naxxramas(); - AddSC_boss_nexus_commanders(); // The Nexus Nexus - AddSC_boss_magus_telestra(); - AddSC_boss_anomalus(); - AddSC_boss_ormorok(); - AddSC_boss_keristrasza(); - AddSC_instance_nexus(); - AddSC_boss_drakos(); //The Nexus The Oculus - AddSC_boss_urom(); - AddSC_boss_varos(); - AddSC_boss_eregos(); - AddSC_instance_oculus(); - AddSC_oculus(); - AddSC_boss_malygos(); // The Nexus: Eye of Eternity - AddSC_instance_eye_of_eternity(); - AddSC_boss_sartharion(); //Obsidian Sanctum - AddSC_obsidian_sanctum(); - AddSC_instance_obsidian_sanctum(); - AddSC_boss_bjarngrim(); //Ulduar Halls of Lightning - AddSC_boss_loken(); - AddSC_boss_ionar(); - AddSC_boss_volkhan(); - AddSC_instance_halls_of_lightning(); - AddSC_boss_maiden_of_grief(); //Ulduar Halls of Stone - AddSC_boss_krystallus(); - AddSC_boss_sjonnir(); - AddSC_instance_halls_of_stone(); - AddSC_halls_of_stone(); - AddSC_boss_auriaya(); //Ulduar Ulduar - AddSC_boss_flame_leviathan(); - AddSC_boss_ignis(); - AddSC_boss_razorscale(); - AddSC_boss_xt002(); - AddSC_boss_general_vezax(); - AddSC_boss_assembly_of_iron(); - AddSC_boss_kologarn(); - AddSC_boss_mimiron(); - AddSC_boss_hodir(); - AddSC_boss_freya(); - AddSC_boss_yogg_saron(); - AddSC_boss_algalon_the_observer(); - AddSC_instance_ulduar(); - - // Utgarde Keep - Utgarde Keep - AddSC_boss_keleseth(); - AddSC_boss_skarvald_dalronn(); - AddSC_boss_ingvar_the_plunderer(); - AddSC_instance_utgarde_keep(); - AddSC_utgarde_keep(); - - // Utgarde Keep - Utgarde Pinnacle - AddSC_boss_svala(); - AddSC_boss_palehoof(); - AddSC_boss_skadi(); - AddSC_boss_ymiron(); - AddSC_instance_utgarde_pinnacle(); - - // Vault of Archavon - AddSC_boss_archavon(); - AddSC_boss_emalon(); - AddSC_boss_koralon(); - AddSC_boss_toravon(); - AddSC_instance_vault_of_archavon(); - - AddSC_boss_cyanigosa(); //Violet Hold - AddSC_boss_erekem(); - AddSC_boss_ichoron(); - AddSC_boss_lavanthor(); - AddSC_boss_moragg(); - AddSC_boss_xevozz(); - AddSC_boss_zuramat(); - AddSC_instance_violet_hold(); - AddSC_violet_hold(); - AddSC_instance_forge_of_souls(); //Forge of Souls - AddSC_forge_of_souls(); - AddSC_boss_bronjahm(); - AddSC_boss_devourer_of_souls(); - AddSC_instance_pit_of_saron(); //Pit of Saron - AddSC_pit_of_saron(); - AddSC_boss_garfrost(); - AddSC_boss_ick(); - AddSC_boss_tyrannus(); - AddSC_instance_halls_of_reflection(); // Halls of Reflection - AddSC_halls_of_reflection(); - AddSC_boss_falric(); - AddSC_boss_marwyn(); - AddSC_boss_lord_marrowgar(); // Icecrown Citadel - AddSC_boss_lady_deathwhisper(); - AddSC_boss_icecrown_gunship_battle(); - AddSC_boss_deathbringer_saurfang(); - AddSC_boss_festergut(); - AddSC_boss_rotface(); - AddSC_boss_professor_putricide(); - AddSC_boss_blood_prince_council(); - AddSC_boss_blood_queen_lana_thel(); - AddSC_boss_valithria_dreamwalker(); - AddSC_boss_sindragosa(); - AddSC_boss_the_lich_king(); - AddSC_icecrown_citadel_teleport(); - AddSC_instance_icecrown_citadel(); - AddSC_icecrown_citadel(); - AddSC_instance_ruby_sanctum(); // Ruby Sanctum - AddSC_ruby_sanctum(); - AddSC_boss_baltharus_the_warborn(); - AddSC_boss_saviana_ragefire(); - AddSC_boss_general_zarithrian(); - AddSC_boss_halion(); - - AddSC_dalaran(); - AddSC_borean_tundra(); - AddSC_dragonblight(); - AddSC_grizzly_hills(); - AddSC_howling_fjord(); - AddSC_icecrown(); - AddSC_sholazar_basin(); - AddSC_storm_peaks(); - AddSC_wintergrasp(); - AddSC_zuldrak(); - AddSC_crystalsong_forest(); - AddSC_isle_of_conquest(); -#endif -} - -void AddEventScripts() -{ -#ifdef SCRIPTS - AddSC_event_childrens_week(); -#endif -} - -void AddPetScripts() -{ -#ifdef SCRIPTS - AddSC_deathknight_pet_scripts(); - AddSC_generic_pet_scripts(); - AddSC_hunter_pet_scripts(); - AddSC_mage_pet_scripts(); - AddSC_priest_pet_scripts(); - AddSC_shaman_pet_scripts(); -#endif -} - -void AddOutdoorPvPScripts() -{ -#ifdef SCRIPTS - AddSC_outdoorpvp_ep(); - AddSC_outdoorpvp_hp(); - AddSC_outdoorpvp_na(); - AddSC_outdoorpvp_si(); - AddSC_outdoorpvp_tf(); - AddSC_outdoorpvp_zm(); -#endif -} - -void AddBattlegroundScripts() -{ -#ifdef SCRIPTS -#endif -} - -#ifdef SCRIPTS -/* This is where custom scripts' loading functions should be declared. */ - -#endif - -void AddCustomScripts() -{ -#ifdef SCRIPTS - /* This is where custom scripts should be added. */ - -#endif -} diff --git a/src/server/game/Scripting/ScriptLoader.h b/src/server/game/Scripting/ScriptLoader.h index 4adb215e130..57b62df22d1 100644 --- a/src/server/game/Scripting/ScriptLoader.h +++ b/src/server/game/Scripting/ScriptLoader.h @@ -19,17 +19,5 @@ #define SC_SCRIPTLOADER_H void AddScripts(); -void AddSpellScripts(); -void AddCommandScripts(); -void AddWorldScripts(); -void AddEasternKingdomsScripts(); -void AddKalimdorScripts(); -void AddOutlandScripts(); -void AddNorthrendScripts(); -void AddEventScripts(); -void AddPetScripts(); -void AddBattlegroundScripts(); -void AddOutdoorPvPScripts(); -void AddCustomScripts(); #endif diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index 4b26ba96c9b..bc43ee10f3d 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -246,6 +246,12 @@ ScriptMgr::ScriptMgr() : _scriptCount(0), _scheduledScripts(0) ScriptMgr::~ScriptMgr() { } +ScriptMgr* ScriptMgr::instance() +{ + static ScriptMgr instance; + return &instance; +} + void ScriptMgr::Initialize() { uint32 oldMSTime = getMSTime(); @@ -501,17 +507,6 @@ void ScriptMgr::OnPacketSend(WorldSession* session, WorldPacket const& packet) FOREACH_SCRIPT(ServerScript)->OnPacketSend(session, copy); } -void ScriptMgr::OnUnknownPacketReceive(WorldSession* session, WorldPacket const& packet) -{ - ASSERT(session); - - if (SCR_REG_LST(ServerScript).empty()) - return; - - WorldPacket copy(packet); - FOREACH_SCRIPT(ServerScript)->OnUnknownPacketReceive(session, copy); -} - void ScriptMgr::OnOpenStateChange(bool open) { FOREACH_SCRIPT(WorldScript)->OnOpenStateChange(open); diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 8a00305b4da..905513da896 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -229,10 +229,6 @@ class ServerScript : public ScriptObject // Called when a (valid) packet is received by a client. The packet object is a copy of the original packet, so // reading and modifying it is safe. Make sure to check WorldSession pointer before usage, it might be null in case of auth packets virtual void OnPacketReceive(WorldSession* /*session*/, WorldPacket& /*packet*/) { } - - // Called when an invalid (unknown opcode) packet is received by a client. The packet is a reference to the orignal - // packet; not a copy. This allows you to actually handle unknown packets (for whatever purpose). - virtual void OnUnknownPacketReceive(WorldSession* /*session*/, WorldPacket& /*packet*/) { } }; class WorldScript : public ScriptObject @@ -857,11 +853,7 @@ class ScriptMgr virtual ~ScriptMgr(); public: /* Initialization */ - static ScriptMgr* instance() - { - static ScriptMgr instance; - return &instance; - } + static ScriptMgr* instance(); void Initialize(); void LoadDatabase(); @@ -890,7 +882,6 @@ class ScriptMgr void OnSocketClose(std::shared_ptr<WorldSocket> socket); void OnPacketReceive(WorldSession* session, WorldPacket const& packet); void OnPacketSend(WorldSession* session, WorldPacket const& packet); - void OnUnknownPacketReceive(WorldSession* session, WorldPacket const& packet); public: /* WorldScript */ diff --git a/src/server/game/Scripting/ScriptSystem.cpp b/src/server/game/Scripting/ScriptSystem.cpp index e828830ec0f..309838a919e 100644 --- a/src/server/game/Scripting/ScriptSystem.cpp +++ b/src/server/game/Scripting/ScriptSystem.cpp @@ -23,6 +23,12 @@ ScriptPointVector const SystemMgr::_empty; +SystemMgr* SystemMgr::instance() +{ + static SystemMgr instance; + return &instance; +} + void SystemMgr::LoadScriptWaypoints() { uint32 oldMSTime = getMSTime(); diff --git a/src/server/game/Scripting/ScriptSystem.h b/src/server/game/Scripting/ScriptSystem.h index 74c51e5b136..9e6a0d2a5a7 100644 --- a/src/server/game/Scripting/ScriptSystem.h +++ b/src/server/game/Scripting/ScriptSystem.h @@ -52,11 +52,7 @@ class SystemMgr ~SystemMgr() { } public: - static SystemMgr* instance() - { - static SystemMgr instance; - return &instance; - } + static SystemMgr* instance(); typedef std::unordered_map<uint32, ScriptPointVector> PointMoveMap; diff --git a/src/server/game/Server/Protocol/PacketLog.cpp b/src/server/game/Server/Protocol/PacketLog.cpp index 57b76304a77..11a02828998 100644 --- a/src/server/game/Server/Protocol/PacketLog.cpp +++ b/src/server/game/Server/Protocol/PacketLog.cpp @@ -69,6 +69,12 @@ PacketLog::~PacketLog() _file = NULL; } +PacketLog* PacketLog::instance() +{ + static PacketLog instance; + return &instance; +} + void PacketLog::Initialize() { std::string logsDir = sConfigMgr->GetStringDefault("LogsDir", ""); diff --git a/src/server/game/Server/Protocol/PacketLog.h b/src/server/game/Server/Protocol/PacketLog.h index 45a3f0a4655..b211cfbf3ca 100644 --- a/src/server/game/Server/Protocol/PacketLog.h +++ b/src/server/game/Server/Protocol/PacketLog.h @@ -40,11 +40,7 @@ class PacketLog std::once_flag _initializeFlag; public: - static PacketLog* instance() - { - static PacketLog instance; - return &instance; - } + static PacketLog* instance(); void Initialize(); bool CanLogPacket() const { return (_file != NULL); } diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index c380c1a5627..30eaef5d5c9 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -187,7 +187,7 @@ ObjectGuid::LowType WorldSession::GetGUIDLow() const } /// Send a packet to the client -void WorldSession::SendPacket(WorldPacket* packet) +void WorldSession::SendPacket(WorldPacket const* packet) { if (!m_Socket) return; @@ -272,119 +272,99 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater) WorldPacket* packet = NULL; //! Delete packet after processing by default bool deletePacket = true; - //! To prevent infinite loop - WorldPacket* firstDelayedPacket = NULL; - //! If _recvQueue.peek() == firstDelayedPacket it means that in this Update call, we've processed all - //! *properly timed* packets, and we're now at the part of the queue where we find - //! delayed packets that were re-enqueued due to improper timing. To prevent an infinite - //! loop caused by re-enqueueing the same packets over and over again, we stop updating this session - //! and continue updating others. The re-enqueued packets will be handled in the next Update call for this session. + std::vector<WorldPacket*> requeuePackets; uint32 processedPackets = 0; time_t currentTime = time(NULL); - while (m_Socket && !_recvQueue.empty() && _recvQueue.peek(true) != firstDelayedPacket && _recvQueue.next(packet, updater)) + while (m_Socket && _recvQueue.next(packet, updater)) { - if (packet->GetOpcode() >= NUM_MSG_TYPES) + OpcodeHandler const& opHandle = opcodeTable[packet->GetOpcode()]; + try { - TC_LOG_ERROR("network.opcode", "Received non-existed opcode %s from %s", GetOpcodeNameForLogging(packet->GetOpcode()).c_str() - , GetPlayerInfo().c_str()); - sScriptMgr->OnUnknownPacketReceive(this, *packet); - } - else - { - OpcodeHandler& opHandle = opcodeTable[packet->GetOpcode()]; - try + switch (opHandle.status) { - switch (opHandle.status) - { - case STATUS_LOGGEDIN: - if (!_player) - { - // skip STATUS_LOGGEDIN opcode unexpected errors if player logout sometime ago - this can be network lag delayed packets - //! If player didn't log out a while ago, it means packets are being sent while the server does not recognize - //! the client to be in world yet. We will re-add the packets to the bottom of the queue and process them later. - if (!m_playerRecentlyLogout) - { - //! Prevent infinite loop - if (!firstDelayedPacket) - firstDelayedPacket = packet; - //! Because checking a bool is faster than reallocating memory - deletePacket = false; - QueuePacket(packet); - //! Log - TC_LOG_DEBUG("network", "Re-enqueueing packet with opcode %s with with status STATUS_LOGGEDIN. " - "Player is currently not in world yet.", GetOpcodeNameForLogging(packet->GetOpcode()).c_str()); - } - } - else if (_player->IsInWorld() && AntiDOS.EvaluateOpcode(*packet, currentTime)) - { - sScriptMgr->OnPacketReceive(this, *packet); - (this->*opHandle.handler)(*packet); - LogUnprocessedTail(packet); - } - // lag can cause STATUS_LOGGEDIN opcodes to arrive after the player started a transfer - break; - case STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT: - if (!_player && !m_playerRecentlyLogout && !m_playerLogout) // There's a short delay between _player = null and m_playerRecentlyLogout = true during logout - LogUnexpectedOpcode(packet, "STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT", - "the player has not logged in yet and not recently logout"); - else if (AntiDOS.EvaluateOpcode(*packet, currentTime)) - { - // not expected _player or must checked in packet handler - sScriptMgr->OnPacketReceive(this, *packet); - (this->*opHandle.handler)(*packet); - LogUnprocessedTail(packet); - } - break; - case STATUS_TRANSFER: - if (!_player) - LogUnexpectedOpcode(packet, "STATUS_TRANSFER", "the player has not logged in yet"); - else if (_player->IsInWorld()) - LogUnexpectedOpcode(packet, "STATUS_TRANSFER", "the player is still in world"); - else if (AntiDOS.EvaluateOpcode(*packet, currentTime)) - { - sScriptMgr->OnPacketReceive(this, *packet); - (this->*opHandle.handler)(*packet); - LogUnprocessedTail(packet); - } - break; - case STATUS_AUTHED: - // prevent cheating with skip queue wait - if (m_inQueue) + case STATUS_LOGGEDIN: + if (!_player) + { + // skip STATUS_LOGGEDIN opcode unexpected errors if player logout sometime ago - this can be network lag delayed packets + //! If player didn't log out a while ago, it means packets are being sent while the server does not recognize + //! the client to be in world yet. We will re-add the packets to the bottom of the queue and process them later. + if (!m_playerRecentlyLogout) { - LogUnexpectedOpcode(packet, "STATUS_AUTHED", "the player not pass queue yet"); - break; + requeuePackets.push_back(packet); + deletePacket = false; + TC_LOG_DEBUG("network", "Re-enqueueing packet with opcode %s with with status STATUS_LOGGEDIN. " + "Player is currently not in world yet.", GetOpcodeNameForLogging(packet->GetOpcode()).c_str()); } - - // some auth opcodes can be recieved before STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT opcodes - // however when we recieve CMSG_CHAR_ENUM we are surely no longer during the logout process. - if (packet->GetOpcode() == CMSG_CHAR_ENUM) - m_playerRecentlyLogout = false; - - if (AntiDOS.EvaluateOpcode(*packet, currentTime)) - { - sScriptMgr->OnPacketReceive(this, *packet); - (this->*opHandle.handler)(*packet); - LogUnprocessedTail(packet); - } - break; - case STATUS_NEVER: - TC_LOG_ERROR("network.opcode", "Received not allowed opcode %s from %s", GetOpcodeNameForLogging(packet->GetOpcode()).c_str() - , GetPlayerInfo().c_str()); - break; - case STATUS_UNHANDLED: - TC_LOG_DEBUG("network.opcode", "Received not handled opcode %s from %s", GetOpcodeNameForLogging(packet->GetOpcode()).c_str() - , GetPlayerInfo().c_str()); + } + else if (_player->IsInWorld() && AntiDOS.EvaluateOpcode(*packet, currentTime)) + { + sScriptMgr->OnPacketReceive(this, *packet); + (this->*opHandle.handler)(*packet); + LogUnprocessedTail(packet); + } + // lag can cause STATUS_LOGGEDIN opcodes to arrive after the player started a transfer + break; + case STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT: + if (!_player && !m_playerRecentlyLogout && !m_playerLogout) // There's a short delay between _player = null and m_playerRecentlyLogout = true during logout + LogUnexpectedOpcode(packet, "STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT", + "the player has not logged in yet and not recently logout"); + else if (AntiDOS.EvaluateOpcode(*packet, currentTime)) + { + // not expected _player or must checked in packet hanlder + sScriptMgr->OnPacketReceive(this, *packet); + (this->*opHandle.handler)(*packet); + LogUnprocessedTail(packet); + } + break; + case STATUS_TRANSFER: + if (!_player) + LogUnexpectedOpcode(packet, "STATUS_TRANSFER", "the player has not logged in yet"); + else if (_player->IsInWorld()) + LogUnexpectedOpcode(packet, "STATUS_TRANSFER", "the player is still in world"); + else if(AntiDOS.EvaluateOpcode(*packet, currentTime)) + { + sScriptMgr->OnPacketReceive(this, *packet); + (this->*opHandle.handler)(*packet); + LogUnprocessedTail(packet); + } + break; + case STATUS_AUTHED: + // prevent cheating with skip queue wait + if (m_inQueue) + { + LogUnexpectedOpcode(packet, "STATUS_AUTHED", "the player not pass queue yet"); break; - } - } - catch (ByteBufferException const&) - { - TC_LOG_ERROR("misc", "WorldSession::Update ByteBufferException occured while parsing a packet (opcode: %u) from client %s, accountid=%i. Skipped packet.", - packet->GetOpcode(), GetRemoteAddress().c_str(), GetAccountId()); - packet->hexlike(); + } + + // some auth opcodes can be recieved before STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT opcodes + // however when we recieve CMSG_CHAR_ENUM we are surely no longer during the logout process. + if (packet->GetOpcode() == CMSG_CHAR_ENUM) + m_playerRecentlyLogout = false; + + if (AntiDOS.EvaluateOpcode(*packet, currentTime)) + { + sScriptMgr->OnPacketReceive(this, *packet); + (this->*opHandle.handler)(*packet); + LogUnprocessedTail(packet); + } + break; + case STATUS_NEVER: + TC_LOG_ERROR("network.opcode", "Received not allowed opcode %s from %s", GetOpcodeNameForLogging(packet->GetOpcode()).c_str() + , GetPlayerInfo().c_str()); + break; + case STATUS_UNHANDLED: + TC_LOG_DEBUG("network.opcode", "Received not handled opcode %s from %s", GetOpcodeNameForLogging(packet->GetOpcode()).c_str() + , GetPlayerInfo().c_str()); + break; } } + catch (ByteBufferException const&) + { + TC_LOG_ERROR("network", "WorldSession::Update ByteBufferException occured while parsing a packet (opcode: %u) from client %s, accountid=%i. Skipped packet.", + packet->GetOpcode(), GetRemoteAddress().c_str(), GetAccountId()); + packet->hexlike(); + } if (deletePacket) delete packet; @@ -400,6 +380,8 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater) break; } + _recvQueue.readd(requeuePackets.begin(), requeuePackets.end()); + if (m_Socket && m_Socket->IsOpen() && _warden) _warden->Update(); @@ -1220,7 +1202,7 @@ void WorldSession::LoadPermissions() uint32 id = GetAccountId(); uint8 secLevel = GetSecurity(); - _RBACData = new rbac::RBACData(id, _accountName, realmID, secLevel); + _RBACData = new rbac::RBACData(id, _accountName, realm.Id.Realm, secLevel); _RBACData->LoadFromDB(); } @@ -1230,9 +1212,9 @@ PreparedQueryResultFuture WorldSession::LoadPermissionsAsync() uint8 secLevel = GetSecurity(); TC_LOG_DEBUG("rbac", "WorldSession::LoadPermissions [AccountId: %u, Name: %s, realmId: %d, secLevel: %u]", - id, _accountName.c_str(), realmID, secLevel); + id, _accountName.c_str(), realm.Id.Realm, secLevel); - _RBACData = new rbac::RBACData(id, _accountName, realmID, secLevel); + _RBACData = new rbac::RBACData(id, _accountName, realm.Id.Realm, secLevel); return _RBACData->LoadFromDBAsync(); } @@ -1310,7 +1292,7 @@ bool WorldSession::HasPermission(uint32 permission) bool hasPermission = _RBACData->HasPermission(permission); TC_LOG_DEBUG("rbac", "WorldSession::HasPermission [AccountId: %u, Name: %s, realmId: %d]", - _RBACData->GetId(), _RBACData->GetName().c_str(), realmID); + _RBACData->GetId(), _RBACData->GetName().c_str(), realm.Id.Realm); return hasPermission; } @@ -1318,7 +1300,7 @@ bool WorldSession::HasPermission(uint32 permission) void WorldSession::InvalidateRBACData() { TC_LOG_DEBUG("rbac", "WorldSession::Invalidaterbac::RBACData [AccountId: %u, Name: %s, realmId: %d]", - _RBACData->GetId(), _RBACData->GetName().c_str(), realmID); + _RBACData->GetId(), _RBACData->GetName().c_str(), realm.Id.Realm); delete _RBACData; _RBACData = NULL; } diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 2253b6bc684..d98143fcec0 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -264,7 +264,7 @@ class WorldSession void ReadMovementInfo(WorldPacket& data, MovementInfo* mi); void WriteMovementInfo(WorldPacket* data, MovementInfo* mi); - void SendPacket(WorldPacket* packet); + void SendPacket(WorldPacket const* packet); void SendNotification(const char *format, ...) ATTR_PRINTF(2, 3); void SendNotification(uint32 string_id, ...); void SendPetNameInvalid(uint32 error, std::string const& name, DeclinedName *declinedName); diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index a2d357cbc4d..e3c6179a34a 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -25,6 +25,17 @@ #include <memory> +class EncryptablePacket : public WorldPacket +{ +public: + EncryptablePacket(WorldPacket const& packet, bool encrypt) : WorldPacket(packet), _encrypt(encrypt) { } + + bool NeedsEncryption() const { return _encrypt; } + +private: + bool _encrypt; +}; + using boost::asio::ip::tcp; WorldSocket::WorldSocket(tcp::socket&& socket) @@ -40,11 +51,8 @@ void WorldSocket::Start() stmt->setString(0, ip_address); stmt->setUInt32(1, inet_addr(ip_address.c_str())); - { - std::lock_guard<std::mutex> guard(_queryLock); - _queryCallback = io_service().wrap(std::bind(&WorldSocket::CheckIpCallback, this, std::placeholders::_1)); - _queryFuture = LoginDatabase.AsyncQuery(stmt); - } + _queryCallback = std::bind(&WorldSocket::CheckIpCallback, this, std::placeholders::_1); + _queryFuture = LoginDatabase.AsyncQuery(stmt); } void WorldSocket::CheckIpCallback(PreparedQueryResult result) @@ -78,17 +86,50 @@ void WorldSocket::CheckIpCallback(PreparedQueryResult result) bool WorldSocket::Update() { + EncryptablePacket* queued; + MessageBuffer buffer; + while (_bufferQueue.Dequeue(queued)) + { + ServerPktHeader header(queued->size() + 2, queued->GetOpcode()); + if (queued->NeedsEncryption()) + _authCrypt.EncryptSend(header.header, header.getHeaderLength()); + + if (buffer.GetRemainingSpace() < queued->size() + header.getHeaderLength()) + { + QueuePacket(std::move(buffer)); + buffer.Resize(4096); + } + + if (buffer.GetRemainingSpace() >= queued->size() + header.getHeaderLength()) + { + buffer.Write(header.header, header.getHeaderLength()); + if (!queued->empty()) + buffer.Write(queued->contents(), queued->size()); + } + else // single packet larger than 4096 bytes + { + MessageBuffer packetBuffer(queued->size() + header.getHeaderLength()); + packetBuffer.Write(header.header, header.getHeaderLength()); + if (!queued->empty()) + packetBuffer.Write(queued->contents(), queued->size()); + + QueuePacket(std::move(packetBuffer)); + } + + delete queued; + } + + if (buffer.GetActiveSize() > 0) + QueuePacket(std::move(buffer)); + if (!BaseSocket::Update()) return false; + if (_queryFuture.valid() && _queryFuture.wait_for(std::chrono::seconds(0)) == std::future_status::ready) { - std::lock_guard<std::mutex> guard(_queryLock); - if (_queryFuture.valid() && _queryFuture.wait_for(std::chrono::seconds(0)) == std::future_status::ready) - { - auto callback = std::move(_queryCallback); - _queryCallback = nullptr; - callback(_queryFuture.get()); - } + auto callback = _queryCallback; + _queryCallback = nullptr; + callback(_queryFuture.get()); } return true; @@ -351,29 +392,7 @@ void WorldSocket::SendPacket(WorldPacket const& packet) if (sPacketLog->CanLogPacket()) sPacketLog->LogPacket(packet, SERVER_TO_CLIENT, GetRemoteIpAddress(), GetRemotePort()); - ServerPktHeader header(packet.size() + 2, packet.GetOpcode()); - - std::unique_lock<std::mutex> guard(_writeLock); - - _authCrypt.EncryptSend(header.header, header.getHeaderLength()); - -#ifndef TC_SOCKET_USE_IOCP - if (_writeQueue.empty() && _writeBuffer.GetRemainingSpace() >= header.getHeaderLength() + packet.size()) - { - _writeBuffer.Write(header.header, header.getHeaderLength()); - if (!packet.empty()) - _writeBuffer.Write(packet.contents(), packet.size()); - } - else -#endif - { - MessageBuffer buffer(header.getHeaderLength() + packet.size()); - buffer.Write(header.header, header.getHeaderLength()); - if (!packet.empty()) - buffer.Write(packet.contents(), packet.size()); - - QueuePacket(std::move(buffer), guard); - } + _bufferQueue.Enqueue(new EncryptablePacket(packet, _authCrypt.IsInitialized())); } void WorldSocket::HandleAuthSession(WorldPacket& recvPacket) @@ -395,14 +414,11 @@ void WorldSocket::HandleAuthSession(WorldPacket& recvPacket) // Get the account information from the auth database PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_INFO_BY_NAME); - stmt->setInt32(0, int32(realmID)); + stmt->setInt32(0, int32(realm.Id.Realm)); stmt->setString(1, authSession->Account); - { - std::lock_guard<std::mutex> guard(_queryLock); - _queryCallback = io_service().wrap(std::bind(&WorldSocket::HandleAuthSessionCallback, this, authSession, std::placeholders::_1)); - _queryFuture = LoginDatabase.AsyncQuery(stmt); - } + _queryCallback = std::bind(&WorldSocket::HandleAuthSessionCallback, this, authSession, std::placeholders::_1); + _queryFuture = LoginDatabase.AsyncQuery(stmt); } void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<AuthSession> authSession, PreparedQueryResult result) @@ -441,10 +457,11 @@ void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<AuthSession> authSes return; } - if (authSession->RealmID != realmID) + if (authSession->RealmID != realm.Id.Realm) { SendAuthResponseError(REALM_LIST_REALM_NOT_FOUND); - TC_LOG_ERROR("network", "WorldSocket::HandleAuthSession: Sent Auth Response (bad realm)."); + TC_LOG_ERROR("network", "WorldSocket::HandleAuthSession: Client %s requested connecting with realm id %u but this realm has id %u set in config.", + GetRemoteIpAddress().to_string().c_str(), authSession->RealmID, realm.Id.Realm); DelayedCloseSocket(); return; } @@ -559,7 +576,7 @@ void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<AuthSession> authSes if (wardenActive) _worldSession->InitWarden(&account.SessionKey, account.OS); - _queryCallback = io_service().wrap(std::bind(&WorldSocket::LoadSessionPermissionsCallback, this, std::placeholders::_1)); + _queryCallback = std::bind(&WorldSocket::LoadSessionPermissionsCallback, this, std::placeholders::_1); _queryFuture = _worldSession->LoadPermissionsAsync(); AsyncRead(); } diff --git a/src/server/game/Server/WorldSocket.h b/src/server/game/Server/WorldSocket.h index 9e5b35992a6..9b36e458511 100644 --- a/src/server/game/Server/WorldSocket.h +++ b/src/server/game/Server/WorldSocket.h @@ -26,11 +26,12 @@ #include "Util.h" #include "WorldPacket.h" #include "WorldSession.h" +#include "MPSCQueue.h" #include <chrono> #include <boost/asio/ip/tcp.hpp> -#include <boost/asio/buffer.hpp> using boost::asio::ip::tcp; +class EncryptablePacket; #pragma pack(push, 1) @@ -104,8 +105,8 @@ private: MessageBuffer _headerBuffer; MessageBuffer _packetBuffer; + MPSCQueue<EncryptablePacket> _bufferQueue; - std::mutex _queryLock; PreparedQueryResultFuture _queryFuture; std::function<void(PreparedQueryResult&&)> _queryCallback; std::string _ipCountry; diff --git a/src/server/game/Server/WorldSocketMgr.cpp b/src/server/game/Server/WorldSocketMgr.cpp index 529396b3966..cbdb6a4a70b 100644 --- a/src/server/game/Server/WorldSocketMgr.cpp +++ b/src/server/game/Server/WorldSocketMgr.cpp @@ -24,9 +24,9 @@ #include <boost/system/error_code.hpp> -static void OnSocketAccept(tcp::socket&& sock) +static void OnSocketAccept(tcp::socket&& sock, uint32 threadIndex) { - sWorldSocketMgr.OnSocketOpen(std::forward<tcp::socket>(sock)); + sWorldSocketMgr.OnSocketOpen(std::forward<tcp::socket>(sock), threadIndex); } class WorldSocketThread : public NetworkThread<WorldSocket> @@ -47,6 +47,12 @@ WorldSocketMgr::WorldSocketMgr() : BaseSocketMgr(), _socketSendBufferSize(-1), m { } +WorldSocketMgr& WorldSocketMgr::Instance() +{ + static WorldSocketMgr instance; + return instance; +} + bool WorldSocketMgr::StartNetwork(boost::asio::io_service& service, std::string const& bindIp, uint16 port) { _tcpNoDelay = sConfigMgr->GetBoolDefault("Network.TcpNodelay", true); @@ -67,7 +73,9 @@ bool WorldSocketMgr::StartNetwork(boost::asio::io_service& service, std::string BaseSocketMgr::StartNetwork(service, bindIp, port); - _acceptor->AsyncAcceptManaged(&OnSocketAccept); + _acceptor->SetSocketFactory(std::bind(&BaseSocketMgr::GetSocketForAccept, this)); + + _acceptor->AsyncAcceptWithCallback<&OnSocketAccept>(); sScriptMgr->OnNetworkStart(); return true; @@ -80,7 +88,7 @@ void WorldSocketMgr::StopNetwork() sScriptMgr->OnNetworkStop(); } -void WorldSocketMgr::OnSocketOpen(tcp::socket&& sock) +void WorldSocketMgr::OnSocketOpen(tcp::socket&& sock, uint32 threadIndex) { // set some options here if (_socketSendBufferSize >= 0) @@ -108,7 +116,7 @@ void WorldSocketMgr::OnSocketOpen(tcp::socket&& sock) //sock->m_OutBufferSize = static_cast<size_t> (m_SockOutUBuff); - BaseSocketMgr::OnSocketOpen(std::forward<tcp::socket>(sock)); + BaseSocketMgr::OnSocketOpen(std::forward<tcp::socket>(sock), threadIndex); } NetworkThread<WorldSocket>* WorldSocketMgr::CreateThreads() const diff --git a/src/server/game/Server/WorldSocketMgr.h b/src/server/game/Server/WorldSocketMgr.h index 92a28d0c135..fddf3bee4c6 100644 --- a/src/server/game/Server/WorldSocketMgr.h +++ b/src/server/game/Server/WorldSocketMgr.h @@ -35,11 +35,7 @@ class WorldSocketMgr : public SocketMgr<WorldSocket> typedef SocketMgr<WorldSocket> BaseSocketMgr; public: - static WorldSocketMgr& Instance() - { - static WorldSocketMgr instance; - return instance; - } + static WorldSocketMgr& Instance(); /// Start network, listen at address:port . bool StartNetwork(boost::asio::io_service& service, std::string const& bindIp, uint16 port) override; @@ -47,7 +43,7 @@ public: /// Stops all network threads, It will wait for all running threads . void StopNetwork() override; - void OnSocketOpen(tcp::socket&& sock) override; + void OnSocketOpen(tcp::socket&& sock, uint32 threadIndex) override; protected: WorldSocketMgr(); diff --git a/src/server/game/Skills/SkillDiscovery.cpp b/src/server/game/Skills/SkillDiscovery.cpp index 36a7d147192..8860b391f48 100644 --- a/src/server/game/Skills/SkillDiscovery.cpp +++ b/src/server/game/Skills/SkillDiscovery.cpp @@ -88,7 +88,7 @@ void LoadSkillDiscoveryTable() { if (reportedReqSpells.find(absReqSkillOrSpell) == reportedReqSpells.end()) { - TC_LOG_ERROR("sql.sql", "Spell (ID: %u) have not existed spell (ID: %i) in `reqSpell` field in `skill_discovery_template` table", spellId, reqSkillOrSpell); + TC_LOG_ERROR("sql.sql", "Spell (ID: %u) has a non-existing spell (ID: %i) in `reqSpell` field in the `skill_discovery_template` table.", spellId, reqSkillOrSpell); reportedReqSpells.insert(absReqSkillOrSpell); } continue; @@ -101,8 +101,8 @@ void LoadSkillDiscoveryTable() { if (reportedReqSpells.find(absReqSkillOrSpell) == reportedReqSpells.end()) { - TC_LOG_ERROR("sql.sql", "Spell (ID: %u) not have MECHANIC_DISCOVERY (28) value in Mechanic field in spell.dbc" - " and not 100%% chance random discovery ability but listed for spellId %u (and maybe more) in `skill_discovery_template` table", + TC_LOG_ERROR("sql.sql", "Spell (ID: %u) does not have any MECHANIC_DISCOVERY (28) value in the Mechanic field in spell.dbc" + " nor 100%% chance random discovery ability, but is listed for spellId %u (and maybe more) in the `skill_discovery_template` table.", absReqSkillOrSpell, spellId); reportedReqSpells.insert(absReqSkillOrSpell); } @@ -117,7 +117,7 @@ void LoadSkillDiscoveryTable() if (bounds.first == bounds.second) { - TC_LOG_ERROR("sql.sql", "Spell (ID: %u) not listed in `SkillLineAbility.dbc` but listed with `reqSpell`=0 in `skill_discovery_template` table", spellId); + TC_LOG_ERROR("sql.sql", "Spell (ID: %u) is not listed in `SkillLineAbility.dbc`, but listed with `reqSpell`= 0 in the `skill_discovery_template` table.", spellId); continue; } @@ -126,7 +126,7 @@ void LoadSkillDiscoveryTable() } else { - TC_LOG_ERROR("sql.sql", "Spell (ID: %u) have negative value in `reqSpell` field in `skill_discovery_template` table", spellId); + TC_LOG_ERROR("sql.sql", "Spell (ID: %u) has a negative value in `reqSpell` field in the `skill_discovery_template` table.", spellId); continue; } @@ -135,7 +135,7 @@ void LoadSkillDiscoveryTable() while (result->NextRow()); if (!ssNonDiscoverableEntries.str().empty()) - TC_LOG_ERROR("sql.sql", "Some items can't be successfully discovered: have in chance field value < 0.000001 in `skill_discovery_template` DB table . List:\n%s", ssNonDiscoverableEntries.str().c_str()); + TC_LOG_ERROR("sql.sql", "Some items can't be successfully discovered, their chance field value is < 0.000001 in the `skill_discovery_template` DB table. List:\n%s", ssNonDiscoverableEntries.str().c_str()); // report about empty data for explicit discovery spells for (uint32 spell_id = 1; spell_id < sSpellMgr->GetSpellInfoStoreSize(); ++spell_id) @@ -149,10 +149,10 @@ void LoadSkillDiscoveryTable() continue; if (SkillDiscoveryStore.find(int32(spell_id)) == SkillDiscoveryStore.end()) - TC_LOG_ERROR("sql.sql", "Spell (ID: %u) is 100%% chance random discovery ability but not have data in `skill_discovery_template` table", spell_id); + TC_LOG_ERROR("sql.sql", "Spell (ID: %u) has got 100%% chance random discovery ability, but does not have data in the `skill_discovery_template` table.", spell_id); } - TC_LOG_INFO("server.loading", ">> Loaded %u skill discovery definitions in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u skill discovery definitions in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } uint32 GetExplicitDiscoverySpell(uint32 spellId, Player* player) diff --git a/src/server/game/Skills/SkillExtraItems.cpp b/src/server/game/Skills/SkillExtraItems.cpp index 5213944cc90..f76e4623137 100644 --- a/src/server/game/Skills/SkillExtraItems.cpp +++ b/src/server/game/Skills/SkillExtraItems.cpp @@ -74,28 +74,28 @@ void LoadSkillPerfectItemTable() if (!sSpellMgr->GetSpellInfo(spellId)) { - TC_LOG_ERROR("sql.sql", "Skill perfection data for spell %u has non-existent spell id in `skill_perfect_item_template`!", spellId); + TC_LOG_ERROR("sql.sql", "Skill perfection data for spell %u has a non-existing spell id in the `skill_perfect_item_template`!", spellId); continue; } uint32 requiredSpecialization = fields[1].GetUInt32(); if (!sSpellMgr->GetSpellInfo(requiredSpecialization)) { - TC_LOG_ERROR("sql.sql", "Skill perfection data for spell %u has non-existent required specialization spell id %u in `skill_perfect_item_template`!", spellId, requiredSpecialization); + TC_LOG_ERROR("sql.sql", "Skill perfection data for spell %u has a non-existing required specialization spell id %u in the `skill_perfect_item_template`!", spellId, requiredSpecialization); continue; } float perfectCreateChance = fields[2].GetFloat(); if (perfectCreateChance <= 0.0f) { - TC_LOG_ERROR("sql.sql", "Skill perfection data for spell %u has impossibly low proc chance in `skill_perfect_item_template`!", spellId); + TC_LOG_ERROR("sql.sql", "Skill perfection data for spell %u has impossibly low proc chance in the `skill_perfect_item_template`!", spellId); continue; } uint32 perfectItemType = fields[3].GetUInt32(); if (!sObjectMgr->GetItemTemplate(perfectItemType)) { - TC_LOG_ERROR("sql.sql", "Skill perfection data for spell %u references non-existent perfect item id %u in `skill_perfect_item_template`!", spellId, perfectItemType); + TC_LOG_ERROR("sql.sql", "Skill perfection data for spell %u references a non-existing perfect item id %u in the `skill_perfect_item_template`!", spellId, perfectItemType); continue; } @@ -109,7 +109,7 @@ void LoadSkillPerfectItemTable() } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u spell perfection definitions in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u spell perfection definitions in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); } // struct to store information about extra item creation @@ -161,28 +161,28 @@ void LoadSkillExtraItemTable() if (!sSpellMgr->GetSpellInfo(spellId)) { - TC_LOG_ERROR("sql.sql", "Skill specialization %u has non-existent spell id in `skill_extra_item_template`!", spellId); + TC_LOG_ERROR("sql.sql", "Skill specialization %u has a non-existing spell id in the `skill_extra_item_template`!", spellId); continue; } uint32 requiredSpecialization = fields[1].GetUInt32(); if (!sSpellMgr->GetSpellInfo(requiredSpecialization)) { - TC_LOG_ERROR("sql.sql", "Skill specialization %u have not existed required specialization spell id %u in `skill_extra_item_template`!", spellId, requiredSpecialization); + TC_LOG_ERROR("sql.sql", "Skill specialization %u has a non-existing required specialization spell id %u in the `skill_extra_item_template`!", spellId, requiredSpecialization); continue; } float additionalCreateChance = fields[2].GetFloat(); if (additionalCreateChance <= 0.0f) { - TC_LOG_ERROR("sql.sql", "Skill specialization %u has too low additional create chance in `skill_extra_item_template`!", spellId); + TC_LOG_ERROR("sql.sql", "Skill specialization %u has too low additional create chance in the `skill_extra_item_template`!", spellId); continue; } uint8 additionalMaxNum = fields[3].GetUInt8(); if (!additionalMaxNum) { - TC_LOG_ERROR("sql.sql", "Skill specialization %u has 0 max number of extra items in `skill_extra_item_template`!", spellId); + TC_LOG_ERROR("sql.sql", "Skill specialization %u has 0 max number of extra items in the `skill_extra_item_template`!", spellId); continue; } diff --git a/src/server/game/Spells/Auras/SpellAuras.h b/src/server/game/Spells/Auras/SpellAuras.h index 2180f524194..da075fa25cd 100644 --- a/src/server/game/Spells/Auras/SpellAuras.h +++ b/src/server/game/Spells/Auras/SpellAuras.h @@ -310,7 +310,7 @@ class ChargeDropEvent : public BasicEvent friend class Aura; protected: ChargeDropEvent(Aura* base, AuraRemoveMode mode) : _base(base), _mode(mode) { } - bool Execute(uint64 /*e_time*/, uint32 /*p_time*/); + bool Execute(uint64 /*e_time*/, uint32 /*p_time*/) override; private: Aura* _base; diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 9535ca291eb..f9bf33553cc 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -893,7 +893,7 @@ void Spell::EffectTriggerMissileSpell(SpellEffIndex effIndex) SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(triggered_spell_id); if (!spellInfo) { - TC_LOG_ERROR("spells", "Spell::EffectTriggerMissileSpell spell %u tried to trigger unknown spell %u", m_spellInfo->Id, triggered_spell_id); + TC_LOG_ERROR("spells", "Spell::EffectTriggerMissileSpell spell %u tried to trigger unknown spell %u.", m_spellInfo->Id, triggered_spell_id); return; } @@ -944,7 +944,7 @@ void Spell::EffectForceCast(SpellEffIndex effIndex) if (!spellInfo) { - TC_LOG_ERROR("spells", "Spell::EffectForceCast of spell %u: triggering unknown spell id %i", m_spellInfo->Id, triggered_spell_id); + TC_LOG_ERROR("spells", "Spell::EffectForceCast of spell %u: triggering unknown spell id %i.", m_spellInfo->Id, triggered_spell_id); return; } @@ -996,7 +996,7 @@ void Spell::EffectTriggerRitualOfSummoning(SpellEffIndex effIndex) if (!spellInfo) { - TC_LOG_ERROR("spells", "EffectTriggerRitualOfSummoning of spell %u: triggering unknown spell id %i", m_spellInfo->Id, triggered_spell_id); + TC_LOG_ERROR("spells", "EffectTriggerRitualOfSummoning of spell %u: triggering unknown spell id %i.", m_spellInfo->Id, triggered_spell_id); return; } @@ -1062,7 +1062,7 @@ void Spell::EffectTeleportUnits(SpellEffIndex /*effIndex*/) // If not exist data for dest location - return if (!m_targets.HasDst()) { - TC_LOG_ERROR("spells", "Spell::EffectTeleportUnits - does not have destination for spellId %u.", m_spellInfo->Id); + TC_LOG_ERROR("spells", "Spell::EffectTeleportUnits - does not have a destination for spellId %u.", m_spellInfo->Id); return; } @@ -1393,7 +1393,7 @@ void Spell::EffectHeal(SpellEffIndex /*effIndex*/) if (!targetAura) { - TC_LOG_ERROR("spells", "Target (%s) has aurastate AURA_STATE_SWIFTMEND but no matching aura.", unitTarget->GetGUID().ToString().c_str()); + TC_LOG_ERROR("spells", "Target (%s) has the aurastate AURA_STATE_SWIFTMEND, but no matching aura.", unitTarget->GetGUID().ToString().c_str()); return; } @@ -1886,7 +1886,7 @@ void Spell::SendLoot(ObjectGuid guid, LootType loottype) // Players shouldn't be able to loot gameobjects that are currently despawned if (!gameObjTarget->isSpawned() && !player->IsGameMaster()) { - TC_LOG_ERROR("spells", "Possible hacking attempt: Player %s [guid: %u] tried to loot a gameobject [entry: %u id: %u] which is on respawn time without being in GM mode!", + TC_LOG_ERROR("spells", "Possible hacking attempt: Player %s [guid: %u] tried to loot a gameobject [entry: %u id: %u] which is on respawn timer without being in GM mode!", player->GetName().c_str(), player->GetGUID().GetCounter(), gameObjTarget->GetEntry(), gameObjTarget->GetGUID().GetCounter()); return; } @@ -2191,7 +2191,7 @@ void Spell::EffectSummonType(SpellEffIndex effIndex) SummonPropertiesEntry const* properties = sSummonPropertiesStore.LookupEntry(m_spellInfo->Effects[effIndex].MiscValueB); if (!properties) { - TC_LOG_ERROR("spells", "EffectSummonType: Unhandled summon type %u", m_spellInfo->Effects[effIndex].MiscValueB); + TC_LOG_ERROR("spells", "EffectSummonType: Unhandled summon type %u.", m_spellInfo->Effects[effIndex].MiscValueB); return; } @@ -2379,7 +2379,7 @@ void Spell::EffectLearnSpell(SpellEffIndex effIndex) uint32 spellToLearn = (m_spellInfo->Id == 483 || m_spellInfo->Id == 55884) ? damage : m_spellInfo->Effects[effIndex].TriggerSpell; player->LearnSpell(spellToLearn, false); - TC_LOG_DEBUG("spells", "Spell: Player %u has learned spell %u from NpcGUID=%u", player->GetGUID().GetCounter(), spellToLearn, m_caster->GetGUID().GetCounter()); + TC_LOG_DEBUG("spells", "Spell: Player %u has learned spell %u from NpcGUID: %u", player->GetGUID().GetCounter(), spellToLearn, m_caster->GetGUID().GetCounter()); } void Spell::EffectDispel(SpellEffIndex effIndex) @@ -2758,7 +2758,7 @@ void Spell::EffectEnchantItemPrismatic(SpellEffIndex effIndex) } if (!add_socket) { - TC_LOG_ERROR("spells", "Spell::EffectEnchantItemPrismatic: attempt apply enchant spell %u with SPELL_EFFECT_ENCHANT_ITEM_PRISMATIC (%u) but without ITEM_ENCHANTMENT_TYPE_PRISMATIC_SOCKET (%u), not suppoted yet.", + TC_LOG_ERROR("spells", "Spell::EffectEnchantItemPrismatic: attempt to apply the enchant spell %u with SPELL_EFFECT_ENCHANT_ITEM_PRISMATIC (%u), but without ITEM_ENCHANTMENT_TYPE_PRISMATIC_SOCKET (%u), not supported yet.", m_spellInfo->Id, SPELL_EFFECT_ENCHANT_ITEM_PRISMATIC, ITEM_ENCHANTMENT_TYPE_PRISMATIC_SOCKET); return; } @@ -2823,7 +2823,7 @@ void Spell::EffectEnchantItemTmp(SpellEffIndex effIndex) case 10: spell_id = 36758; break; // 14% case 11: spell_id = 36760; break; // 20% default: - TC_LOG_ERROR("spells", "Spell::EffectEnchantItemTmp: Damage %u not handled in S'RW", damage); + TC_LOG_ERROR("spells", "Spell::EffectEnchantItemTmp: Damage %u not handled in S'RW.", damage); return; } @@ -2857,14 +2857,14 @@ void Spell::EffectEnchantItemTmp(SpellEffIndex effIndex) if (!enchant_id) { - TC_LOG_ERROR("spells", "Spell %u Effect %u (SPELL_EFFECT_ENCHANT_ITEM_TEMPORARY) have 0 as enchanting id", m_spellInfo->Id, effIndex); + TC_LOG_ERROR("spells", "Spell %u Effect %u (SPELL_EFFECT_ENCHANT_ITEM_TEMPORARY) has enchanting id 0.", m_spellInfo->Id, effIndex); return; } SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id); if (!pEnchant) { - TC_LOG_ERROR("spells", "Spell %u Effect %u (SPELL_EFFECT_ENCHANT_ITEM_TEMPORARY) have not existed enchanting id %u ", m_spellInfo->Id, effIndex, enchant_id); + TC_LOG_ERROR("spells", "Spell %u Effect %u (SPELL_EFFECT_ENCHANT_ITEM_TEMPORARY) has a non-existing enchanting id %u ", m_spellInfo->Id, effIndex, enchant_id); return; } @@ -3980,7 +3980,7 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex) case 31893: spell_heal = 48084; break; case 31883: spell_heal = 48085; break; default: - TC_LOG_ERROR("spells", "Unknown Lightwell spell caster %u", m_caster->GetEntry()); + TC_LOG_ERROR("spells", "Unknown Lightwell spell caster %u.", m_caster->GetEntry()); return; } @@ -4219,7 +4219,7 @@ void Spell::EffectStuck(SpellEffIndex /*effIndex*/) return; TC_LOG_DEBUG("spells", "Spell Effect: Stuck"); - TC_LOG_DEBUG("spells", "Player %s (guid %u) used auto-unstuck future at map %u (%f, %f, %f)", player->GetName().c_str(), player->GetGUID().GetCounter(), player->GetMapId(), player->GetPositionX(), player->GetPositionY(), player->GetPositionZ()); + TC_LOG_DEBUG("spells", "Player %s (guid %u) used the auto-unstuck feature at map %u (%f, %f, %f).", player->GetName().c_str(), player->GetGUID().GetCounter(), player->GetMapId(), player->GetPositionX(), player->GetPositionY(), player->GetPositionZ()); if (player->IsInFlight()) return; @@ -5101,7 +5101,7 @@ void Spell::EffectTransmitted(SpellEffIndex effIndex) if (!goinfo) { - TC_LOG_ERROR("sql.sql", "Gameobject (Entry: %u) not exist and not created at spell (ID: %u) cast", name_id, m_spellInfo->Id); + TC_LOG_ERROR("sql.sql", "Gameobject (Entry: %u) does not exist and is not created by spell (ID: %u) cast.", name_id, m_spellInfo->Id); return; } @@ -5742,7 +5742,7 @@ void Spell::EffectPlayMusic(SpellEffIndex effIndex) if (!sSoundEntriesStore.LookupEntry(soundid)) { - TC_LOG_ERROR("spells", "EffectPlayMusic: Sound (Id: %u) not exist in spell %u.", soundid, m_spellInfo->Id); + TC_LOG_ERROR("spells", "EffectPlayMusic: Sound (Id: %u) does not exist in spell %u.", soundid, m_spellInfo->Id); return; } @@ -5799,7 +5799,7 @@ void Spell::EffectPlaySound(SpellEffIndex effIndex) if (!sSoundEntriesStore.LookupEntry(soundId)) { - TC_LOG_ERROR("spells", "EffectPlaySound: Sound (Id: %u) not exist in spell %u.", soundId, m_spellInfo->Id); + TC_LOG_ERROR("spells", "EffectPlaySound: Sound (Id: %u) does not exist in spell %u.", soundId, m_spellInfo->Id); return; } diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index f5bb1c920fe..8bb0e401a6c 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -353,6 +353,12 @@ SpellMgr::~SpellMgr() UnloadSpellInfoStore(); } +SpellMgr* SpellMgr::instance() +{ + static SpellMgr instance; + return &instance; +} + /// Some checks for spells, to prevent adding deprecated/broken spells for trainers, spell book, etc bool SpellMgr::IsSpellValid(SpellInfo const* spellInfo, Player* player, bool msg) { @@ -376,29 +382,29 @@ bool SpellMgr::IsSpellValid(SpellInfo const* spellInfo, Player* player, bool msg { if (spellInfo->Effects[i].ItemType == 0) { - // skip auto-loot crafting spells, its not need explicit item info (but have special fake items sometime) + // skip auto-loot crafting spells, it does not need explicit item info (but has special fake items sometimes). if (!spellInfo->IsLootCrafting()) { if (msg) { if (player) - ChatHandler(player->GetSession()).PSendSysMessage("Craft spell %u not have create item entry.", spellInfo->Id); + ChatHandler(player->GetSession()).PSendSysMessage("The craft spell %u does not have a create item entry.", spellInfo->Id); else - TC_LOG_ERROR("sql.sql", "Craft spell %u not have create item entry.", spellInfo->Id); + TC_LOG_ERROR("sql.sql", "The craft spell %u does not have a create item entry.", spellInfo->Id); } return false; } } - // also possible IsLootCrafting case but fake item must exist anyway + // also possible IsLootCrafting case but fake items must exist anyway else if (!sObjectMgr->GetItemTemplate(spellInfo->Effects[i].ItemType)) { if (msg) { if (player) - ChatHandler(player->GetSession()).PSendSysMessage("Craft spell %u create not-exist in DB item (Entry: %u) and then...", spellInfo->Id, spellInfo->Effects[i].ItemType); + ChatHandler(player->GetSession()).PSendSysMessage("Craft spell %u has created a non-existing item in DB (Entry: %u) and then...", spellInfo->Id, spellInfo->Effects[i].ItemType); else - TC_LOG_ERROR("sql.sql", "Craft spell %u create not-exist in DB item (Entry: %u) and then...", spellInfo->Id, spellInfo->Effects[i].ItemType); + TC_LOG_ERROR("sql.sql", "Craft spell %u has created a non-existing item in DB (Entry: %u) and then...", spellInfo->Id, spellInfo->Effects[i].ItemType); } return false; } @@ -434,9 +440,9 @@ bool SpellMgr::IsSpellValid(SpellInfo const* spellInfo, Player* player, bool msg if (msg) { if (player) - ChatHandler(player->GetSession()).PSendSysMessage("Craft spell %u have not-exist reagent in DB item (Entry: %u) and then...", spellInfo->Id, spellInfo->Reagent[j]); + ChatHandler(player->GetSession()).PSendSysMessage("Craft spell %u refers a non-existing reagent in DB item (Entry: %u) and then...", spellInfo->Id, spellInfo->Reagent[j]); else - TC_LOG_ERROR("sql.sql", "Craft spell %u have not-exist reagent in DB item (Entry: %u) and then...", spellInfo->Id, spellInfo->Reagent[j]); + TC_LOG_ERROR("sql.sql", "Craft spell %u refers to a non-existing reagent in DB, item (Entry: %u) and then...", spellInfo->Id, spellInfo->Reagent[j]); } return false; } @@ -455,7 +461,7 @@ uint32 SpellMgr::GetSpellDifficultyId(uint32 spellId) const void SpellMgr::SetSpellDifficultyId(uint32 spellId, uint32 id) { if (uint32 i = GetSpellDifficultyId(spellId)) - TC_LOG_ERROR("spells", "SpellMgr::SetSpellDifficultyId: Spell %u has already spellDifficultyId %u. Will override with spellDifficultyId %u.", spellId, i, id); + TC_LOG_ERROR("spells", "SpellMgr::SetSpellDifficultyId: The spell %u already has spellDifficultyId %u. Will override with spellDifficultyId %u.", spellId, i, id); mSpellDifficultySearcherMap[spellId] = id; } @@ -470,7 +476,7 @@ uint32 SpellMgr::GetSpellIdForDifficulty(uint32 spellId, Unit const* caster) con uint32 mode = uint32(caster->GetMap()->GetSpawnMode()); if (mode >= MAX_DIFFICULTY) { - TC_LOG_ERROR("spells", "SpellMgr::GetSpellIdForDifficulty: Incorrect Difficulty for spell %u.", spellId); + TC_LOG_ERROR("spells", "SpellMgr::GetSpellIdForDifficulty: Incorrect difficulty for spell %u.", spellId); return spellId; //return source spell } @@ -481,7 +487,7 @@ uint32 SpellMgr::GetSpellIdForDifficulty(uint32 spellId, Unit const* caster) con SpellDifficultyEntry const* difficultyEntry = sSpellDifficultyStore.LookupEntry(difficultyId); if (!difficultyEntry) { - TC_LOG_ERROR("spells", "SpellMgr::GetSpellIdForDifficulty: SpellDifficultyEntry not found for spell %u. This should never happen.", spellId); + TC_LOG_ERROR("spells", "SpellMgr::GetSpellIdForDifficulty: SpellDifficultyEntry was not found for spell %u. This should never happen.", spellId); return spellId; //return source spell } @@ -874,7 +880,7 @@ bool SpellMgr::IsSpellProcEventCanTriggeredBy(SpellInfo const* spellProto, Spell // For melee triggers if (procSpell == NULL) { - // Check (if set) for school (melee attack have Normal school) + // Check (if set) for school (melee attack has Normal school) if (spellProcEvent->schoolMask && (spellProcEvent->schoolMask & SPELL_SCHOOL_MASK_NORMAL) == 0) return false; } @@ -894,7 +900,7 @@ bool SpellMgr::IsSpellProcEventCanTriggeredBy(SpellInfo const* spellProto, Spell if (!(spellProcEvent->spellFamilyMask & procSpell->SpellFamilyFlags)) return false; hasFamilyMask = true; - // Some spells are not considered as active even with have spellfamilyflags + // Some spells are not considered as active even with spellfamilyflags set if (!(procEvent_procEx & PROC_EX_ONLY_ACTIVE_SPELL)) active = true; } @@ -1121,27 +1127,27 @@ SpellAreaForAreaMapBounds SpellMgr::GetSpellAreaForAreaMapBounds(uint32 area_id) bool SpellArea::IsFitToRequirements(Player const* player, uint32 newZone, uint32 newArea) const { - if (gender != GENDER_NONE) // not in expected gender + if (gender != GENDER_NONE) // is not expected gender if (!player || gender != player->getGender()) return false; - if (raceMask) // not in expected race + if (raceMask) // is not expected race if (!player || !(raceMask & player->getRaceMask())) return false; - if (areaId) // not in expected zone + if (areaId) // is not in expected zone if (newZone != areaId && newArea != areaId) return false; - if (questStart) // not in expected required quest state + if (questStart) // is not in expected required quest state if (!player || (((1 << player->GetQuestStatus(questStart)) & questStartStatus) == 0)) return false; - if (questEnd) // not in expected forbidden quest state + if (questEnd) // is not in expected forbidden quest state if (!player || (((1 << player->GetQuestStatus(questEnd)) & questEndStatus) == 0)) return false; - if (auraSpell) // not have expected aura + if (auraSpell) // does not have expected aura if (!player || (auraSpell > 0 && !player->HasAura(auraSpell)) || (auraSpell < 0 && player->HasAura(-auraSpell))) return false; @@ -1341,7 +1347,7 @@ void SpellMgr::LoadSpellRanks() SpellInfo const* first = GetSpellInfo(lastSpell); if (!first) { - TC_LOG_ERROR("sql.sql", "Spell rank identifier(first_spell_id) %u listed in `spell_ranks` does not exist!", lastSpell); + TC_LOG_ERROR("sql.sql", "The spell rank identifier(first_spell_id) %u listed in `spell_ranks` does not exist!", lastSpell); continue; } // check if chain is long enough @@ -1358,14 +1364,14 @@ void SpellMgr::LoadSpellRanks() SpellInfo const* spell = GetSpellInfo(itr->first); if (!spell) { - TC_LOG_ERROR("sql.sql", "Spell %u (rank %u) listed in `spell_ranks` for chain %u does not exist!", itr->first, itr->second, lastSpell); + TC_LOG_ERROR("sql.sql", "The spell %u (rank %u) listed in `spell_ranks` for chain %u does not exist!", itr->first, itr->second, lastSpell); valid = false; break; } ++curRank; if (itr->second != curRank) { - TC_LOG_ERROR("sql.sql", "Spell %u (rank %u) listed in `spell_ranks` for chain %u does not have proper rank value(should be %u)!", itr->first, itr->second, lastSpell, curRank); + TC_LOG_ERROR("sql.sql", "The spell %u (rank %u) listed in `spell_ranks` for chain %u does not have a proper rank value (should be %u)!", itr->first, itr->second, lastSpell, curRank); valid = false; break; } @@ -1381,7 +1387,7 @@ void SpellMgr::LoadSpellRanks() int32 addedSpell = itr->first; if (mSpellInfoMap[addedSpell]->ChainEntry) - TC_LOG_ERROR("sql.sql", "Spell %u (rank: %u, first: %u) listed in `spell_ranks` has already ChainEntry from dbc.", addedSpell, itr->second, lastSpell); + TC_LOG_ERROR("sql.sql", "The spell %u (rank: %u, first: %u) listed in `spell_ranks` already has ChainEntry from dbc.", addedSpell, itr->second, lastSpell); mSpellChains[addedSpell].first = GetSpellInfo(lastSpell); mSpellChains[addedSpell].last = GetSpellInfo(rankChain.back().first); @@ -1435,26 +1441,26 @@ void SpellMgr::LoadSpellRequired() SpellInfo const* spell = GetSpellInfo(spell_id); if (!spell) { - TC_LOG_ERROR("sql.sql", "spell_id %u in `spell_required` table is not found in dbcs, skipped", spell_id); + TC_LOG_ERROR("sql.sql", "spell_id %u in `spell_required` table could not be found in dbc, skipped.", spell_id); continue; } SpellInfo const* reqSpell = GetSpellInfo(spell_req); if (!reqSpell) { - TC_LOG_ERROR("sql.sql", "req_spell %u in `spell_required` table is not found in dbcs, skipped", spell_req); + TC_LOG_ERROR("sql.sql", "req_spell %u in `spell_required` table could not be found in dbc, skipped.", spell_req); continue; } if (spell->IsRankOf(reqSpell)) { - TC_LOG_ERROR("sql.sql", "req_spell %u and spell_id %u in `spell_required` table are ranks of the same spell, entry not needed, skipped", spell_req, spell_id); + TC_LOG_ERROR("sql.sql", "req_spell %u and spell_id %u in `spell_required` table are ranks of the same spell, entry not needed, skipped.", spell_req, spell_id); continue; } if (IsSpellRequiringSpell(spell_id, spell_req)) { - TC_LOG_ERROR("sql.sql", "duplicated entry of req_spell %u and spell_id %u in `spell_required`, skipped", spell_req, spell_id); + TC_LOG_ERROR("sql.sql", "Duplicate entry of req_spell %u and spell_id %u in `spell_required`, skipped.", spell_req, spell_id); continue; } @@ -1532,19 +1538,19 @@ void SpellMgr::LoadSpellLearnSpells() if (!GetSpellInfo(spell_id)) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_learn_spell` does not exist", spell_id); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_learn_spell` does not exist.", spell_id); continue; } if (!GetSpellInfo(node.spell)) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_learn_spell` learning not existed spell %u", spell_id, node.spell); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_learn_spell` learning non-existing spell %u.", spell_id, node.spell); continue; } if (GetTalentSpellCost(node.spell)) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_learn_spell` attempt learning talent spell %u, skipped", spell_id, node.spell); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_learn_spell` attempts learning talent spell %u, skipped.", spell_id, node.spell); continue; } @@ -1586,7 +1592,7 @@ void SpellMgr::LoadSpellLearnSpells() { if (itr->second.spell == dbc_node.spell) { - TC_LOG_ERROR("sql.sql", "Spell %u auto-learn spell %u in spell.dbc then the record in `spell_learn_spell` is redundant, please fix DB.", + TC_LOG_ERROR("sql.sql", "The spell %u is an auto-learn spell %u in spell.dbc and the record in `spell_learn_spell` is redundant. Please update your DB.", spell, dbc_node.spell); found = true; break; @@ -1663,7 +1669,7 @@ void SpellMgr::LoadSpellTargetPositions() } else { - TC_LOG_ERROR("sql.sql", "Spell (Id: %u, effIndex: %u) listed in `spell_target_position` does not have target TARGET_DEST_DB (17).", Spell_ID, effIndex); + TC_LOG_ERROR("sql.sql", "Spell (Id: %u, effIndex: %u) listed in `spell_target_position` does not have a target TARGET_DEST_DB (17).", Spell_ID, effIndex); continue; } @@ -1700,7 +1706,7 @@ void SpellMgr::LoadSpellTargetPositions() if (found) { if (!sSpellMgr->GetSpellTargetPosition(i)) - TC_LOG_DEBUG("spells", "Spell (ID: %u) does not have record in `spell_target_position`", i); + TC_LOG_DEBUG("spells", "Spell (ID: %u) does not have a record in `spell_target_position`.", i); } }*/ @@ -1759,12 +1765,12 @@ void SpellMgr::LoadSpellGroups() if (!spellInfo) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_group` does not exist", itr->second); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_group` does not exist", itr->second); mSpellGroupSpell.erase(itr++); } else if (spellInfo->GetRank() > 1) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_group` is not first rank of spell", itr->second); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_group` is not the first rank of the spell.", itr->second); mSpellGroupSpell.erase(itr++); } else @@ -1810,7 +1816,7 @@ void SpellMgr::LoadSpellGroupStackRules() uint8 stack_rule = fields[1].GetInt8(); if (stack_rule >= SPELL_GROUP_STACK_RULE_MAX) { - TC_LOG_ERROR("sql.sql", "SpellGroupStackRule %u listed in `spell_group_stack_rules` does not exist", stack_rule); + TC_LOG_ERROR("sql.sql", "SpellGroupStackRule %u listed in `spell_group_stack_rules` does not exist.", stack_rule); continue; } @@ -1818,7 +1824,7 @@ void SpellMgr::LoadSpellGroupStackRules() if (spellGroup.first == spellGroup.second) { - TC_LOG_ERROR("sql.sql", "SpellGroup id %u listed in `spell_group_stack_rules` does not exist", group_id); + TC_LOG_ERROR("sql.sql", "SpellGroup id %u listed in `spell_group_stack_rules` does not exist.", group_id); continue; } @@ -1862,18 +1868,18 @@ void SpellMgr::LoadSpellProcEvents() SpellInfo const* spellInfo = GetSpellInfo(spellId); if (!spellInfo) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_proc_event` does not exist", spellId); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_proc_event` does not exist.", spellId); continue; } if (allRanks) { if (!spellInfo->IsRanked()) - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_proc_event` with all ranks, but spell has no ranks.", spellId); + TC_LOG_ERROR("sql.sql", "The spell %u is listed in `spell_proc_event` with all ranks, but spell has no ranks.", spellId); if (spellInfo->GetFirstRankSpell()->Id != uint32(spellId)) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_proc_event` is not first rank of spell.", spellId); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_proc_event` is not first rank of spell.", spellId); continue; } } @@ -1895,12 +1901,12 @@ void SpellMgr::LoadSpellProcEvents() { if (mSpellProcEventMap.find(spellInfo->Id) != mSpellProcEventMap.end()) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_proc_event` already has its first rank in table.", spellInfo->Id); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_proc_event` already has its first rank in table.", spellInfo->Id); break; } if (!spellInfo->ProcFlags && !spellProcEvent.procFlags) - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_proc_event` probably not triggered spell", spellInfo->Id); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_proc_event` is probably not a triggered spell.", spellInfo->Id); mSpellProcEventMap[spellInfo->Id] = spellProcEvent; @@ -1948,18 +1954,18 @@ void SpellMgr::LoadSpellProcs() SpellInfo const* spellInfo = GetSpellInfo(spellId); if (!spellInfo) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_proc` does not exist", spellId); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_proc` does not exist", spellId); continue; } if (allRanks) { if (!spellInfo->IsRanked()) - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_proc` with all ranks, but spell has no ranks.", spellId); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_proc` with all ranks, but spell has no ranks.", spellId); if (spellInfo->GetFirstRankSpell()->Id != uint32(spellId)) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_proc` is not first rank of spell.", spellId); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_proc` is not the first rank of the spell.", spellId); continue; } } @@ -1986,7 +1992,7 @@ void SpellMgr::LoadSpellProcs() { if (mSpellProcMap.find(spellInfo->Id) != mSpellProcMap.end()) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_proc` already has its first rank in table.", spellInfo->Id); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_proc` already has its first rank in the table.", spellInfo->Id); break; } @@ -2007,42 +2013,42 @@ void SpellMgr::LoadSpellProcs() TC_LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId %u has wrong `spellFamilyName` set: %u", spellInfo->Id, procEntry.spellFamilyName); if (procEntry.chance < 0) { - TC_LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId %u has negative value in `chance` field", spellInfo->Id); + TC_LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId %u has negative value in the `chance` field", spellInfo->Id); procEntry.chance = 0; } if (procEntry.ratePerMinute < 0) { - TC_LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId %u has negative value in `ratePerMinute` field", spellInfo->Id); + TC_LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId %u has negative value in the `ratePerMinute` field", spellInfo->Id); procEntry.ratePerMinute = 0; } if (cooldown < 0) { - TC_LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId %u has negative value in `cooldown` field", spellInfo->Id); + TC_LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId %u has negative value in the `cooldown` field", spellInfo->Id); procEntry.cooldown = 0; } if (procEntry.chance == 0 && procEntry.ratePerMinute == 0) - TC_LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId %u doesn't have `chance` and `ratePerMinute` values defined, proc will not be triggered", spellInfo->Id); + TC_LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId %u doesn't have any `chance` and `ratePerMinute` values defined, proc will not be triggered", spellInfo->Id); if (procEntry.charges > 99) { - TC_LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId %u has too big value in `charges` field", spellInfo->Id); + TC_LOG_ERROR("sql.sql", "The `spell_proc` table entry for spellId %u has a too big `charges` field value.", spellInfo->Id); procEntry.charges = 99; } if (!procEntry.typeMask) - TC_LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId %u doesn't have `typeMask` value defined, proc will not be triggered", spellInfo->Id); + TC_LOG_ERROR("sql.sql", "The `spell_proc` table entry for spellId %u doesn't have any `typeMask` value defined, proc will not be triggered.", spellInfo->Id); if (procEntry.spellTypeMask & ~PROC_SPELL_TYPE_MASK_ALL) TC_LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId %u has wrong `spellTypeMask` set: %u", spellInfo->Id, procEntry.spellTypeMask); if (procEntry.spellTypeMask && !(procEntry.typeMask & (SPELL_PROC_FLAG_MASK | PERIODIC_PROC_FLAG_MASK))) - TC_LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId %u has `spellTypeMask` value defined, but it won't be used for defined `typeMask` value", spellInfo->Id); + TC_LOG_ERROR("sql.sql", "The `spell_proc` table entry for spellId %u has `spellTypeMask` value defined, but it will not be used for the defined `typeMask` value.", spellInfo->Id); if (!procEntry.spellPhaseMask && procEntry.typeMask & REQ_SPELL_PHASE_PROC_FLAG_MASK) - TC_LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId %u doesn't have `spellPhaseMask` value defined, but it's required for defined `typeMask` value, proc will not be triggered", spellInfo->Id); + TC_LOG_ERROR("sql.sql", "The `spell_proc` table entry for spellId %u doesn't have any `spellPhaseMask` value defined, but it is required for the defined `typeMask` value. Proc will not be triggered.", spellInfo->Id); if (procEntry.spellPhaseMask & ~PROC_SPELL_PHASE_MASK_ALL) - TC_LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId %u has wrong `spellPhaseMask` set: %u", spellInfo->Id, procEntry.spellPhaseMask); + TC_LOG_ERROR("sql.sql", "The `spell_proc` table entry for spellId %u has wrong `spellPhaseMask` set: %u", spellInfo->Id, procEntry.spellPhaseMask); if (procEntry.spellPhaseMask && !(procEntry.typeMask & REQ_SPELL_PHASE_PROC_FLAG_MASK)) - TC_LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId %u has `spellPhaseMask` value defined, but it won't be used for defined `typeMask` value", spellInfo->Id); + TC_LOG_ERROR("sql.sql", "The `spell_proc` table entry for spellId %u has a `spellPhaseMask` value defined, but it will not be used for the defined `typeMask` value.", spellInfo->Id); if (procEntry.hitMask & ~PROC_HIT_MASK_ALL) - TC_LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId %u has wrong `hitMask` set: %u", spellInfo->Id, procEntry.hitMask); + TC_LOG_ERROR("sql.sql", "The `spell_proc` table entry for spellId %u has wrong `hitMask` set: %u", spellInfo->Id, procEntry.hitMask); if (procEntry.hitMask && !(procEntry.typeMask & TAKEN_HIT_PROC_FLAG_MASK || (procEntry.typeMask & DONE_HIT_PROC_FLAG_MASK && (!procEntry.spellPhaseMask || procEntry.spellPhaseMask & (PROC_SPELL_PHASE_HIT | PROC_SPELL_PHASE_FINISH))))) - TC_LOG_ERROR("sql.sql", "`spell_proc` table entry for spellId %u has `hitMask` value defined, but it won't be used for defined `typeMask` and `spellPhaseMask` values", spellInfo->Id); + TC_LOG_ERROR("sql.sql", "The `spell_proc` table entry for spellId %u has `hitMask` value defined, but it will not be used for defined `typeMask` and `spellPhaseMask` values.", spellInfo->Id); mSpellProcMap[spellInfo->Id] = procEntry; @@ -2081,7 +2087,7 @@ void SpellMgr::LoadSpellBonusess() SpellInfo const* spell = GetSpellInfo(entry); if (!spell) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_bonus_data` does not exist", entry); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_bonus_data` does not exist.", entry); continue; } @@ -2120,7 +2126,7 @@ void SpellMgr::LoadSpellThreats() if (!GetSpellInfo(entry)) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_threat` does not exist", entry); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_threat` does not exist.", entry); continue; } @@ -2189,21 +2195,21 @@ void SpellMgr::LoadSpellPetAuras() SpellInfo const* spellInfo = GetSpellInfo(spell); if (!spellInfo) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_pet_auras` does not exist", spell); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_pet_auras` does not exist.", spell); continue; } if (spellInfo->Effects[eff].Effect != SPELL_EFFECT_DUMMY && (spellInfo->Effects[eff].Effect != SPELL_EFFECT_APPLY_AURA || spellInfo->Effects[eff].ApplyAuraName != SPELL_AURA_DUMMY)) { - TC_LOG_ERROR("spells", "Spell %u listed in `spell_pet_auras` does not have dummy aura or dummy effect", spell); + TC_LOG_ERROR("spells", "The spell %u listed in `spell_pet_auras` does not have any dummy aura or dummy effect.", spell); continue; } SpellInfo const* spellInfo2 = GetSpellInfo(aura); if (!spellInfo2) { - TC_LOG_ERROR("sql.sql", "Aura %u listed in `spell_pet_auras` does not exist", aura); + TC_LOG_ERROR("sql.sql", "The aura %u listed in `spell_pet_auras` does not exist.", aura); continue; } @@ -2281,7 +2287,7 @@ void SpellMgr::LoadSpellEnchantProcData() SpellItemEnchantmentEntry const* ench = sSpellItemEnchantmentStore.LookupEntry(enchantId); if (!ench) { - TC_LOG_ERROR("sql.sql", "Enchancment %u listed in `spell_enchant_proc_data` does not exist", enchantId); + TC_LOG_ERROR("sql.sql", "The enchancment %u listed in `spell_enchant_proc_data` does not exist.", enchantId); continue; } @@ -2325,7 +2331,7 @@ void SpellMgr::LoadSpellLinked() SpellInfo const* spellInfo = GetSpellInfo(abs(trigger)); if (!spellInfo) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_linked_spell` does not exist", abs(trigger)); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_linked_spell` does not exist.", abs(trigger)); continue; } @@ -2333,13 +2339,13 @@ void SpellMgr::LoadSpellLinked() for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j) { if (spellInfo->Effects[j].CalcValue() == abs(effect)) - TC_LOG_ERROR("sql.sql", "Spell %u Effect: %u listed in `spell_linked_spell` has same bp%u like effect (possible hack)", abs(trigger), abs(effect), j); + TC_LOG_ERROR("sql.sql", "The spell %u Effect: %u listed in `spell_linked_spell` has same bp%u like effect (possible hack).", abs(trigger), abs(effect), j); } spellInfo = GetSpellInfo(abs(effect)); if (!spellInfo) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_linked_spell` does not exist", abs(effect)); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_linked_spell` does not exist.", abs(effect)); continue; } @@ -2584,7 +2590,7 @@ void SpellMgr::LoadSpellAreas() } else { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_area` does not exist", spell); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_area` does not exist", spell); continue; } @@ -2613,20 +2619,20 @@ void SpellMgr::LoadSpellAreas() if (!ok) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_area` already listed with similar requirements.", spell); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_area` is already listed with similar requirements.", spell); continue; } } if (spellArea.areaId && !sAreaTableStore.LookupEntry(spellArea.areaId)) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_area` have wrong area (%u) requirement", spell, spellArea.areaId); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_area` has a wrong area (%u) requirement.", spell, spellArea.areaId); continue; } if (spellArea.questStart && !sObjectMgr->GetQuestTemplate(spellArea.questStart)) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_area` have wrong start quest (%u) requirement", spell, spellArea.questStart); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_area` has a wrong start quest (%u) requirement.", spell, spellArea.questStart); continue; } @@ -2634,7 +2640,7 @@ void SpellMgr::LoadSpellAreas() { if (!sObjectMgr->GetQuestTemplate(spellArea.questEnd)) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_area` have wrong end quest (%u) requirement", spell, spellArea.questEnd); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_area` has a wrong ending quest (%u) requirement.", spell, spellArea.questEnd); continue; } } @@ -2644,13 +2650,13 @@ void SpellMgr::LoadSpellAreas() SpellInfo const* spellInfo = GetSpellInfo(abs(spellArea.auraSpell)); if (!spellInfo) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_area` have wrong aura spell (%u) requirement", spell, abs(spellArea.auraSpell)); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_area` has wrong aura spell (%u) requirement", spell, abs(spellArea.auraSpell)); continue; } if (uint32(abs(spellArea.auraSpell)) == spellArea.spellId) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_area` have aura spell (%u) requirement for itself", spell, abs(spellArea.auraSpell)); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_area` has aura spell (%u) requirement for itself", spell, abs(spellArea.auraSpell)); continue; } @@ -2670,7 +2676,7 @@ void SpellMgr::LoadSpellAreas() if (chain) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_area` have aura spell (%u) requirement that itself autocast from aura", spell, spellArea.auraSpell); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_area` has the aura spell (%u) requirement that it autocasts itself from the aura.", spell, spellArea.auraSpell); continue; } @@ -2686,7 +2692,7 @@ void SpellMgr::LoadSpellAreas() if (chain) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_area` have aura spell (%u) requirement that itself autocast from aura", spell, spellArea.auraSpell); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_area` has the aura spell (%u) requirement that the spell itself autocasts from the aura.", spell, spellArea.auraSpell); continue; } } @@ -2694,13 +2700,13 @@ void SpellMgr::LoadSpellAreas() if (spellArea.raceMask && (spellArea.raceMask & RACEMASK_ALL_PLAYABLE) == 0) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_area` have wrong race mask (%u) requirement", spell, spellArea.raceMask); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_area` has wrong race mask (%u) requirement.", spell, spellArea.raceMask); continue; } if (spellArea.gender != GENDER_NONE && spellArea.gender != GENDER_FEMALE && spellArea.gender != GENDER_MALE) { - TC_LOG_ERROR("sql.sql", "Spell %u listed in `spell_area` have wrong gender (%u) requirement", spell, spellArea.gender); + TC_LOG_ERROR("sql.sql", "The spell %u listed in `spell_area` has wrong gender (%u) requirement.", spell, spellArea.gender); continue; } diff --git a/src/server/game/Spells/SpellMgr.h b/src/server/game/Spells/SpellMgr.h index 651a8cde938..827e3c671ab 100644 --- a/src/server/game/Spells/SpellMgr.h +++ b/src/server/game/Spells/SpellMgr.h @@ -608,11 +608,7 @@ class SpellMgr // Accessors (const or static functions) public: - static SpellMgr* instance() - { - static SpellMgr instance; - return &instance; - } + static SpellMgr* instance(); // Spell correctness for client using static bool IsSpellValid(SpellInfo const* spellInfo, Player* player = NULL, bool msg = true); diff --git a/src/server/game/Texts/CreatureTextMgr.cpp b/src/server/game/Texts/CreatureTextMgr.cpp index 499f0c9cbf0..d8df3310765 100644 --- a/src/server/game/Texts/CreatureTextMgr.cpp +++ b/src/server/game/Texts/CreatureTextMgr.cpp @@ -72,6 +72,12 @@ class PlayerTextBuilder WorldObject const* _target; }; +CreatureTextMgr* CreatureTextMgr::instance() +{ + static CreatureTextMgr instance; + return &instance; +} + void CreatureTextMgr::LoadCreatureTexts() { uint32 oldMSTime = getMSTime(); diff --git a/src/server/game/Texts/CreatureTextMgr.h b/src/server/game/Texts/CreatureTextMgr.h index 28fd98f21a8..e364eb6eefa 100644 --- a/src/server/game/Texts/CreatureTextMgr.h +++ b/src/server/game/Texts/CreatureTextMgr.h @@ -82,11 +82,7 @@ class CreatureTextMgr ~CreatureTextMgr() { } public: - static CreatureTextMgr* instance() - { - static CreatureTextMgr instance; - return &instance; - } + static CreatureTextMgr* instance(); void LoadCreatureTexts(); void LoadCreatureTextLocales(); diff --git a/src/server/game/Tickets/TicketMgr.cpp b/src/server/game/Tickets/TicketMgr.cpp index 1cf68eec9c7..94e4427fe10 100644 --- a/src/server/game/Tickets/TicketMgr.cpp +++ b/src/server/game/Tickets/TicketMgr.cpp @@ -284,6 +284,12 @@ void TicketMgr::ResetTickets() CharacterDatabase.Execute(stmt); } +TicketMgr* TicketMgr::instance() +{ + static TicketMgr instance; + return &instance; +} + void TicketMgr::LoadTickets() { uint32 oldMSTime = getMSTime(); diff --git a/src/server/game/Tickets/TicketMgr.h b/src/server/game/Tickets/TicketMgr.h index 9cc1d20b122..59f38e6d23f 100644 --- a/src/server/game/Tickets/TicketMgr.h +++ b/src/server/game/Tickets/TicketMgr.h @@ -188,11 +188,7 @@ private: ~TicketMgr(); public: - static TicketMgr* instance() - { - static TicketMgr instance; - return &instance; - } + static TicketMgr* instance(); void LoadTickets(); void LoadSurveys(); diff --git a/src/server/game/Warden/WardenCheckMgr.cpp b/src/server/game/Warden/WardenCheckMgr.cpp index 5c4b0fc05b7..13ddae012fe 100644 --- a/src/server/game/Warden/WardenCheckMgr.cpp +++ b/src/server/game/Warden/WardenCheckMgr.cpp @@ -189,6 +189,12 @@ void WardenCheckMgr::LoadWardenOverrides() TC_LOG_INFO("server.loading", ">> Loaded %u warden action overrides.", count); } +WardenCheckMgr* WardenCheckMgr::instance() +{ + static WardenCheckMgr instance; + return &instance; +} + WardenCheck* WardenCheckMgr::GetWardenDataById(uint16 Id) { if (Id < CheckStore.size()) diff --git a/src/server/game/Warden/WardenCheckMgr.h b/src/server/game/Warden/WardenCheckMgr.h index 4107ccc3aff..a09dc3a6dbb 100644 --- a/src/server/game/Warden/WardenCheckMgr.h +++ b/src/server/game/Warden/WardenCheckMgr.h @@ -55,11 +55,7 @@ class WardenCheckMgr ~WardenCheckMgr(); public: - static WardenCheckMgr* instance() - { - static WardenCheckMgr instance; - return &instance; - } + static WardenCheckMgr* instance(); // We have a linear key without any gaps, so we use vector for fast access typedef std::vector<WardenCheck*> CheckContainer; diff --git a/src/server/game/Weather/Weather.cpp b/src/server/game/Weather/Weather.cpp index f774916f4a5..7ef16e32031 100644 --- a/src/server/game/Weather/Weather.cpp +++ b/src/server/game/Weather/Weather.cpp @@ -152,7 +152,7 @@ bool Weather::ReGenerate() uint32 chance2 = chance1+ m_weatherChances->data[season].snowChance; uint32 chance3 = chance2+ m_weatherChances->data[season].stormChance; - uint32 rnd = urand(0, 99); + uint32 rnd = urand(1, 100); if (rnd <= chance1) m_type = WEATHER_TYPE_RAIN; else if (rnd <= chance2) diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 289a4d47666..2263fbca49f 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -38,6 +38,7 @@ #include "DatabaseEnv.h" #include "DisableMgr.h" #include "GameEventMgr.h" +#include "GameObjectModel.h" #include "GridNotifiersImpl.h" #include "GroupMgr.h" #include "GuildMgr.h" @@ -139,6 +140,12 @@ World::~World() /// @todo free addSessQueue } +World* World::instance() +{ + static World instance; + return &instance; +} + /// Find a player in a specified zone Player* World::FindPlayerInZone(uint32 zone) { @@ -592,6 +599,18 @@ void World::LoadConfigSettings(bool reload) m_bool_configs[CONFIG_PRESERVE_CUSTOM_CHANNELS] = sConfigMgr->GetBoolDefault("PreserveCustomChannels", false); m_int_configs[CONFIG_PRESERVE_CUSTOM_CHANNEL_DURATION] = sConfigMgr->GetIntDefault("PreserveCustomChannelDuration", 14); m_bool_configs[CONFIG_GRID_UNLOAD] = sConfigMgr->GetBoolDefault("GridUnload", true); + m_bool_configs[CONFIG_BASEMAP_LOAD_GRIDS] = sConfigMgr->GetBoolDefault("BaseMapLoadAllGrids", false); + if (m_bool_configs[CONFIG_BASEMAP_LOAD_GRIDS] && m_bool_configs[CONFIG_GRID_UNLOAD]) + { + TC_LOG_ERROR("server.loading", "BaseMapLoadAllGrids enabled, but GridUnload also enabled. GridUnload must be disabled to enable base map pre-loading. Base map pre-loading disabled"); + m_bool_configs[CONFIG_BASEMAP_LOAD_GRIDS] = false; + } + m_bool_configs[CONFIG_INSTANCEMAP_LOAD_GRIDS] = sConfigMgr->GetBoolDefault("InstanceMapLoadAllGrids", false); + if (m_bool_configs[CONFIG_INSTANCEMAP_LOAD_GRIDS] && m_bool_configs[CONFIG_GRID_UNLOAD]) + { + TC_LOG_ERROR("server.loading", "InstanceMapLoadAllGrids enabled, but GridUnload also enabled. GridUnload must be disabled to enable instance map pre-loading. Instance map pre-loading disabled"); + m_bool_configs[CONFIG_INSTANCEMAP_LOAD_GRIDS] = false; + } m_int_configs[CONFIG_INTERVAL_SAVE] = sConfigMgr->GetIntDefault("PlayerSaveInterval", 15 * MINUTE * IN_MILLISECONDS); m_int_configs[CONFIG_INTERVAL_DISCONNECT_TOLERANCE] = sConfigMgr->GetIntDefault("DisconnectToleranceInterval", 0); m_bool_configs[CONFIG_STATS_SAVE_ONLY_ON_LOGOUT] = sConfigMgr->GetBoolDefault("PlayerSave.Stats.SaveOnlyOnLogout", true); @@ -1003,7 +1022,7 @@ void World::LoadConfigSettings(bool reload) m_bool_configs[CONFIG_DETECT_POS_COLLISION] = sConfigMgr->GetBoolDefault("DetectPosCollision", true); m_bool_configs[CONFIG_RESTRICTED_LFG_CHANNEL] = sConfigMgr->GetBoolDefault("Channel.RestrictedLfg", true); - m_bool_configs[CONFIG_TALENTS_INSPECTING] = sConfigMgr->GetBoolDefault("TalentsInspecting", true); + m_int_configs[CONFIG_TALENTS_INSPECTING] = sConfigMgr->GetIntDefault("TalentsInspecting", 1); m_bool_configs[CONFIG_CHAT_FAKE_MESSAGE_PREVENTING] = sConfigMgr->GetBoolDefault("ChatFakeMessagePreventing", false); m_int_configs[CONFIG_CHAT_STRICT_LINK_CHECKING_SEVERITY] = sConfigMgr->GetIntDefault("ChatStrictLinkChecking.Severity", 0); m_int_configs[CONFIG_CHAT_STRICT_LINK_CHECKING_KICK] = sConfigMgr->GetIntDefault("ChatStrictLinkChecking.Kick", 0); @@ -1305,8 +1324,6 @@ void World::LoadConfigSettings(bool reload) sScriptMgr->OnConfigLoad(reload); } -extern void LoadGameObjectModelList(std::string const& dataPath); - /// Initialize the World void World::SetInitialWorldSettings() { @@ -1369,7 +1386,7 @@ void World::SetInitialWorldSettings() uint32 server_type = IsFFAPvPRealm() ? uint32(REALM_TYPE_PVP) : getIntConfig(CONFIG_GAME_TYPE); uint32 realm_zone = getIntConfig(CONFIG_REALM_ZONE); - LoginDatabase.PExecute("UPDATE realmlist SET icon = %u, timezone = %u WHERE id = '%d'", server_type, realm_zone, realmID); // One-time query + LoginDatabase.PExecute("UPDATE realmlist SET icon = %u, timezone = %u WHERE id = '%d'", server_type, realm_zone, realm.Id.Realm); // One-time query ///- Load the DBC files TC_LOG_INFO("server.loading", "Initialize data stores..."); @@ -1790,7 +1807,7 @@ void World::SetInitialWorldSettings() m_startTime = m_gameTime; LoginDatabase.PExecute("INSERT INTO uptime (realmid, starttime, uptime, revision) VALUES(%u, %u, 0, '%s')", - realmID, uint32(m_startTime), GitRevision::GetFullVersion()); // One-time query + realm.Id.Realm, uint32(m_startTime), GitRevision::GetFullVersion()); // One-time query m_timers[WUPDATE_WEATHERS].SetInterval(1*IN_MILLISECONDS); m_timers[WUPDATE_AUCTIONS].SetInterval(MINUTE*IN_MILLISECONDS); @@ -1888,6 +1905,19 @@ void World::SetInitialWorldSettings() LoadCharacterInfoStore(); + // Preload all cells, if required for the base maps + if (sWorld->getBoolConfig(CONFIG_BASEMAP_LOAD_GRIDS)) + { + sMapMgr->DoForAllMaps([](Map* map) + { + if (!map->Instanceable()) + { + TC_LOG_INFO("server.loading", "Pre-loading base map data for map %u", map->GetId()); + map->LoadAllCells(); + } + }); + } + uint32 startupDuration = GetMSTimeDiffToNow(startupBegin); TC_LOG_INFO("server.worldserver", "World initialized in %u minutes %u seconds", (startupDuration / 60000), ((startupDuration % 60000) / 1000)); @@ -2103,7 +2133,7 @@ void World::Update(uint32 diff) stmt->setUInt32(0, tmpDiff); stmt->setUInt16(1, uint16(maxOnlinePlayers)); - stmt->setUInt32(2, realmID); + stmt->setUInt32(2, realm.Id.Realm); stmt->setUInt32(3, uint32(m_startTime)); LoginDatabase.Execute(stmt); @@ -2826,13 +2856,13 @@ void World::_UpdateRealmCharCount(PreparedQueryResult resultCharCount) PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_REALM_CHARACTERS_BY_REALM); stmt->setUInt32(0, accountId); - stmt->setUInt32(1, realmID); + stmt->setUInt32(1, realm.Id.Realm); LoginDatabase.Execute(stmt); stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_REALM_CHARACTERS); stmt->setUInt8(0, charCount); stmt->setUInt32(1, accountId); - stmt->setUInt32(2, realmID); + stmt->setUInt32(2, realm.Id.Realm); LoginDatabase.Execute(stmt); } } @@ -2960,7 +2990,7 @@ void World::ResetDailyQuests() void World::LoadDBAllowedSecurityLevel() { PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_REALMLIST_SECURITY_LEVEL); - stmt->setInt32(0, int32(realmID)); + stmt->setInt32(0, int32(realm.Id.Realm)); PreparedQueryResult result = LoginDatabase.Query(stmt); if (result) @@ -3290,3 +3320,4 @@ void World::RemoveOldCorpses() m_timers[WUPDATE_CORPSES].SetCurrent(m_timers[WUPDATE_CORPSES].GetInterval()); } +Realm realm; diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 00b244c9efb..6d1f6313ae5 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -29,6 +29,7 @@ #include "SharedDefines.h" #include "QueryResult.h" #include "Callback.h" +#include "Realm/Realm.h" #include <atomic> #include <map> @@ -113,7 +114,6 @@ enum WorldBoolConfigs CONFIG_QUEST_IGNORE_RAID, CONFIG_DETECT_POS_COLLISION, CONFIG_RESTRICTED_LFG_CHANNEL, - CONFIG_TALENTS_INSPECTING, CONFIG_CHAT_FAKE_MESSAGE_PREVENTING, CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP, CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE, @@ -166,6 +166,8 @@ enum WorldBoolConfigs CONFIG_CALCULATE_GAMEOBJECT_ZONE_AREA_DATA, CONFIG_RESET_DUEL_COOLDOWNS, CONFIG_RESET_DUEL_HEALTH_MANA, + CONFIG_BASEMAP_LOAD_GRIDS, + CONFIG_INSTANCEMAP_LOAD_GRIDS, BOOL_CONFIG_VALUE_COUNT }; @@ -358,6 +360,7 @@ enum WorldIntConfigs CONFIG_NO_GRAY_AGGRO_BELOW, CONFIG_AUCTION_GETALL_DELAY, CONFIG_AUCTION_SEARCH_DELAY, + CONFIG_TALENTS_INSPECTING, INT_CONFIG_VALUE_COUNT }; @@ -446,18 +449,6 @@ enum BillingPlanFlags SESSION_ENABLE_CAIS = 0x80 }; -/// Type of server, this is values from second column of Cfg_Configs.dbc -enum RealmType -{ - REALM_TYPE_NORMAL = 0, - REALM_TYPE_PVP = 1, - REALM_TYPE_NORMAL2 = 4, - REALM_TYPE_RP = 6, - REALM_TYPE_RPPVP = 8, - REALM_TYPE_FFA_PVP = 16 // custom, free for all pvp mode like arena PvP in all zones except rest activated places and sanctuaries - // replaced by REALM_PVP in realm list -}; - enum RealmZone { REALM_ZONE_UNKNOWN = 0, // any language @@ -549,11 +540,7 @@ struct CharacterInfo class World { public: - static World* instance() - { - static World instance; - return &instance; - } + static World* instance(); static std::atomic<uint32> m_worldLoopCounter; @@ -882,8 +869,9 @@ class World std::deque<std::future<PreparedQueryResult>> m_realmCharCallbacks; }; -extern uint32 realmID; +extern Realm realm; #define sWorld World::instance() + #endif /// @} diff --git a/src/server/scripts/CMakeLists.txt b/src/server/scripts/CMakeLists.txt index a15b6f8ad07..ea0b058b91d 100644 --- a/src/server/scripts/CMakeLists.txt +++ b/src/server/scripts/CMakeLists.txt @@ -16,9 +16,15 @@ if (USE_SCRIPTPCH) endif () message(STATUS "SCRIPT PREPARATIONS") -include(Spells/CMakeLists.txt) -include(Commands/CMakeLists.txt) +macro(PrepareScripts name out) + file(GLOB_RECURSE found + ${name}/*.h + ${name}/*.cpp + ) + list(APPEND ${out} ${found}) + message(STATUS " -> Prepared: ${name}") +endmacro(PrepareScripts) set(scripts_STAT_SRCS ${scripts_STAT_SRCS} @@ -28,16 +34,19 @@ set(scripts_STAT_SRCS ../game/Maps/AreaBoundary.cpp ) +PrepareScripts(Spells scripts_STAT_SRCS) +PrepareScripts(Commands scripts_STAT_SRCS) + if(SCRIPTS) - include(Custom/CMakeLists.txt) - include(World/CMakeLists.txt) - include(OutdoorPvP/CMakeLists.txt) - include(EasternKingdoms/CMakeLists.txt) - include(Kalimdor/CMakeLists.txt) - include(Outland/CMakeLists.txt) - include(Northrend/CMakeLists.txt) - include(Events/CMakeLists.txt) - include(Pet/CMakeLists.txt) + PrepareScripts(Custom scripts_STAT_SRCS) + PrepareScripts(World scripts_STAT_SRCS) + PrepareScripts(OutdoorPvP scripts_STAT_SRCS) + PrepareScripts(EasternKingdoms scripts_STAT_SRCS) + PrepareScripts(Kalimdor scripts_STAT_SRCS) + PrepareScripts(Outland scripts_STAT_SRCS) + PrepareScripts(Northrend scripts_STAT_SRCS) + PrepareScripts(Events scripts_STAT_SRCS) + PrepareScripts(Pet scripts_STAT_SRCS) endif() message(STATUS "SCRIPT PREPARATION COMPLETE") @@ -63,6 +72,7 @@ include_directories( ${CMAKE_SOURCE_DIR}/src/server/game/Addons ${CMAKE_SOURCE_DIR}/src/server/game/AI ${CMAKE_SOURCE_DIR}/src/server/game/AI/CoreAI + ${CMAKE_SOURCE_DIR}/src/server/game/AI/PlayerAI ${CMAKE_SOURCE_DIR}/src/server/game/AI/ScriptedAI ${CMAKE_SOURCE_DIR}/src/server/game/AI/SmartScripts ${CMAKE_SOURCE_DIR}/src/server/game/AuctionHouse diff --git a/src/server/scripts/Commands/CMakeLists.txt b/src/server/scripts/Commands/CMakeLists.txt deleted file mode 100644 index d4d75cd175f..00000000000 --- a/src/server/scripts/Commands/CMakeLists.txt +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> -# -# This file is free software; as a special exception the author gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -file(GLOB_RECURSE sources_Commands Commands/*.cpp Commands/*.h) - -set(scripts_STAT_SRCS - ${scripts_STAT_SRCS} - ${sources_Commands} -) - -message(" -> Prepared: Commands") diff --git a/src/server/scripts/Commands/cs_account.cpp b/src/server/scripts/Commands/cs_account.cpp index f25e91ee3e6..6ffb92d9684 100644 --- a/src/server/scripts/Commands/cs_account.cpp +++ b/src/server/scripts/Commands/cs_account.cpp @@ -124,7 +124,7 @@ public: AccountOpResult result = sAccountMgr->CreateAccount(std::string(accountName), std::string(password), email); switch (result) { - case AOR_OK: + case AccountOpResult::AOR_OK: handler->PSendSysMessage(LANG_ACCOUNT_CREATED, accountName); if (handler->GetSession()) { @@ -134,15 +134,15 @@ public: accountName, email.c_str()); } break; - case AOR_NAME_TOO_LONG: + case AccountOpResult::AOR_NAME_TOO_LONG: handler->SendSysMessage(LANG_ACCOUNT_TOO_LONG); handler->SetSentErrorMessage(true); return false; - case AOR_NAME_ALREADY_EXIST: + case AccountOpResult::AOR_NAME_ALREADY_EXIST: handler->SendSysMessage(LANG_ACCOUNT_ALREADY_EXIST); handler->SetSentErrorMessage(true); return false; - case AOR_DB_INTERNAL_ERROR: + case AccountOpResult::AOR_DB_INTERNAL_ERROR: handler->PSendSysMessage(LANG_ACCOUNT_NOT_CREATED_SQL_ERROR, accountName); handler->SetSentErrorMessage(true); return false; @@ -168,7 +168,7 @@ public: return false; std::string accountName = account; - if (!AccountMgr::normalizeString(accountName)) + if (!Utf8ToUpperOnlyLatin(accountName)) { handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str()); handler->SetSentErrorMessage(true); @@ -192,14 +192,14 @@ public: AccountOpResult result = AccountMgr::DeleteAccount(accountId); switch (result) { - case AOR_OK: + case AccountOpResult::AOR_OK: handler->PSendSysMessage(LANG_ACCOUNT_DELETED, accountName.c_str()); break; - case AOR_NAME_NOT_EXIST: + case AccountOpResult::AOR_NAME_NOT_EXIST: handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str()); handler->SetSentErrorMessage(true); return false; - case AOR_DB_INTERNAL_ERROR: + case AccountOpResult::AOR_DB_INTERNAL_ERROR: handler->PSendSysMessage(LANG_ACCOUNT_NOT_DELETED_SQL_ERROR, accountName.c_str()); handler->SetSentErrorMessage(true); return false; @@ -415,7 +415,7 @@ public: AccountOpResult result = AccountMgr::ChangeEmail(handler->GetSession()->GetAccountId(), std::string(email)); switch (result) { - case AOR_OK: + case AccountOpResult::AOR_OK: handler->SendSysMessage(LANG_COMMAND_EMAIL); sScriptMgr->OnEmailChange(handler->GetSession()->GetAccountId()); TC_LOG_INFO("entities.player.character", "Account: %u (IP: %s) Character:[%s] (GUID: %u) Changed Email from [%s] to [%s].", @@ -423,7 +423,7 @@ public: handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUID().GetCounter(), oldEmail, email); break; - case AOR_EMAIL_TOO_LONG: + case AccountOpResult::AOR_EMAIL_TOO_LONG: handler->SendSysMessage(LANG_EMAIL_TOO_LONG); sScriptMgr->OnFailedEmailChange(handler->GetSession()->GetAccountId()); handler->SetSentErrorMessage(true); @@ -505,14 +505,14 @@ public: AccountOpResult result = AccountMgr::ChangePassword(handler->GetSession()->GetAccountId(), std::string(newPassword)); switch (result) { - case AOR_OK: + case AccountOpResult::AOR_OK: handler->SendSysMessage(LANG_COMMAND_PASSWORD); sScriptMgr->OnPasswordChange(handler->GetSession()->GetAccountId()); TC_LOG_INFO("entities.player.character", "Account: %u (IP: %s) Character:[%s] (GUID: %u) Changed Password.", handler->GetSession()->GetAccountId(), handler->GetSession()->GetRemoteAddress().c_str(), handler->GetSession()->GetPlayer()->GetName().c_str(), handler->GetSession()->GetPlayer()->GetGUID().GetCounter()); break; - case AOR_PASS_TOO_LONG: + case AccountOpResult::AOR_PASS_TOO_LONG: handler->SendSysMessage(LANG_PASSWORD_TOO_LONG); sScriptMgr->OnFailedPasswordChange(handler->GetSession()->GetAccountId()); handler->SetSentErrorMessage(true); @@ -592,7 +592,7 @@ public: { ///- Convert Account name to Upper Format accountName = account; - if (!AccountMgr::normalizeString(accountName)) + if (!Utf8ToUpperOnlyLatin(accountName)) { handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str()); handler->SetSentErrorMessage(true); @@ -662,7 +662,7 @@ public: if (isAccountNameGiven) { targetAccountName = arg1; - if (!AccountMgr::normalizeString(targetAccountName) || !AccountMgr::GetId(targetAccountName)) + if (!Utf8ToUpperOnlyLatin(targetAccountName) || !AccountMgr::GetId(targetAccountName)) { handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, targetAccountName.c_str()); handler->SetSentErrorMessage(true); @@ -750,7 +750,7 @@ public: return false; std::string accountName = account; - if (!AccountMgr::normalizeString(accountName)) + if (!Utf8ToUpperOnlyLatin(accountName)) { handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str()); handler->SetSentErrorMessage(true); @@ -781,14 +781,14 @@ public: switch (result) { - case AOR_OK: + case AccountOpResult::AOR_OK: handler->SendSysMessage(LANG_COMMAND_PASSWORD); break; - case AOR_NAME_NOT_EXIST: + case AccountOpResult::AOR_NAME_NOT_EXIST: handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str()); handler->SetSentErrorMessage(true); return false; - case AOR_PASS_TOO_LONG: + case AccountOpResult::AOR_PASS_TOO_LONG: handler->SendSysMessage(LANG_PASSWORD_TOO_LONG); handler->SetSentErrorMessage(true); return false; @@ -819,7 +819,7 @@ public: } std::string accountName = account; - if (!AccountMgr::normalizeString(accountName)) + if (!Utf8ToUpperOnlyLatin(accountName)) { handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str()); handler->SetSentErrorMessage(true); @@ -849,16 +849,16 @@ public: AccountOpResult result = AccountMgr::ChangeEmail(targetAccountId, email); switch (result) { - case AOR_OK: + case AccountOpResult::AOR_OK: handler->SendSysMessage(LANG_COMMAND_EMAIL); TC_LOG_INFO("entities.player.character", "ChangeEmail: Account %s [Id: %u] had it's email changed to %s.", accountName.c_str(), targetAccountId, email); break; - case AOR_NAME_NOT_EXIST: + case AccountOpResult::AOR_NAME_NOT_EXIST: handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str()); handler->SetSentErrorMessage(true); return false; - case AOR_EMAIL_TOO_LONG: + case AccountOpResult::AOR_EMAIL_TOO_LONG: handler->SendSysMessage(LANG_EMAIL_TOO_LONG); handler->SetSentErrorMessage(true); return false; @@ -895,7 +895,7 @@ public: } std::string accountName = account; - if (!AccountMgr::normalizeString(accountName)) + if (!Utf8ToUpperOnlyLatin(accountName)) { handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str()); handler->SetSentErrorMessage(true); @@ -925,16 +925,16 @@ public: AccountOpResult result = AccountMgr::ChangeRegEmail(targetAccountId, email); switch (result) { - case AOR_OK: + case AccountOpResult::AOR_OK: handler->SendSysMessage(LANG_COMMAND_EMAIL); TC_LOG_INFO("entities.player.character", "ChangeRegEmail: Account %s [Id: %u] had it's Registration Email changed to %s.", accountName.c_str(), targetAccountId, email); break; - case AOR_NAME_NOT_EXIST: + case AccountOpResult::AOR_NAME_NOT_EXIST: handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str()); handler->SetSentErrorMessage(true); return false; - case AOR_EMAIL_TOO_LONG: + case AccountOpResult::AOR_EMAIL_TOO_LONG: handler->SendSysMessage(LANG_EMAIL_TOO_LONG); handler->SetSentErrorMessage(true); return false; diff --git a/src/server/scripts/Commands/cs_ahbot.cpp b/src/server/scripts/Commands/cs_ahbot.cpp index 65e90394261..47553d085b1 100644 --- a/src/server/scripts/Commands/cs_ahbot.cpp +++ b/src/server/scripts/Commands/cs_ahbot.cpp @@ -33,7 +33,7 @@ class ahbot_commandscript : public CommandScript public: ahbot_commandscript(): CommandScript("ahbot_commandscript") {} - std::vector<ChatCommand> GetCommands() const + std::vector<ChatCommand> GetCommands() const override { static std::vector<ChatCommand> ahbotItemsAmountCommandTable = { diff --git a/src/server/scripts/Commands/cs_ban.cpp b/src/server/scripts/Commands/cs_ban.cpp index 4a1bf71e1d8..ba512dbf8eb 100644 --- a/src/server/scripts/Commands/cs_ban.cpp +++ b/src/server/scripts/Commands/cs_ban.cpp @@ -171,7 +171,7 @@ public: switch (mode) { case BAN_ACCOUNT: - if (!AccountMgr::normalizeString(nameOrIP)) + if (!Utf8ToUpperOnlyLatin(nameOrIP)) { handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, nameOrIP.c_str()); handler->SetSentErrorMessage(true); @@ -244,7 +244,7 @@ public: return false; std::string accountName = nameStr; - if (!AccountMgr::normalizeString(accountName)) + if (!Utf8ToUpperOnlyLatin(accountName)) { handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str()); handler->SetSentErrorMessage(true); @@ -712,7 +712,7 @@ public: switch (mode) { case BAN_ACCOUNT: - if (!AccountMgr::normalizeString(nameOrIP)) + if (!Utf8ToUpperOnlyLatin(nameOrIP)) { handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, nameOrIP.c_str()); handler->SetSentErrorMessage(true); diff --git a/src/server/scripts/Commands/cs_character.cpp b/src/server/scripts/Commands/cs_character.cpp index e048aabd4d7..9557d182df1 100644 --- a/src/server/scripts/Commands/cs_character.cpp +++ b/src/server/scripts/Commands/cs_character.cpp @@ -133,7 +133,7 @@ public: info.name = fields[1].GetString(); info.accountId = fields[2].GetUInt32(); - // account name will be empty for not existed account + // account name will be empty for nonexisting account AccountMgr::GetName(info.accountId, info.accountName); info.deleteDate = time_t(fields[3].GetUInt32()); foundList.push_back(info); @@ -169,11 +169,11 @@ public: if (!handler->GetSession()) handler->PSendSysMessage(LANG_CHARACTER_DELETED_LIST_LINE_CONSOLE, - itr->guid.GetCounter(), itr->name.c_str(), itr->accountName.empty() ? "<Not existed>" : itr->accountName.c_str(), + itr->guid.GetCounter(), itr->name.c_str(), itr->accountName.empty() ? "<Not existing>" : itr->accountName.c_str(), itr->accountId, dateStr.c_str()); else handler->PSendSysMessage(LANG_CHARACTER_DELETED_LIST_LINE_CHAT, - itr->guid.GetCounter(), itr->name.c_str(), itr->accountName.empty() ? "<Not existed>" : itr->accountName.c_str(), + itr->guid.GetCounter(), itr->name.c_str(), itr->accountName.empty() ? "<Not existing>" : itr->accountName.c_str(), itr->accountId, dateStr.c_str()); } @@ -193,7 +193,7 @@ public: */ static void HandleCharacterDeletedRestoreHelper(DeletedInfo const& delInfo, ChatHandler* handler) { - if (delInfo.accountName.empty()) // account not exist + if (delInfo.accountName.empty()) // account does not exist { handler->PSendSysMessage(LANG_CHARACTER_DELETED_SKIP_ACCOUNT, delInfo.name.c_str(), delInfo.guid.GetCounter(), delInfo.accountId); return; @@ -660,7 +660,7 @@ public: if (newCharName.empty()) { - // Drop not existed account cases + // Drop nonexisting account cases for (DeletedInfoList::iterator itr = foundList.begin(); itr != foundList.end(); ++itr) HandleCharacterDeletedRestoreHelper(*itr, handler); } @@ -810,7 +810,7 @@ public: if (levelStr && isalpha(levelStr[0])) { nameStr = levelStr; - levelStr = NULL; // current level will used + levelStr = NULL; // current level will be used } Player* target; @@ -854,7 +854,7 @@ public: return false; std::string accountName = accountStr; - if (!AccountMgr::normalizeString(accountName)) + if (!Utf8ToUpperOnlyLatin(accountName)) { handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str()); handler->SetSentErrorMessage(true); diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index 3ebae51f4fb..3a98e8ed172 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -1410,10 +1410,7 @@ public: map = player->GetMap(); handler->PSendSysMessage("Loading all cells (mapId: %u). Current next GameObject %u, Creature %u", map->GetId(), map->GetMaxLowGuid<HighGuid::GameObject>(), map->GetMaxLowGuid<HighGuid::Unit>()); - for (uint32 cellX = 0; cellX < TOTAL_NUMBER_OF_CELLS_PER_MAP; cellX++) - for (uint32 cellY = 0; cellY < TOTAL_NUMBER_OF_CELLS_PER_MAP; cellY++) - map->LoadGrid((cellX + 0.5f - CENTER_GRID_CELL_ID) * SIZE_OF_GRID_CELL, (cellY + 0.5f - CENTER_GRID_CELL_ID) * SIZE_OF_GRID_CELL); - + map->LoadAllCells(); handler->PSendSysMessage("Cells loaded (mapId: %u) After load - Next GameObject %u, Creature %u", map->GetId(), map->GetMaxLowGuid<HighGuid::GameObject>(), map->GetMaxLowGuid<HighGuid::Unit>()); return true; } diff --git a/src/server/scripts/Commands/cs_gm.cpp b/src/server/scripts/Commands/cs_gm.cpp index e03942bc247..ffe8ea67816 100644 --- a/src/server/scripts/Commands/cs_gm.cpp +++ b/src/server/scripts/Commands/cs_gm.cpp @@ -164,7 +164,7 @@ public: ///- Get the accounts with GM Level >0 PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_GM_ACCOUNTS); stmt->setUInt8(0, uint8(SEC_MODERATOR)); - stmt->setInt32(1, int32(realmID)); + stmt->setInt32(1, int32(realm.Id.Realm)); PreparedQueryResult result = LoginDatabase.Query(stmt); if (result) diff --git a/src/server/scripts/Commands/cs_lookup.cpp b/src/server/scripts/Commands/cs_lookup.cpp index 61e6acfb4d8..161ade1a30f 100644 --- a/src/server/scripts/Commands/cs_lookup.cpp +++ b/src/server/scripts/Commands/cs_lookup.cpp @@ -1343,7 +1343,7 @@ public: char* limitStr = strtok(NULL, " "); int32 limit = limitStr ? atoi(limitStr) : -1; - if (!AccountMgr::normalizeString + if (!Utf8ToUpperOnlyLatin (account)) return false; diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index c70246f7fb5..3e35a721162 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -36,6 +36,7 @@ #include "MMapFactory.h" #include "DisableMgr.h" #include "SpellHistory.h" +#include "Transport.h" class misc_commandscript : public CommandScript { @@ -237,6 +238,10 @@ public: areaId, (areaEntry ? areaEntry->area_name[handler->GetSessionDbcLocale()] : unknown), object->GetPhaseMask(), object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), object->GetOrientation()); + if (Transport* transport = object->GetTransport()) + handler->PSendSysMessage(LANG_TRANSPORT_POSITION, + transport->GetGOInfo()->moTransport.mapID, object->GetTransOffsetX(), object->GetTransOffsetY(), object->GetTransOffsetZ(), object->GetTransOffsetO(), + transport->GetEntry(), transport->GetName().c_str()); handler->PSendSysMessage(LANG_GRID_POSITION, cell.GridX(), cell.GridY(), cell.CellX(), cell.CellY(), object->GetInstanceId(), zoneX, zoneY, groundZ, floorZ, haveMap, haveVMap, haveMMap); @@ -1588,7 +1593,7 @@ public: // Query the prepared statement for login data stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_PINFO); - stmt->setInt32(0, int32(realmID)); + stmt->setInt32(0, int32(realm.Id.Realm)); stmt->setUInt32(1, accId); PreparedQueryResult result = LoginDatabase.Query(stmt); @@ -1964,7 +1969,7 @@ public: return false; std::string accountName = nameStr; - if (!AccountMgr::normalizeString(accountName)) + if (!Utf8ToUpperOnlyLatin(accountName)) { handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str()); handler->SetSentErrorMessage(true); diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index 761b4c9e0e6..3a062b21c3e 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -473,7 +473,7 @@ public: return false; } - handler->PSendSysMessage(LANG_YOU_CHANGE_ASPEED, ASpeed, targetNameLink.c_str()); + handler->PSendSysMessage(LANG_YOU_CHANGE_ASPEED, targetNameLink.c_str(), ASpeed); if (handler->needReportToTarget(target)) ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_ASPEED_CHANGED, handler->GetNameLink().c_str(), ASpeed); @@ -521,7 +521,7 @@ public: return false; } - handler->PSendSysMessage(LANG_YOU_CHANGE_SPEED, Speed, targetNameLink.c_str()); + handler->PSendSysMessage(LANG_YOU_CHANGE_SPEED, targetNameLink.c_str(), Speed); if (handler->needReportToTarget(target)) ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_SPEED_CHANGED, handler->GetNameLink().c_str(), Speed); @@ -566,7 +566,7 @@ public: return false; } - handler->PSendSysMessage(LANG_YOU_CHANGE_SWIM_SPEED, Swim, targetNameLink.c_str()); + handler->PSendSysMessage(LANG_YOU_CHANGE_SWIM_SPEED, targetNameLink.c_str(), Swim); if (handler->needReportToTarget(target)) ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_SWIM_SPEED_CHANGED, handler->GetNameLink().c_str(), Swim); @@ -611,7 +611,7 @@ public: return false; } - handler->PSendSysMessage(LANG_YOU_CHANGE_BACK_SPEED, BSpeed, targetNameLink.c_str()); + handler->PSendSysMessage(LANG_YOU_CHANGE_BACK_SPEED, targetNameLink.c_str(), BSpeed); if (handler->needReportToTarget(target)) ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_BACK_SPEED_CHANGED, handler->GetNameLink().c_str(), BSpeed); @@ -647,7 +647,7 @@ public: if (handler->HasLowerSecurity(target, ObjectGuid::Empty)) return false; - handler->PSendSysMessage(LANG_YOU_CHANGE_FLY_SPEED, FSpeed, handler->GetNameLink(target).c_str()); + handler->PSendSysMessage(LANG_YOU_CHANGE_FLY_SPEED, handler->GetNameLink(target).c_str(), FSpeed); if (handler->needReportToTarget(target)) ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_FLY_SPEED_CHANGED, handler->GetNameLink().c_str(), FSpeed); @@ -684,7 +684,7 @@ public: if (handler->HasLowerSecurity(player, ObjectGuid::Empty)) return false; - handler->PSendSysMessage(LANG_YOU_CHANGE_SIZE, Scale, handler->GetNameLink(player).c_str()); + handler->PSendSysMessage(LANG_YOU_CHANGE_SIZE, handler->GetNameLink(player).c_str(), Scale); if (handler->needReportToTarget(player)) ChatHandler(player->GetSession()).PSendSysMessage(LANG_YOURS_SIZE_CHANGED, handler->GetNameLink().c_str(), Scale); } diff --git a/src/server/scripts/Commands/cs_rbac.cpp b/src/server/scripts/Commands/cs_rbac.cpp index f7c2d21c12d..64692c4d0ed 100644 --- a/src/server/scripts/Commands/cs_rbac.cpp +++ b/src/server/scripts/Commands/cs_rbac.cpp @@ -49,7 +49,7 @@ class rbac_commandscript : public CommandScript public: rbac_commandscript() : CommandScript("rbac_commandscript") { } - std::vector<ChatCommand> GetCommands() const + std::vector<ChatCommand> GetCommands() const override { static std::vector<ChatCommand> rbacAccountCommandTable = { @@ -139,7 +139,7 @@ public: { accountName = param1; - if (AccountMgr::normalizeString(accountName)) + if (Utf8ToUpperOnlyLatin(accountName)) accountId = AccountMgr::GetId(accountName); if (!accountId) @@ -157,7 +157,7 @@ public: if (!rdata) { - data->rbac = new rbac::RBACData(accountId, accountName, realmID, AccountMgr::GetSecurity(accountId, realmID)); + data->rbac = new rbac::RBACData(accountId, accountName, realm.Id.Realm, AccountMgr::GetSecurity(accountId, realm.Id.Realm)); data->rbac->LoadFromDB(); data->needDelete = true; } diff --git a/src/server/scripts/Commands/cs_script_loader.cpp b/src/server/scripts/Commands/cs_script_loader.cpp new file mode 100644 index 00000000000..449e7053942 --- /dev/null +++ b/src/server/scripts/Commands/cs_script_loader.cpp @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +// This is where scripts' loading functions should be declared: +void AddSC_account_commandscript(); +void AddSC_achievement_commandscript(); +void AddSC_ahbot_commandscript(); +void AddSC_arena_commandscript(); +void AddSC_ban_commandscript(); +void AddSC_bf_commandscript(); +void AddSC_cast_commandscript(); +void AddSC_character_commandscript(); +void AddSC_cheat_commandscript(); +void AddSC_debug_commandscript(); +void AddSC_deserter_commandscript(); +void AddSC_disable_commandscript(); +void AddSC_event_commandscript(); +void AddSC_gm_commandscript(); +void AddSC_go_commandscript(); +void AddSC_gobject_commandscript(); +void AddSC_group_commandscript(); +void AddSC_guild_commandscript(); +void AddSC_honor_commandscript(); +void AddSC_instance_commandscript(); +void AddSC_learn_commandscript(); +void AddSC_lfg_commandscript(); +void AddSC_list_commandscript(); +void AddSC_lookup_commandscript(); +void AddSC_message_commandscript(); +void AddSC_misc_commandscript(); +void AddSC_mmaps_commandscript(); +void AddSC_modify_commandscript(); +void AddSC_npc_commandscript(); +void AddSC_pet_commandscript(); +void AddSC_quest_commandscript(); +void AddSC_rbac_commandscript(); +void AddSC_reload_commandscript(); +void AddSC_reset_commandscript(); +void AddSC_send_commandscript(); +void AddSC_server_commandscript(); +void AddSC_tele_commandscript(); +void AddSC_ticket_commandscript(); +void AddSC_titles_commandscript(); +void AddSC_wp_commandscript(); + +// The name of this function should match: +// void Add${NameOfDirectory}Scripts() +void AddCommandsScripts() +{ + AddSC_account_commandscript(); + AddSC_achievement_commandscript(); + AddSC_ahbot_commandscript(); + AddSC_arena_commandscript(); + AddSC_ban_commandscript(); + AddSC_bf_commandscript(); + AddSC_cast_commandscript(); + AddSC_character_commandscript(); + AddSC_cheat_commandscript(); + AddSC_debug_commandscript(); + AddSC_deserter_commandscript(); + AddSC_disable_commandscript(); + AddSC_event_commandscript(); + AddSC_gm_commandscript(); + AddSC_go_commandscript(); + AddSC_gobject_commandscript(); + AddSC_group_commandscript(); + AddSC_guild_commandscript(); + AddSC_honor_commandscript(); + AddSC_instance_commandscript(); + AddSC_learn_commandscript(); + AddSC_lookup_commandscript(); + AddSC_lfg_commandscript(); + AddSC_list_commandscript(); + AddSC_message_commandscript(); + AddSC_misc_commandscript(); + AddSC_mmaps_commandscript(); + AddSC_modify_commandscript(); + AddSC_npc_commandscript(); + AddSC_quest_commandscript(); + AddSC_pet_commandscript(); + AddSC_rbac_commandscript(); + AddSC_reload_commandscript(); + AddSC_reset_commandscript(); + AddSC_send_commandscript(); + AddSC_server_commandscript(); + AddSC_tele_commandscript(); + AddSC_ticket_commandscript(); + AddSC_titles_commandscript(); + AddSC_wp_commandscript(); +} diff --git a/src/server/scripts/Commands/cs_send.cpp b/src/server/scripts/Commands/cs_send.cpp index 672db3a3ab0..31544543426 100644 --- a/src/server/scripts/Commands/cs_send.cpp +++ b/src/server/scripts/Commands/cs_send.cpp @@ -74,7 +74,7 @@ public: std::string subject = msgSubject; std::string text = msgText; - // from console show not existed sender + // from console, use non-existing sender MailSender sender(MAIL_NORMAL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetGUID().GetCounter() : 0, MAIL_STATIONERY_GM); /// @todo Fix poor design @@ -173,7 +173,7 @@ public: } } - // from console show not existed sender + // from console show nonexisting sender MailSender sender(MAIL_NORMAL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetGUID().GetCounter() : 0, MAIL_STATIONERY_GM); // fill mail @@ -185,7 +185,7 @@ public: { if (Item* item = Item::CreateItem(itr->first, itr->second, handler->GetSession() ? handler->GetSession()->GetPlayer() : 0)) { - item->SaveToDB(trans); // save for prevent lost at next mail load, if send fail then item will deleted + item->SaveToDB(trans); // Save to prevent being lost at next mail load. If send fails, the item will be deleted. draft.AddItem(item); } } @@ -233,7 +233,7 @@ public: std::string subject = msgSubject; std::string text = msgText; - // from console show not existed sender + // from console show nonexisting sender MailSender sender(MAIL_NORMAL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetGUID().GetCounter() : 0, MAIL_STATIONERY_GM); SQLTransaction trans = CharacterDatabase.BeginTransaction(); @@ -260,7 +260,7 @@ public: if (!msgStr) return false; - ///- Check that he is not logging out. + /// - Check if player is logging out. if (player->GetSession()->isLogingOut()) { handler->SendSysMessage(LANG_PLAYER_NOT_FOUND); diff --git a/src/server/scripts/Commands/cs_ticket.cpp b/src/server/scripts/Commands/cs_ticket.cpp index c5c85f5f3cc..899c5615206 100644 --- a/src/server/scripts/Commands/cs_ticket.cpp +++ b/src/server/scripts/Commands/cs_ticket.cpp @@ -95,7 +95,7 @@ public: ObjectGuid targetGuid = sObjectMgr->GetPlayerGUIDByName(target); uint32 accountId = sObjectMgr->GetPlayerAccountIdByGUID(targetGuid); // Target must exist and have administrative rights - if (!AccountMgr::HasPermission(accountId, rbac::RBAC_PERM_COMMANDS_BE_ASSIGNED_TICKET, realmID)) + if (!AccountMgr::HasPermission(accountId, rbac::RBAC_PERM_COMMANDS_BE_ASSIGNED_TICKET, realm.Id.Realm)) { handler->SendSysMessage(LANG_COMMAND_TICKETASSIGNERROR_A); return true; @@ -119,7 +119,7 @@ public: // Assign ticket SQLTransaction trans = SQLTransaction(NULL); - ticket->SetAssignedTo(targetGuid, AccountMgr::IsAdminAccount(AccountMgr::GetSecurity(accountId, realmID))); + ticket->SetAssignedTo(targetGuid, AccountMgr::IsAdminAccount(AccountMgr::GetSecurity(accountId, realm.Id.Realm))); ticket->SaveToDB(trans); sTicketMgr->UpdateLastChange(); @@ -387,7 +387,7 @@ public: { ObjectGuid guid = ticket->GetAssignedToGUID(); uint32 accountId = sObjectMgr->GetPlayerAccountIdByGUID(guid); - security = AccountMgr::GetSecurity(accountId, realmID); + security = AccountMgr::GetSecurity(accountId, realm.Id.Realm); } // Check security diff --git a/src/server/scripts/Commands/cs_titles.cpp b/src/server/scripts/Commands/cs_titles.cpp index 2f5d7b8364c..6309e7279c9 100644 --- a/src/server/scripts/Commands/cs_titles.cpp +++ b/src/server/scripts/Commands/cs_titles.cpp @@ -225,7 +225,7 @@ public: if (CharTitlesEntry const* tEntry = sCharTitlesStore.LookupEntry(i)) titles2 &= ~(uint64(1) << tEntry->bit_index); - titles &= ~titles2; // remove not existed titles + titles &= ~titles2; // remove non-existing titles target->SetUInt64Value(PLAYER__FIELD_KNOWN_TITLES, titles); handler->SendSysMessage(LANG_DONE); diff --git a/src/server/scripts/Commands/cs_wp.cpp b/src/server/scripts/Commands/cs_wp.cpp index ef61c231104..424f94f7385 100644 --- a/src/server/scripts/Commands/cs_wp.cpp +++ b/src/server/scripts/Commands/cs_wp.cpp @@ -561,29 +561,24 @@ public: // -> variable lowguid is filled with the GUID of the NPC uint32 pathid = 0; uint32 point = 0; - uint32 wpGuid = 0; Creature* target = handler->getSelectedCreature(); PreparedStatement* stmt = NULL; + // User did select a visual waypoint? if (!target || target->GetEntry() != VISUAL_WAYPOINT) { handler->SendSysMessage("|cffff33ffERROR: You must select a waypoint.|r"); return false; } - // The visual waypoint - wpGuid = target->GetGUID().GetCounter(); - - // User did select a visual waypoint? - // Check the creature stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_WAYPOINT_DATA_BY_WPGUID); - stmt->setUInt32(0, wpGuid); + stmt->setUInt32(0, target->GetSpawnId()); PreparedQueryResult result = WorldDatabase.Query(stmt); if (!result) { - handler->PSendSysMessage(LANG_WAYPOINT_NOTFOUNDSEARCH, target->GetGUID().GetCounter()); + handler->PSendSysMessage(LANG_WAYPOINT_NOTFOUNDSEARCH, target->GetSpawnId()); // Select waypoint number from database // Since we compare float values, we have to deal with // some difficulties. @@ -599,11 +594,11 @@ public: stmt->setString(3, maxDiff); stmt->setFloat(4, target->GetPositionZ()); stmt->setString(5, maxDiff); - PreparedQueryResult queryResult = WorldDatabase.Query(stmt); + result = WorldDatabase.Query(stmt); - if (!queryResult) + if (!result) { - handler->PSendSysMessage(LANG_WAYPOINT_NOTFOUNDDBPROBLEM, wpGuid); + handler->PSendSysMessage(LANG_WAYPOINT_NOTFOUNDDBPROBLEM, target->GetSpawnId()); return true; } } @@ -631,13 +626,8 @@ public: { handler->PSendSysMessage("|cff00ff00DEBUG: wp modify del, PathID: |r|cff00ffff%u|r", pathid); - if (wpGuid != 0) - if (Creature* wpCreature = handler->GetSession()->GetPlayer()->GetMap()->GetCreature(ObjectGuid(HighGuid::Unit, VISUAL_WAYPOINT, wpGuid))) - { - wpCreature->CombatStop(); - wpCreature->DeleteFromDB(); - wpCreature->AddObjectToRemoveList(); - } + target->DeleteFromDB(); + target->AddObjectToRemoveList(); stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_WAYPOINT_DATA); stmt->setUInt32(0, pathid); @@ -659,51 +649,40 @@ public: Player* chr = handler->GetSession()->GetPlayer(); Map* map = chr->GetMap(); + // What to do: + // Move the visual spawnpoint + // Respawn the owner of the waypoints + target->DeleteFromDB(); + target->AddObjectToRemoveList(); + + // re-create + Creature* wpCreature = new Creature(); + if (!wpCreature->Create(map->GenerateLowGuid<HighGuid::Unit>(), map, chr->GetPhaseMaskForSpawn(), VISUAL_WAYPOINT, chr->GetPositionX(), chr->GetPositionY(), chr->GetPositionZ(), chr->GetOrientation())) { - // What to do: - // Move the visual spawnpoint - // Respawn the owner of the waypoints - if (wpGuid != 0) - { - if (Creature* wpCreature = map->GetCreature(ObjectGuid(HighGuid::Unit, VISUAL_WAYPOINT, wpGuid))) - { - wpCreature->CombatStop(); - wpCreature->DeleteFromDB(); - wpCreature->AddObjectToRemoveList(); - } - // re-create - Creature* wpCreature2 = new Creature(); - if (!wpCreature2->Create(map->GenerateLowGuid<HighGuid::Unit>(), map, chr->GetPhaseMaskForSpawn(), VISUAL_WAYPOINT, chr->GetPositionX(), chr->GetPositionY(), chr->GetPositionZ(), chr->GetOrientation())) - { - handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, VISUAL_WAYPOINT); - delete wpCreature2; - wpCreature2 = NULL; - return false; - } + handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, VISUAL_WAYPOINT); + delete wpCreature; + return false; + } - wpCreature2->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn()); - // To call _LoadGoods(); _LoadQuests(); CreateTrainerSpells(); - /// @todo Should we first use "Create" then use "LoadFromDB"? - if (!wpCreature2->LoadCreatureFromDB(wpCreature2->GetSpawnId(), map)) - { - handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, VISUAL_WAYPOINT); - delete wpCreature2; - wpCreature2 = NULL; - return false; - } - //sMapMgr->GetMap(npcCreature->GetMapId())->Add(wpCreature2); - } + wpCreature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn()); + // To call _LoadGoods(); _LoadQuests(); CreateTrainerSpells(); + /// @todo Should we first use "Create" then use "LoadFromDB"? + if (!wpCreature->LoadCreatureFromDB(wpCreature->GetSpawnId(), map)) + { + handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, VISUAL_WAYPOINT); + delete wpCreature; + return false; + } - stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_WAYPOINT_DATA_POSITION); - stmt->setFloat(0, chr->GetPositionX()); - stmt->setFloat(1, chr->GetPositionY()); - stmt->setFloat(2, chr->GetPositionZ()); - stmt->setUInt32(3, pathid); - stmt->setUInt32(4, point); - WorldDatabase.Execute(stmt); + stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_WAYPOINT_DATA_POSITION); + stmt->setFloat(0, chr->GetPositionX()); + stmt->setFloat(1, chr->GetPositionY()); + stmt->setFloat(2, chr->GetPositionZ()); + stmt->setUInt32(3, pathid); + stmt->setUInt32(4, point); + WorldDatabase.Execute(stmt); - handler->PSendSysMessage(LANG_WAYPOINT_CHANGED); - } + handler->PSendSysMessage(LANG_WAYPOINT_CHANGED); return true; } // move @@ -897,14 +876,15 @@ public: return false; } + wpCreature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn()); + // Set "wpguid" column to the visual waypoint stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_WAYPOINT_DATA_WPGUID); - stmt->setInt32(0, int32(wpCreature->GetGUID().GetCounter())); + stmt->setInt32(0, int32(wpCreature->GetSpawnId())); stmt->setUInt32(1, pathid); stmt->setUInt32(2, point); WorldDatabase.Execute(stmt); - wpCreature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn()); // To call _LoadGoods(); _LoadQuests(); CreateTrainerSpells(); if (!wpCreature->LoadCreatureFromDB(wpCreature->GetSpawnId(), map)) { diff --git a/src/server/scripts/Custom/CMakeLists.txt b/src/server/scripts/Custom/CMakeLists.txt deleted file mode 100644 index 595ff801813..00000000000 --- a/src/server/scripts/Custom/CMakeLists.txt +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> -# -# This file is free software; as a special exception the author gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -# file(GLOB_RECURSE sources_Custom Custom/*.cpp Custom/*.h) - -set(scripts_STAT_SRCS - ${scripts_STAT_SRCS} -# ${sources_Custom} -) - -message(" -> Prepared: Custom") diff --git a/src/server/scripts/Custom/custom_script_loader.cpp b/src/server/scripts/Custom/custom_script_loader.cpp new file mode 100644 index 00000000000..dd4b5e99d77 --- /dev/null +++ b/src/server/scripts/Custom/custom_script_loader.cpp @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +// This is where scripts' loading functions should be declared: + + +// The name of this function should match: +// void Add${NameOfDirectory}Scripts() +void AddCustomScripts() +{ +} diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp index 9cd724e5596..79709734e18 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp @@ -508,19 +508,11 @@ public: }; // npc_lokhtos_darkbargainer -enum LokhtosItems +enum Lokhtos { + QUEST_A_BINDING_CONTRACT = 7604, + ITEM_SULFURON_INGOT = 17203, ITEM_THRORIUM_BROTHERHOOD_CONTRACT = 18628, - ITEM_SULFURON_INGOT = 17203 -}; - -enum LokhtosQuests -{ - QUEST_A_BINDING_CONTRACT = 7604 -}; - -enum LokhtosSpells -{ SPELL_CREATE_THORIUM_BROTHERHOOD_CONTRACT_DND = 23059 }; @@ -570,67 +562,12 @@ public: } }; -// npc_dughal_stormwing -enum DughalQuests -{ - QUEST_JAIL_BREAK = 4322 -}; - -#define SAY_DUGHAL_FREE "Thank you, $N! I'm free!!!" -#define GOSSIP_DUGHAL "You're free, Dughal! Get out of here!" - -// npc_marshal_windsor -#define SAY_WINDSOR_AGGRO1 "You locked up the wrong Marshal. Prepare to be destroyed!" -#define SAY_WINDSOR_AGGRO2 "I bet you're sorry now, aren't you !?!!" -#define SAY_WINDSOR_AGGRO3 "You better hold me back $N or they are going to feel some prison house beatings." -#define SAY_WINDSOR_1 "Let's get a move on. My gear should be in the storage area up this way..." -#define SAY_WINDSOR_4_1 "Check that cell, $N. If someone is alive in there, we need to get them out." -#define SAY_WINDSOR_4_2 "Get him out of there!" -#define SAY_WINDSOR_4_3 "Good work! We're almost there, $N. This way." -#define SAY_WINDSOR_6 "This is it, $N. My stuff should be in that room. Cover me, I'm going in!" -#define SAY_WINDSOR_9 "Ah, there it is!" - -enum MarshalWindsor -{ - NPC_REGINALD_WINDSOR = 9682 -}; - -// npc_marshal_reginald_windsor -#define SAY_REGINALD_WINDSOR_0_1 "Can you feel the power, $N??? It's time to ROCK!" -#define SAY_REGINALD_WINDSOR_0_2 "Now we just have to free Tobias and we can get out of here. This way!" -#define SAY_REGINALD_WINDSOR_5_1 "Open it." -#define SAY_REGINALD_WINDSOR_5_2 "I never did like those two. Let's get moving." -#define SAY_REGINALD_WINDSOR_7_1 "Open it and be careful this time!" -#define SAY_REGINALD_WINDSOR_7_2 "That intolerant dirtbag finally got what was coming to him. Good riddance!" -#define SAY_REGINALD_WINDSOR_7_3 "Alright, let's go." -#define SAY_REGINALD_WINDSOR_13_1 "Open it. We need to hurry up. I can smell those Dark Irons coming a mile away and I can tell you one thing, they're COMING!" -#define SAY_REGINALD_WINDSOR_13_2 "Administering fists of fury on Crest Killer!" -#define SAY_REGINALD_WINDSOR_13_3 "He has to be in the last cell. Unless... they killed him." -#define SAY_REGINALD_WINDSOR_14_1 "Get him out of there!" -#define SAY_REGINALD_WINDSOR_14_2 "Excellent work, $N. Let's find the exit. I think I know the way. Follow me!" -#define SAY_REGINALD_WINDSOR_20_1 "We made it!" -#define SAY_REGINALD_WINDSOR_20_2 "Meet me at Maxwell's encampment. We'll go over the next stages of the plan there and figure out a way to decode my tablets without the decryption ring." - -enum MarshalReginaldWindor -{ - NPC_SHILL_DINGER = 9678, - NPC_CREST_KILLER = 9680 -}; - // npc_rocknot -enum RocknotSays -{ - SAY_GOT_BEER = 0 -}; - -enum RocknotSpells -{ - SPELL_DRUNKEN_RAGE = 14872 -}; - -enum RocknotQuests +enum Rocknot { - QUEST_ALE = 4295 + SAY_GOT_BEER = 0, + QUEST_ALE = 4295, + SPELL_DRUNKEN_RAGE = 14872 }; class npc_rocknot : public CreatureScript diff --git a/src/server/scripts/EasternKingdoms/CMakeLists.txt b/src/server/scripts/EasternKingdoms/CMakeLists.txt deleted file mode 100644 index 8e6616347f9..00000000000 --- a/src/server/scripts/EasternKingdoms/CMakeLists.txt +++ /dev/null @@ -1,204 +0,0 @@ -# Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> -# -# This file is free software; as a special exception the author gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -set(scripts_STAT_SRCS - ${scripts_STAT_SRCS} - EasternKingdoms/zone_ghostlands.cpp - EasternKingdoms/AlteracValley/boss_galvangar.cpp - EasternKingdoms/AlteracValley/boss_balinda.cpp - EasternKingdoms/AlteracValley/boss_drekthar.cpp - EasternKingdoms/AlteracValley/boss_vanndar.cpp - EasternKingdoms/AlteracValley/alterac_valley.cpp - EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_high_interrogator_gerstahn.cpp - EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.cpp - EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_tomb_of_seven.cpp - EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_general_angerforge.cpp - EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_ambassador_flamelash.cpp - EasternKingdoms/BlackrockMountain/BlackrockDepths/instance_blackrock_depths.cpp - EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_moira_bronzebeard.cpp - EasternKingdoms/BlackrockMountain/BlackrockDepths/blackrock_depths.h - EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_emperor_dagran_thaurissan.cpp - EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_magmus.cpp - EasternKingdoms/BlackrockMountain/BlackwingLair/boss_chromaggus.cpp - EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp - EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp - EasternKingdoms/BlackrockMountain/BlackwingLair/boss_broodlord_lashlayer.cpp - EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp - EasternKingdoms/BlackrockMountain/BlackwingLair/instance_blackwing_lair.cpp - EasternKingdoms/BlackrockMountain/BlackwingLair/boss_vaelastrasz.cpp - EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp - EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp - EasternKingdoms/BlackrockMountain/BlackwingLair/blackwing_lair.h - EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_pyroguard_emberseer.cpp - EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_drakkisath.cpp - EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_warmaster_voone.cpp - EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_mother_smolderweb.cpp - EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_quartermaster_zigris.cpp - EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_halycon.cpp - EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_overlord_wyrmthalak.cpp - EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_shadow_hunter_voshgajin.cpp - EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gyth.cpp - EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_rend_blackhand.cpp - EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_highlord_omokk.cpp - EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_the_beast.cpp - EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_gizrul_the_slavener.cpp - EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_urok_doomhowl.cpp - EasternKingdoms/BlackrockMountain/BlackrockSpire/boss_lord_valthalak.cpp - EasternKingdoms/BlackrockMountain/BlackrockSpire/blackrock_spire.h - EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp - EasternKingdoms/BlackrockMountain/MoltenCore/boss_gehennas.cpp - EasternKingdoms/BlackrockMountain/MoltenCore/boss_lucifron.cpp - EasternKingdoms/BlackrockMountain/MoltenCore/boss_golemagg.cpp - EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp - EasternKingdoms/BlackrockMountain/MoltenCore/boss_baron_geddon.cpp - EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp - EasternKingdoms/BlackrockMountain/MoltenCore/boss_garr.cpp - EasternKingdoms/BlackrockMountain/MoltenCore/molten_core.h - EasternKingdoms/BlackrockMountain/MoltenCore/instance_molten_core.cpp - EasternKingdoms/BlackrockMountain/MoltenCore/boss_sulfuron_harbinger.cpp - EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp - EasternKingdoms/BlackrockMountain/MoltenCore/boss_shazzrah.cpp - EasternKingdoms/Scholomance/boss_the_ravenian.cpp - EasternKingdoms/Scholomance/boss_instructor_malicia.cpp - EasternKingdoms/Scholomance/boss_death_knight_darkreaver.cpp - EasternKingdoms/Scholomance/boss_illucia_barov.cpp - EasternKingdoms/Scholomance/scholomance.h - EasternKingdoms/Scholomance/boss_vectus.cpp - EasternKingdoms/Scholomance/boss_jandice_barov.cpp - EasternKingdoms/Scholomance/boss_kormok.cpp - EasternKingdoms/Scholomance/boss_lord_alexei_barov.cpp - EasternKingdoms/Scholomance/boss_doctor_theolen_krastinov.cpp - EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp - EasternKingdoms/Scholomance/instance_scholomance.cpp - EasternKingdoms/Scholomance/boss_lorekeeper_polkelt.cpp - EasternKingdoms/Scholomance/boss_ras_frostwhisper.cpp - EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp - EasternKingdoms/zone_isle_of_queldanas.cpp - EasternKingdoms/ZulGurub/boss_hakkar.cpp - EasternKingdoms/ZulGurub/boss_mandokir.cpp - EasternKingdoms/ZulGurub/boss_marli.cpp - EasternKingdoms/ZulGurub/boss_hazzarah.cpp - EasternKingdoms/ZulGurub/boss_jeklik.cpp - EasternKingdoms/ZulGurub/boss_grilek.cpp - EasternKingdoms/ZulGurub/zulgurub.h - EasternKingdoms/ZulGurub/boss_renataki.cpp - EasternKingdoms/ZulGurub/boss_arlokk.cpp - EasternKingdoms/ZulGurub/boss_gahzranka.cpp - EasternKingdoms/ZulGurub/boss_venoxis.cpp - EasternKingdoms/ZulGurub/instance_zulgurub.cpp - EasternKingdoms/ZulGurub/boss_jindo.cpp - EasternKingdoms/ZulGurub/boss_wushoolay.cpp - EasternKingdoms/ZulGurub/boss_thekal.cpp - EasternKingdoms/zone_wetlands.cpp - EasternKingdoms/zone_arathi_highlands.cpp - EasternKingdoms/Gnomeregan/instance_gnomeregan.cpp - EasternKingdoms/Gnomeregan/gnomeregan.cpp - EasternKingdoms/Gnomeregan/gnomeregan.h - EasternKingdoms/zone_redridge_mountains.cpp - EasternKingdoms/ScarletEnclave/chapter2.cpp - EasternKingdoms/ScarletEnclave/chapter5.cpp - EasternKingdoms/ScarletEnclave/chapter1.cpp - EasternKingdoms/ScarletEnclave/zone_the_scarlet_enclave.cpp - EasternKingdoms/zone_eastern_plaguelands.cpp - EasternKingdoms/Stratholme/boss_baroness_anastari.cpp - EasternKingdoms/Stratholme/boss_nerubenkan.cpp - EasternKingdoms/Stratholme/instance_stratholme.cpp - EasternKingdoms/Stratholme/boss_dathrohan_balnazzar.cpp - EasternKingdoms/Stratholme/boss_timmy_the_cruel.cpp - EasternKingdoms/Stratholme/boss_baron_rivendare.cpp - EasternKingdoms/Stratholme/boss_magistrate_barthilas.cpp - EasternKingdoms/Stratholme/boss_order_of_silver_hand.cpp - EasternKingdoms/Stratholme/boss_ramstein_the_gorger.cpp - EasternKingdoms/Stratholme/boss_cannon_master_willey.cpp - EasternKingdoms/Stratholme/boss_maleki_the_pallid.cpp - EasternKingdoms/Stratholme/boss_postmaster_malown.cpp - EasternKingdoms/Stratholme/stratholme.h - EasternKingdoms/Stratholme/stratholme.cpp - EasternKingdoms/zone_tirisfal_glades.cpp - EasternKingdoms/SunkenTemple/sunken_temple.cpp - EasternKingdoms/SunkenTemple/sunken_temple.h - EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp - EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp - EasternKingdoms/MagistersTerrace/magisters_terrace.h - EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp - EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp - EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp - EasternKingdoms/MagistersTerrace/boss_vexallus.cpp - EasternKingdoms/MagistersTerrace/magisters_terrace.cpp - EasternKingdoms/Uldaman/uldaman.cpp - EasternKingdoms/Uldaman/boss_ironaya.cpp - EasternKingdoms/Uldaman/uldaman.h - EasternKingdoms/Uldaman/instance_uldaman.cpp - EasternKingdoms/Uldaman/boss_archaedas.cpp - EasternKingdoms/zone_swamp_of_sorrows.cpp - EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp - EasternKingdoms/SunwellPlateau/boss_kiljaeden.cpp - EasternKingdoms/SunwellPlateau/sunwell_plateau.h - EasternKingdoms/SunwellPlateau/boss_muru.cpp - EasternKingdoms/SunwellPlateau/instance_sunwell_plateau.cpp - EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp - EasternKingdoms/SunwellPlateau/boss_brutallus.cpp - EasternKingdoms/SunwellPlateau/sunwell_plateau.cpp - EasternKingdoms/SunwellPlateau/boss_felmyst.cpp - EasternKingdoms/zone_stranglethorn_vale.cpp - EasternKingdoms/Deadmines/deadmines.h - EasternKingdoms/Deadmines/deadmines.cpp - EasternKingdoms/Deadmines/boss_mr_smite.cpp - EasternKingdoms/Deadmines/instance_deadmines.cpp - EasternKingdoms/zone_duskwood.cpp - EasternKingdoms/ScarletMonastery/boss_azshir_the_sleepless.cpp - EasternKingdoms/ScarletMonastery/boss_mograine_and_whitemane.cpp - EasternKingdoms/ScarletMonastery/boss_bloodmage_thalnos.cpp - EasternKingdoms/ScarletMonastery/boss_interrogator_vishas.cpp - EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp - EasternKingdoms/ScarletMonastery/instance_scarlet_monastery.cpp - EasternKingdoms/ScarletMonastery/boss_houndmaster_loksey.cpp - EasternKingdoms/ScarletMonastery/scarlet_monastery.h - EasternKingdoms/ScarletMonastery/boss_high_inquisitor_fairbanks.cpp - EasternKingdoms/ScarletMonastery/boss_arcanist_doan.cpp - EasternKingdoms/ScarletMonastery/boss_herod.cpp - EasternKingdoms/ScarletMonastery/boss_scorn.cpp - EasternKingdoms/zone_undercity.cpp - EasternKingdoms/zone_loch_modan.cpp - EasternKingdoms/ShadowfangKeep/shadowfang_keep.cpp - EasternKingdoms/ShadowfangKeep/instance_shadowfang_keep.cpp - EasternKingdoms/ShadowfangKeep/shadowfang_keep.h - EasternKingdoms/zone_burning_steppes.cpp - EasternKingdoms/zone_blasted_lands.cpp - EasternKingdoms/zone_stormwind_city.cpp - EasternKingdoms/ZulAman/boss_halazzi.cpp - EasternKingdoms/ZulAman/boss_hexlord.cpp - EasternKingdoms/ZulAman/boss_zuljin.cpp - EasternKingdoms/ZulAman/boss_akilzon.cpp - EasternKingdoms/ZulAman/instance_zulaman.cpp - EasternKingdoms/ZulAman/boss_janalai.cpp - EasternKingdoms/ZulAman/boss_nalorakk.cpp - EasternKingdoms/ZulAman/zulaman.cpp - EasternKingdoms/ZulAman/zulaman.h - EasternKingdoms/zone_hinterlands.cpp - EasternKingdoms/zone_western_plaguelands.cpp - EasternKingdoms/zone_silverpine_forest.cpp - EasternKingdoms/Karazhan/instance_karazhan.cpp - EasternKingdoms/Karazhan/boss_nightbane.cpp - EasternKingdoms/Karazhan/karazhan.cpp - EasternKingdoms/Karazhan/boss_curator.cpp - EasternKingdoms/Karazhan/boss_shade_of_aran.cpp - EasternKingdoms/Karazhan/boss_netherspite.cpp - EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp - EasternKingdoms/Karazhan/boss_midnight.cpp - EasternKingdoms/Karazhan/boss_prince_malchezaar.cpp - EasternKingdoms/Karazhan/bosses_opera.cpp - EasternKingdoms/Karazhan/boss_moroes.cpp - EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp - EasternKingdoms/Karazhan/karazhan.h - EasternKingdoms/TheStockade/instance_the_stockade.cpp -) - -message(" -> Prepared: Eastern Kingdoms") diff --git a/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp b/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp index b827fdf7e8b..7599cf38f08 100644 --- a/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp +++ b/src/server/scripts/EasternKingdoms/Deadmines/instance_deadmines.cpp @@ -59,6 +59,7 @@ class instance_deadmines : public InstanceMapScript State = CANNON_NOT_USED; CannonBlast_Timer = 0; PiratesDelay_Timer = 0; + SmiteAlarmDelay_Timer = 0; } ObjectGuid FactoryDoorGUID; diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp index 9f4a31fdbbc..b694c074879 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp @@ -50,19 +50,9 @@ class boss_maiden_of_virtue : public CreatureScript public: boss_maiden_of_virtue() : CreatureScript("boss_maiden_of_virtue") { } - CreatureAI* GetAI(Creature* creature) const override - { - return new boss_maiden_of_virtueAI(creature); - } - struct boss_maiden_of_virtueAI : public BossAI { - boss_maiden_of_virtueAI(Creature* creature) : BossAI(creature, TYPE_MAIDEN) { } - - void Reset() override - { - _Reset(); - } + boss_maiden_of_virtueAI(Creature* creature) : BossAI(creature, DATA_MAIDEN_OF_VIRTUE) { } void KilledUnit(Unit* /*Victim*/) override { @@ -132,6 +122,11 @@ public: DoMeleeAttackIfReady(); } }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new boss_maiden_of_virtueAI(creature); + } }; void AddSC_boss_maiden_of_virtue() diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp index ced8dd8f37e..d4de862244c 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_midnight.cpp @@ -26,6 +26,7 @@ EndScriptData */ #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "SpellInfo.h" +#include "karazhan.h" enum Midnight { @@ -109,6 +110,9 @@ public: Talk(SAY_DEATH); if (Unit* midnight = ObjectAccessor::GetUnit(*me, Midnight)) midnight->KillSelf(); + + if (InstanceScript* instance = me->GetInstanceScript()) + instance->SetBossState(DATA_ATTUMEN, DONE); } void UpdateAI(uint32 diff) override; @@ -157,7 +161,11 @@ public: me->SetVisible(true); } - void EnterCombat(Unit* /*who*/) override { } + void EnterCombat(Unit* /*who*/) override + { + if (InstanceScript* instance = me->GetInstanceScript()) + instance->SetBossState(DATA_ATTUMEN, IN_PROGRESS); + } void KilledUnit(Unit* /*victim*/) override { diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp index 79e36442f4b..e667141fa29 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp @@ -143,12 +143,12 @@ public: if (me->IsAlive()) SpawnAdds(); - instance->SetData(TYPE_MOROES, NOT_STARTED); + instance->SetBossState(DATA_MOROES, NOT_STARTED); } void StartEvent() { - instance->SetData(TYPE_MOROES, IN_PROGRESS); + instance->SetBossState(DATA_MOROES, IN_PROGRESS); DoZoneInCombat(); } @@ -171,7 +171,7 @@ public: { Talk(SAY_DEATH); - instance->SetData(TYPE_MOROES, DONE); + instance->SetBossState(DATA_MOROES, DONE); DeSpawnAdds(); @@ -257,12 +257,6 @@ public: if (!UpdateVictim()) return; - if (!instance->GetData(TYPE_MOROES)) - { - EnterEvadeMode(); - return; - } - if (!Enrage && HealthBelowPct(30)) { DoCast(me, SPELL_FRENZY); @@ -347,7 +341,7 @@ struct boss_moroes_guestAI : public ScriptedAI void Reset() override { - instance->SetData(TYPE_MOROES, NOT_STARTED); + instance->SetBossState(DATA_MOROES, NOT_STARTED); } void AcquireGUID() @@ -373,7 +367,7 @@ struct boss_moroes_guestAI : public ScriptedAI void UpdateAI(uint32 /*diff*/) override { - if (!instance->GetData(TYPE_MOROES)) + if (instance->GetBossState(DATA_MOROES) != IN_PROGRESS) EnterEvadeMode(); DoMeleeAttackIfReady(); diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp index 6f5f2b8f65f..7d7c60ac419 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_nightbane.cpp @@ -143,10 +143,10 @@ public: me->SetWalk(false); me->setActive(true); - if (instance->GetData(TYPE_NIGHTBANE) == DONE || instance->GetData(TYPE_NIGHTBANE) == IN_PROGRESS) + if (instance->GetBossState(DATA_NIGHTBANE) == DONE || instance->GetBossState(DATA_NIGHTBANE) == IN_PROGRESS) me->DisappearAndDie(); else - instance->SetData(TYPE_NIGHTBANE, NOT_STARTED); + instance->SetBossState(DATA_NIGHTBANE, NOT_STARTED); HandleTerraceDoors(true); @@ -165,10 +165,10 @@ public: void EnterCombat(Unit* /*who*/) override { - instance->SetData(TYPE_NIGHTBANE, IN_PROGRESS); + instance->SetBossState(DATA_NIGHTBANE, IN_PROGRESS); HandleTerraceDoors(false); - Talk(YELL_AGGRO); + Talk(YELL_AGGRO); } void AttackStart(Unit* who) override @@ -179,7 +179,7 @@ public: void JustDied(Unit* /*killer*/) override { - instance->SetData(TYPE_NIGHTBANE, DONE); + instance->SetBossState(DATA_NIGHTBANE, DONE); HandleTerraceDoors(true); } diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp index 450678a0f86..17a23a0b2e7 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_shade_of_aran.cpp @@ -154,7 +154,7 @@ public: Initialize(); // Not in progress - instance->SetData(TYPE_ARAN, NOT_STARTED); + instance->SetBossState(DATA_ARAN, NOT_STARTED); instance->HandleGameObject(instance->GetGuidData(DATA_GO_LIBRARY_DOOR), true); } @@ -167,7 +167,7 @@ public: { Talk(SAY_DEATH); - instance->SetData(TYPE_ARAN, DONE); + instance->SetBossState(DATA_ARAN, DONE); instance->HandleGameObject(instance->GetGuidData(DATA_GO_LIBRARY_DOOR), true); } @@ -175,7 +175,7 @@ public: { Talk(SAY_AGGRO); - instance->SetData(TYPE_ARAN, IN_PROGRESS); + instance->SetBossState(DATA_ARAN, IN_PROGRESS); instance->HandleGameObject(instance->GetGuidData(DATA_GO_LIBRARY_DOOR), false); } diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp index 7bc835dcced..2e33f0933e3 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_terestian_illhoof.cpp @@ -61,7 +61,6 @@ enum Creatures NPC_DEMONCHAINS = 17248, NPC_FIENDISHIMP = 17267, NPC_PORTAL = 17265, - NPC_KILREK = 17229 }; @@ -316,7 +315,7 @@ public: Initialize(); - instance->SetData(TYPE_TERESTIAN, NOT_STARTED); + instance->SetBossState(DATA_TERESTIAN, NOT_STARTED); me->RemoveAurasDueToSpell(SPELL_BROKEN_PACT); @@ -371,7 +370,7 @@ public: Talk(SAY_DEATH); - instance->SetData(TYPE_TERESTIAN, DONE); + instance->SetBossState(DATA_TERESTIAN, DONE); } void UpdateAI(uint32 diff) override diff --git a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp index d4d0e6fa70d..0f6913b7ebc 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/bosses_opera.cpp @@ -708,13 +708,7 @@ public: void JustDied(Unit* /*killer*/) override { Talk(SAY_CRONE_DEATH); - - instance->SetData(TYPE_OPERA, DONE); - instance->HandleGameObject(instance->GetGuidData(DATA_GO_STAGEDOORLEFT), true); - instance->HandleGameObject(instance->GetGuidData(DATA_GO_STAGEDOORRIGHT), true); - - if (GameObject* pSideEntrance = instance->instance->GetGameObject(instance->GetGuidData(DATA_GO_SIDE_ENTRANCE_DOOR))) - pSideEntrance->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); + instance->SetBossState(DATA_OPERA_PERFORMANCE, DONE); } void UpdateAI(uint32 diff) override @@ -908,13 +902,7 @@ public: void JustDied(Unit* /*killer*/) override { DoPlaySoundToSet(me, SOUND_WOLF_DEATH); - - instance->SetData(TYPE_OPERA, DONE); - instance->HandleGameObject(instance->GetGuidData(DATA_GO_STAGEDOORLEFT), true); - instance->HandleGameObject(instance->GetGuidData(DATA_GO_STAGEDOORRIGHT), true); - - if (GameObject* pSideEntrance = instance->instance->GetGameObject(instance->GetGuidData(DATA_GO_SIDE_ENTRANCE_DOOR))) - pSideEntrance->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); + instance->SetBossState(DATA_OPERA_PERFORMANCE, DONE); } void UpdateAI(uint32 diff) override @@ -1158,12 +1146,7 @@ public: void JustDied(Unit* /*killer*/) override { Talk(SAY_JULIANNE_DEATH02); - - instance->SetData(TYPE_OPERA, DONE); - instance->HandleGameObject(instance->GetGuidData(DATA_GO_STAGEDOORLEFT), true); - instance->HandleGameObject(instance->GetGuidData(DATA_GO_STAGEDOORRIGHT), true); - if (GameObject* pSideEntrance = instance->instance->GetGameObject(instance->GetGuidData(DATA_GO_SIDE_ENTRANCE_DOOR))) - pSideEntrance->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); + instance->SetBossState(DATA_OPERA_PERFORMANCE, DONE); } void KilledUnit(Unit* /*victim*/) override @@ -1316,13 +1299,7 @@ public: void JustDied(Unit* /*killer*/) override { Talk(SAY_ROMULO_DEATH); - - instance->SetData(TYPE_OPERA, DONE); - instance->HandleGameObject(instance->GetGuidData(DATA_GO_STAGEDOORLEFT), true); - instance->HandleGameObject(instance->GetGuidData(DATA_GO_STAGEDOORRIGHT), true); - - if (GameObject* pSideEntrance = instance->instance->GetGameObject(instance->GetGuidData(DATA_GO_SIDE_ENTRANCE_DOOR))) - pSideEntrance->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); + instance->SetBossState(DATA_OPERA_PERFORMANCE, DONE); } void KilledUnit(Unit* /*victim*/) override diff --git a/src/server/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp b/src/server/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp index b725f421c8f..ad403e6aeed 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/instance_karazhan.cpp @@ -27,8 +27,6 @@ EndScriptData */ #include "InstanceScript.h" #include "karazhan.h" -#define MAX_ENCOUNTER 12 - /* 0 - Attumen + Midnight (optional) 1 - Moroes @@ -47,8 +45,8 @@ EndScriptData */ const Position OptionalSpawn[] = { { -10960.981445f, -1940.138428f, 46.178097f, 4.12f }, // Hyakiss the Lurker - { -10899.903320f, -2085.573730f, 49.474449f, 1.38f }, // Rokad the Ravager - { -10945.769531f, -2040.153320f, 49.474438f, 0.077f } // Shadikith the Glider + { -10945.769531f, -2040.153320f, 49.474438f, 0.077f }, // Shadikith the Glider + { -10899.903320f, -2085.573730f, 49.474449f, 1.38f } // Rokad the Ravager }; class instance_karazhan : public InstanceMapScript @@ -66,53 +64,27 @@ public: instance_karazhan_InstanceMapScript(Map* map) : InstanceScript(map) { SetHeaders(DataHeader); - memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); + SetBossNumber(EncounterCount); // 1 - OZ, 2 - HOOD, 3 - RAJ, this never gets altered. - m_uiOperaEvent = urand(1, 3); - m_uiOzDeathCount = 0; + OperaEvent = urand(EVENT_OZ, EVENT_RAJ); + OzDeathCount = 0; OptionalBossCount = 0; } - uint32 m_auiEncounter[MAX_ENCOUNTER]; - std::string strSaveData; - - uint32 m_uiOperaEvent; - uint32 m_uiOzDeathCount; - uint32 OptionalBossCount; - - ObjectGuid m_uiCurtainGUID; - ObjectGuid m_uiStageDoorLeftGUID; - ObjectGuid m_uiStageDoorRightGUID; - ObjectGuid m_uiKilrekGUID; - ObjectGuid m_uiTerestianGUID; - ObjectGuid m_uiMoroesGUID; - ObjectGuid m_uiLibraryDoor; // Door at Shade of Aran - ObjectGuid m_uiMassiveDoor; // Door at Netherspite - ObjectGuid m_uiSideEntranceDoor; // Side Entrance - ObjectGuid m_uiGamesmansDoor; // Door before Chess - ObjectGuid m_uiGamesmansExitDoor; // Door after Chess - ObjectGuid m_uiNetherspaceDoor; // Door at Malchezaar - ObjectGuid MastersTerraceDoor[2]; - ObjectGuid ImageGUID; - ObjectGuid DustCoveredChest; - - bool IsEncounterInProgress() const override - { - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) - return true; - - return false; - } - void OnCreatureCreate(Creature* creature) override { switch (creature->GetEntry()) { - case 17229: m_uiKilrekGUID = creature->GetGUID(); break; - case 15688: m_uiTerestianGUID = creature->GetGUID(); break; - case 15687: m_uiMoroesGUID = creature->GetGUID(); break; + case NPC_KILREK: + KilrekGUID = creature->GetGUID(); + break; + case NPC_TERESTIAN_ILLHOOF: + TerestianGUID = creature->GetGUID(); + break; + case NPC_MOROES: + MoroesGUID = creature->GetGUID(); + break; } } @@ -132,130 +104,129 @@ public: case NPC_PHASE_HOUND: case NPC_DREADBEAST: case NPC_SHADOWBEAST: - SetData(TYPE_OPTIONAL_BOSS, NOT_STARTED); - break; - default: - break; - } - } - - void SetData(uint32 type, uint32 uiData) override - { - switch (type) - { - case TYPE_ATTUMEN: m_auiEncounter[0] = uiData; break; - case TYPE_MOROES: - if (m_auiEncounter[1] == DONE) - break; - m_auiEncounter[1] = uiData; - break; - case TYPE_MAIDEN: m_auiEncounter[2] = uiData; break; - case TYPE_OPTIONAL_BOSS: - m_auiEncounter[3] = uiData; - if (uiData == NOT_STARTED) + if (GetBossState(DATA_OPTIONAL_BOSS) == TO_BE_DECIDED) { ++OptionalBossCount; - if (OptionalBossCount == 50) + if (OptionalBossCount == OPTIONAL_BOSS_REQUIRED_DEATH_COUNT) { - switch (urand(0, 2)) + switch (urand(NPC_HYAKISS_THE_LURKER, NPC_ROKAD_THE_RAVAGER)) { - case 0: + case NPC_HYAKISS_THE_LURKER: instance->SummonCreature(NPC_HYAKISS_THE_LURKER, OptionalSpawn[0]); break; - case 1: - instance->SummonCreature(NPC_ROKAD_THE_RAVAGER, OptionalSpawn[1]); + case NPC_SHADIKITH_THE_GLIDER: + instance->SummonCreature(NPC_SHADIKITH_THE_GLIDER, OptionalSpawn[1]); break; - case 2: - instance->SummonCreature(NPC_SHADIKITH_THE_GLIDER, OptionalSpawn[2]); + case NPC_ROKAD_THE_RAVAGER: + instance->SummonCreature(NPC_ROKAD_THE_RAVAGER, OptionalSpawn[2]); break; } } } break; - case TYPE_OPERA: - m_auiEncounter[4] = uiData; - if (uiData == DONE) - UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, 16812, NULL); - break; - case TYPE_CURATOR: m_auiEncounter[5] = uiData; break; - case TYPE_ARAN: m_auiEncounter[6] = uiData; break; - case TYPE_TERESTIAN: m_auiEncounter[7] = uiData; break; - case TYPE_NETHERSPITE: m_auiEncounter[8] = uiData; break; - case TYPE_CHESS: - if (uiData == DONE) - DoRespawnGameObject(DustCoveredChest, DAY); - m_auiEncounter[9] = uiData; - break; - case TYPE_MALCHEZZAR: m_auiEncounter[10] = uiData; break; - case TYPE_NIGHTBANE: - if (m_auiEncounter[11] != DONE) - m_auiEncounter[11] = uiData; - break; - case DATA_OPERA_OZ_DEATHCOUNT: - if (uiData == SPECIAL) - ++m_uiOzDeathCount; - else if (uiData == IN_PROGRESS) - m_uiOzDeathCount = 0; + default: break; } + } - if (uiData == DONE) + void SetData(uint32 type, uint32 data) override + { + switch (type) { - OUT_SAVE_INST_DATA; - - std::ostringstream saveStream; - saveStream << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' ' << m_auiEncounter[2] << ' ' - << m_auiEncounter[3] << ' ' << m_auiEncounter[4] << ' ' << m_auiEncounter[5] << ' ' << m_auiEncounter[6] << ' ' - << m_auiEncounter[7] << ' ' << m_auiEncounter[8] << ' ' << m_auiEncounter[9] << ' ' << m_auiEncounter[10] << ' ' << m_auiEncounter[11]; + case DATA_OPERA_OZ_DEATHCOUNT: + if (data == SPECIAL) + ++OzDeathCount; + else if (data == IN_PROGRESS) + OzDeathCount = 0; + break; + } + } - strSaveData = saveStream.str(); + bool SetBossState(uint32 type, EncounterState state) override + { + if (!InstanceScript::SetBossState(type, state)) + return false; - SaveToDB(); - OUT_SAVE_INST_DATA_COMPLETE; + switch (type) + { + case DATA_OPERA_PERFORMANCE: + if (state == DONE) + { + HandleGameObject(StageDoorLeftGUID, true); + HandleGameObject(StageDoorRightGUID, true); + if (GameObject* sideEntrance = instance->GetGameObject(SideEntranceDoor)) + sideEntrance->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); + UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, 16812, NULL); + } + break; + case DATA_CHESS: + if (state == DONE) + DoRespawnGameObject(DustCoveredChest, DAY); + break; + default: + break; } + + return true; } - void SetGuidData(uint32 identifier, ObjectGuid data) override + void SetGuidData(uint32 type, ObjectGuid data) override { - switch (identifier) - { - case DATA_IMAGE_OF_MEDIVH: ImageGUID = data; - } + if (type == DATA_IMAGE_OF_MEDIVH) + ImageGUID = data; } void OnGameObjectCreate(GameObject* go) override { switch (go->GetEntry()) { - case 183932: m_uiCurtainGUID = go->GetGUID(); break; - case 184278: - m_uiStageDoorLeftGUID = go->GetGUID(); - if (m_auiEncounter[4] == DONE) + case GO_STAGE_CURTAIN: + CurtainGUID = go->GetGUID(); + break; + case GO_STAGE_DOOR_LEFT: + StageDoorLeftGUID = go->GetGUID(); + if (GetBossState(DATA_OPERA_PERFORMANCE) == DONE) go->SetGoState(GO_STATE_ACTIVE); break; - case 184279: - m_uiStageDoorRightGUID = go->GetGUID(); - if (m_auiEncounter[4] == DONE) + case GO_STAGE_DOOR_RIGHT: + StageDoorRightGUID = go->GetGUID(); + if (GetBossState(DATA_OPERA_PERFORMANCE) == DONE) go->SetGoState(GO_STATE_ACTIVE); break; - case 184517: m_uiLibraryDoor = go->GetGUID(); break; - case 185521: m_uiMassiveDoor = go->GetGUID(); break; - case 184276: m_uiGamesmansDoor = go->GetGUID(); break; - case 184277: m_uiGamesmansExitDoor = go->GetGUID(); break; - case 185134: m_uiNetherspaceDoor = go->GetGUID(); break; - case 184274: MastersTerraceDoor[0] = go->GetGUID(); break; - case 184280: MastersTerraceDoor[1] = go->GetGUID(); break; - case 184275: - m_uiSideEntranceDoor = go->GetGUID(); - if (m_auiEncounter[4] == DONE) + case GO_PRIVATE_LIBRARY_DOOR: + LibraryDoor = go->GetGUID(); + break; + case GO_MASSIVE_DOOR: + MassiveDoor = go->GetGUID(); + break; + case GO_GAMESMAN_HALL_DOOR: + GamesmansDoor = go->GetGUID(); + break; + case GO_GAMESMAN_HALL_EXIT_DOOR: + GamesmansExitDoor = go->GetGUID(); + break; + case GO_NETHERSPACE_DOOR: + NetherspaceDoor = go->GetGUID(); + break; + case GO_MASTERS_TERRACE_DOOR: + MastersTerraceDoor[0] = go->GetGUID(); + break; + case GO_MASTERS_TERRACE_DOOR2: + MastersTerraceDoor[1] = go->GetGUID(); + break; + case GO_SIDE_ENTRANCE_DOOR: + SideEntranceDoor = go->GetGUID(); + if (GetBossState(DATA_OPERA_PERFORMANCE) == DONE) go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); else go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); break; - case 185119: DustCoveredChest = go->GetGUID(); break; + case GO_DUST_COVERED_CHEST: + DustCoveredChest = go->GetGUID(); + break; } - switch (m_uiOperaEvent) + switch (OperaEvent) { /// @todo Set Object visibilities for Opera based on performance case EVENT_OZ: @@ -269,77 +240,77 @@ public: } } - std::string GetSaveData() override - { - return strSaveData; - } - - uint32 GetData(uint32 uiData) const override + uint32 GetData(uint32 type) const override { - switch (uiData) + switch (type) { - case TYPE_ATTUMEN: return m_auiEncounter[0]; - case TYPE_MOROES: return m_auiEncounter[1]; - case TYPE_MAIDEN: return m_auiEncounter[2]; - case TYPE_OPTIONAL_BOSS: return m_auiEncounter[3]; - case TYPE_OPERA: return m_auiEncounter[4]; - case TYPE_CURATOR: return m_auiEncounter[5]; - case TYPE_ARAN: return m_auiEncounter[6]; - case TYPE_TERESTIAN: return m_auiEncounter[7]; - case TYPE_NETHERSPITE: return m_auiEncounter[8]; - case TYPE_CHESS: return m_auiEncounter[9]; - case TYPE_MALCHEZZAR: return m_auiEncounter[10]; - case TYPE_NIGHTBANE: return m_auiEncounter[11]; - case DATA_OPERA_PERFORMANCE: return m_uiOperaEvent; - case DATA_OPERA_OZ_DEATHCOUNT: return m_uiOzDeathCount; + case DATA_OPERA_PERFORMANCE: + return OperaEvent; + case DATA_OPERA_OZ_DEATHCOUNT: + return OzDeathCount; } return 0; } - ObjectGuid GetGuidData(uint32 uiData) const override + ObjectGuid GetGuidData(uint32 type) const override { - switch (uiData) + switch (type) { - case DATA_KILREK: return m_uiKilrekGUID; - case DATA_TERESTIAN: return m_uiTerestianGUID; - case DATA_MOROES: return m_uiMoroesGUID; - case DATA_GO_STAGEDOORLEFT: return m_uiStageDoorLeftGUID; - case DATA_GO_STAGEDOORRIGHT: return m_uiStageDoorRightGUID; - case DATA_GO_CURTAINS: return m_uiCurtainGUID; - case DATA_GO_LIBRARY_DOOR: return m_uiLibraryDoor; - case DATA_GO_MASSIVE_DOOR: return m_uiMassiveDoor; - case DATA_GO_SIDE_ENTRANCE_DOOR: return m_uiSideEntranceDoor; - case DATA_GO_GAME_DOOR: return m_uiGamesmansDoor; - case DATA_GO_GAME_EXIT_DOOR: return m_uiGamesmansExitDoor; - case DATA_GO_NETHER_DOOR: return m_uiNetherspaceDoor; - case DATA_MASTERS_TERRACE_DOOR_1: return MastersTerraceDoor[0]; - case DATA_MASTERS_TERRACE_DOOR_2: return MastersTerraceDoor[1]; - case DATA_IMAGE_OF_MEDIVH: return ImageGUID; + case DATA_KILREK: + return KilrekGUID; + case DATA_TERESTIAN: + return TerestianGUID; + case DATA_MOROES: + return MoroesGUID; + case DATA_GO_STAGEDOORLEFT: + return StageDoorLeftGUID; + case DATA_GO_STAGEDOORRIGHT: + return StageDoorRightGUID; + case DATA_GO_CURTAINS: + return CurtainGUID; + case DATA_GO_LIBRARY_DOOR: + return LibraryDoor; + case DATA_GO_MASSIVE_DOOR: + return MassiveDoor; + case DATA_GO_SIDE_ENTRANCE_DOOR: + return SideEntranceDoor; + case DATA_GO_GAME_DOOR: + return GamesmansDoor; + case DATA_GO_GAME_EXIT_DOOR: + return GamesmansExitDoor; + case DATA_GO_NETHER_DOOR: + return NetherspaceDoor; + case DATA_MASTERS_TERRACE_DOOR_1: + return MastersTerraceDoor[0]; + case DATA_MASTERS_TERRACE_DOOR_2: + return MastersTerraceDoor[1]; + case DATA_IMAGE_OF_MEDIVH: + return ImageGUID; } return ObjectGuid::Empty; } - void Load(char const* chrIn) override - { - if (!chrIn) - { - OUT_LOAD_INST_DATA_FAIL; - return; - } - - OUT_LOAD_INST_DATA(chrIn); - std::istringstream loadStream(chrIn); - - loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2] >> m_auiEncounter[3] - >> m_auiEncounter[4] >> m_auiEncounter[5] >> m_auiEncounter[6] >> m_auiEncounter[7] - >> m_auiEncounter[8] >> m_auiEncounter[9] >> m_auiEncounter[10] >> m_auiEncounter[11]; - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) // Do not load an encounter as "In Progress" - reset it instead. - m_auiEncounter[i] = NOT_STARTED; - OUT_LOAD_INST_DATA_COMPLETE; - } + private: + uint32 OperaEvent; + uint32 OzDeathCount; + uint32 OptionalBossCount; + ObjectGuid CurtainGUID; + ObjectGuid StageDoorLeftGUID; + ObjectGuid StageDoorRightGUID; + ObjectGuid KilrekGUID; + ObjectGuid TerestianGUID; + ObjectGuid MoroesGUID; + ObjectGuid LibraryDoor; // Door at Shade of Aran + ObjectGuid MassiveDoor; // Door at Netherspite + ObjectGuid SideEntranceDoor; // Side Entrance + ObjectGuid GamesmansDoor; // Door before Chess + ObjectGuid GamesmansExitDoor; // Door after Chess + ObjectGuid NetherspaceDoor; // Door at Malchezaar + ObjectGuid MastersTerraceDoor[2]; + ObjectGuid ImageGUID; + ObjectGuid DustCoveredChest; }; }; diff --git a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp index aa2da8cc391..4aef3c8d4a3 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.cpp @@ -168,7 +168,7 @@ public: void StartEvent() { - instance->SetData(TYPE_OPERA, IN_PROGRESS); + instance->SetBossState(DATA_OPERA_PERFORMANCE, IN_PROGRESS); //resets count for this event, in case earlier failed if (m_uiEventId == EVENT_OZ) @@ -377,7 +377,7 @@ public: if (InstanceScript* instance = creature->GetInstanceScript()) { // Check for death of Moroes and if opera event is not done already - if (instance->GetData(TYPE_MOROES) == DONE && instance->GetData(TYPE_OPERA) != DONE) + if (instance->GetBossState(DATA_MOROES) == DONE && instance->GetBossState(DATA_OPERA_PERFORMANCE) != DONE) { player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, OZ_GOSSIP1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); diff --git a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.h b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.h index 4d86492257c..05de9e43a91 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/karazhan.h +++ b/src/server/scripts/EasternKingdoms/Karazhan/karazhan.h @@ -21,27 +21,26 @@ #define DataHeader "KZ" +uint32 const EncounterCount = 12; + enum DataTypes { - TYPE_ATTUMEN = 1, - TYPE_MOROES = 2, - TYPE_MAIDEN = 3, - TYPE_OPTIONAL_BOSS = 4, - TYPE_OPERA = 5, - TYPE_CURATOR = 6, - TYPE_ARAN = 7, - TYPE_TERESTIAN = 8, - TYPE_NETHERSPITE = 9, - TYPE_CHESS = 10, - TYPE_MALCHEZZAR = 11, - TYPE_NIGHTBANE = 12, + DATA_ATTUMEN = 0, + DATA_MOROES = 1, + DATA_MAIDEN_OF_VIRTUE = 2, + DATA_OPTIONAL_BOSS = 3, + DATA_OPERA_PERFORMANCE = 4, + DATA_CURATOR = 5, + DATA_ARAN = 6, + DATA_TERESTIAN = 7, + DATA_NETHERSPITE = 8, + DATA_CHESS = 9, + DATA_MALCHEZZAR = 10, + DATA_NIGHTBANE = 11, - DATA_OPERA_PERFORMANCE = 13, DATA_OPERA_OZ_DEATHCOUNT = 14, DATA_KILREK = 15, - DATA_TERESTIAN = 16, - DATA_MOROES = 17, DATA_GO_CURTAINS = 18, DATA_GO_STAGEDOORLEFT = 19, DATA_GO_STAGEDOORRIGHT = 20, @@ -69,6 +68,8 @@ enum MiscCreatures NPC_HYAKISS_THE_LURKER = 16179, NPC_ROKAD_THE_RAVAGER = 16181, NPC_SHADIKITH_THE_GLIDER = 16180, + NPC_TERESTIAN_ILLHOOF = 15688, + NPC_MOROES = 15687, // Trash NPC_COLDMIST_WIDOW = 16171, @@ -78,6 +79,29 @@ enum MiscCreatures NPC_GREATER_SHADOWBAT = 16174, NPC_PHASE_HOUND = 16178, NPC_DREADBEAST = 16177, - NPC_SHADOWBEAST = 16176 + NPC_SHADOWBEAST = 16176, + NPC_KILREK = 17229 +}; + +enum GameObjectIds +{ + GO_STAGE_CURTAIN = 183932, + GO_STAGE_DOOR_LEFT = 184278, + GO_STAGE_DOOR_RIGHT = 184279, + GO_PRIVATE_LIBRARY_DOOR = 184517, + GO_MASSIVE_DOOR = 185521, + GO_GAMESMAN_HALL_DOOR = 184276, + GO_GAMESMAN_HALL_EXIT_DOOR = 184277, + GO_NETHERSPACE_DOOR = 185134, + GO_MASTERS_TERRACE_DOOR = 184274, + GO_MASTERS_TERRACE_DOOR2 = 184280, + GO_SIDE_ENTRANCE_DOOR = 184275, + GO_DUST_COVERED_CHEST = 185119 }; + +enum Misc +{ + OPTIONAL_BOSS_REQUIRED_DEATH_COUNT = 50 +}; + #endif diff --git a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp index dff0a66cec0..74b300919d8 100644 --- a/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletMonastery/boss_headless_horseman.cpp @@ -134,8 +134,6 @@ static char const* Text[]= "Now, know demise!" }; -#define EMOTE_LAUGHS "Headless Horseman laughs" // needs assigned to db. - class npc_wisp_invis : public CreatureScript { public: @@ -347,7 +345,6 @@ public: Creature* speaker = DoSpawnCreature(HELPER, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 1000); if (speaker) speaker->CastSpell(speaker, SPELL_HEAD_SPEAKS, false); - me->TextEmote(EMOTE_LAUGHS); } else laugh -= diff; } @@ -724,7 +721,6 @@ public: if (laugh <= diff) { laugh = urand(11000, 22000); - me->TextEmote(EMOTE_LAUGHS); DoPlaySoundToSet(me, RandomLaugh[rand32() % 3]); } else laugh -= diff; diff --git a/src/server/scripts/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp b/src/server/scripts/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp index 118d28e2142..6a6a0b0994b 100644 --- a/src/server/scripts/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp +++ b/src/server/scripts/EasternKingdoms/SunkenTemple/instance_sunken_temple.cpp @@ -35,15 +35,25 @@ enum Gameobject GO_ATALAI_STATUE4 = 148833, GO_ATALAI_STATUE5 = 148834, GO_ATALAI_STATUE6 = 148835, - GO_ATALAI_IDOL = 148836, GO_ATALAI_LIGHT1 = 148883, GO_ATALAI_LIGHT2 = 148937 - }; enum CreatureIds { - NPC_MALFURION_STORMRAGE = 15362 + NPC_ATALALARION = 8580 +}; + +static Position const atalalarianPos = { -466.5134f, 95.19822f, -189.6463f, 0.03490658f }; +static uint8 const nStatues = 6; +static Position const statuePositions[nStatues] +{ + { -515.553f, 95.25821f, -173.707f, 0.0f }, + { -419.8487f, 94.48368f, -173.707f, 0.0f }, + { -491.4003f, 135.9698f, -173.707f, 0.0f }, + { -491.4909f, 53.48179f, -173.707f, 0.0f }, + { -443.8549f, 136.1007f, -173.707f, 0.0f }, + { -443.4171f, 53.83124f, -173.707f, 0.0f } }; class instance_sunken_temple : public InstanceMapScript @@ -77,7 +87,6 @@ public: ObjectGuid GOAtalaiStatue4; ObjectGuid GOAtalaiStatue5; ObjectGuid GOAtalaiStatue6; - ObjectGuid GOAtalaiIdol; uint32 State; @@ -98,7 +107,6 @@ public: case GO_ATALAI_STATUE4: GOAtalaiStatue4 = go->GetGUID(); break; case GO_ATALAI_STATUE5: GOAtalaiStatue5 = go->GetGUID(); break; case GO_ATALAI_STATUE6: GOAtalaiStatue6 = go->GetGUID(); break; - case GO_ATALAI_IDOL: GOAtalaiIdol = go->GetGUID(); break; } } @@ -155,7 +163,10 @@ public: if (s1 && s2 && s3 && s4 && s5 && !s6) { if (GameObject* pAtalaiStatue6 = instance->GetGameObject(GOAtalaiStatue6)) + { UseStatue(pAtalaiStatue6); + UseLastStatue(pAtalaiStatue6); + } s6 = true; State = 0; } @@ -169,18 +180,13 @@ public: go->SetUInt32Value(GAMEOBJECT_FLAGS, 4); } - /* - void UseLastStatue(GameObject* go) - { - AtalaiStatue1->SummonGameObject(GO_ATALAI_LIGHT2, AtalaiStatue1->GetPositionX(), AtalaiStatue1->GetPositionY(), AtalaiStatue1->GetPositionZ(), 0, 0, 0, 0, 0, 100); - AtalaiStatue2->SummonGameObject(GO_ATALAI_LIGHT2, AtalaiStatue2->GetPositionX(), AtalaiStatue2->GetPositionY(), AtalaiStatue2->GetPositionZ(), 0, 0, 0, 0, 0, 100); - AtalaiStatue3->SummonGameObject(GO_ATALAI_LIGHT2, AtalaiStatue3->GetPositionX(), AtalaiStatue3->GetPositionY(), AtalaiStatue3->GetPositionZ(), 0, 0, 0, 0, 0, 100); - AtalaiStatue4->SummonGameObject(GO_ATALAI_LIGHT2, AtalaiStatue4->GetPositionX(), AtalaiStatue4->GetPositionY(), AtalaiStatue4->GetPositionZ(), 0, 0, 0, 0, 0, 100); - AtalaiStatue5->SummonGameObject(GO_ATALAI_LIGHT2, AtalaiStatue5->GetPositionX(), AtalaiStatue5->GetPositionY(), AtalaiStatue5->GetPositionZ(), 0, 0, 0, 0, 0, 100); - AtalaiStatue6->SummonGameObject(GO_ATALAI_LIGHT2, AtalaiStatue6->GetPositionX(), AtalaiStatue6->GetPositionY(), AtalaiStatue6->GetPositionZ(), 0, 0, 0, 0, 0, 100); - go->SummonGameObject(148838, -488.997, 96.61, -189.019, -1.52, 0, 0, 0, 0, 100); - } - */ + void UseLastStatue(GameObject* go) + { + for (uint8 i = 0; i < nStatues; ++i) + go->SummonGameObject(GO_ATALAI_LIGHT2, statuePositions[i].GetPositionX(), statuePositions[i].GetPositionY(), statuePositions[i].GetPositionZ(), statuePositions[i].GetOrientation(), 0, 0, 0, 0, 0); + + go->SummonCreature(NPC_ATALALARION, atalalarianPos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 7200); + } void SetData(uint32 type, uint32 data) override { diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp index cc55f758a22..5ec57fc44b6 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp @@ -29,109 +29,104 @@ EndScriptData */ #include "SpellAuraEffects.h" #include "zulaman.h" -#define YELL_AGGRO "Da shadow gonna fall on you... " -#define SOUND_YELL_AGGRO 12041 -#define YELL_SPIRIT_BOLTS "Your soul gonna bleed!" -#define SOUND_YELL_SPIRIT_BOLTS 12047 -#define YELL_DRAIN_POWER "Darkness comin\' for you" -#define SOUND_YELL_DRAIN_POWER 12046 -#define YELL_KILL_ONE "Dis a nightmare ya don\' wake up from!" -#define SOUND_YELL_KILL_ONE 12043 -#define YELL_KILL_TWO "Azzaga choogo zinn!" -#define SOUND_YELL_KILL_TWO 12044 -#define YELL_DEATH "Dis not... da end of me..." -#define SOUND_YELL_DEATH 12051 - +enum Yells +{ + YELL_AGGRO = 0, + YELL_KILL_ONE = 1, + YELL_KILL_TWO = 2, + YELL_DRAIN_POWER = 3, + YELL_SPIRIT_BOLTS = 4, + YELL_DEATH = 5 +}; enum Creatures { - NPC_TEMP_TRIGGER = 23920 + NPC_TEMP_TRIGGER = 23920 }; enum Spells { - SPELL_SPIRIT_BOLTS = 43383, - SPELL_DRAIN_POWER = 44131, - SPELL_SIPHON_SOUL = 43501, + SPELL_SPIRIT_BOLTS = 43383, + SPELL_DRAIN_POWER = 44131, + SPELL_SIPHON_SOUL = 43501, // Druid - SPELL_DR_THORNS = 43420, - SPELL_DR_LIFEBLOOM = 43421, - SPELL_DR_MOONFIRE = 43545, + SPELL_DR_THORNS = 43420, + SPELL_DR_LIFEBLOOM = 43421, + SPELL_DR_MOONFIRE = 43545, // Hunter - SPELL_HU_EXPLOSIVE_TRAP = 43444, - SPELL_HU_FREEZING_TRAP = 43447, - SPELL_HU_SNAKE_TRAP = 43449, + SPELL_HU_EXPLOSIVE_TRAP = 43444, + SPELL_HU_FREEZING_TRAP = 43447, + SPELL_HU_SNAKE_TRAP = 43449, // Mage - SPELL_MG_FIREBALL = 41383, - SPELL_MG_FROST_NOVA = 43426, - SPELL_MG_ICE_LANCE = 43427, - SPELL_MG_FROSTBOLT = 43428, + SPELL_MG_FIREBALL = 41383, + SPELL_MG_FROST_NOVA = 43426, + SPELL_MG_ICE_LANCE = 43427, + SPELL_MG_FROSTBOLT = 43428, // Paladin - SPELL_PA_CONSECRATION = 43429, - SPELL_PA_AVENGING_WRATH = 43430, - SPELL_PA_HOLY_LIGHT = 43451, + SPELL_PA_CONSECRATION = 43429, + SPELL_PA_AVENGING_WRATH = 43430, + SPELL_PA_HOLY_LIGHT = 43451, // Priest - SPELL_PR_HEAL = 41372, - SPELL_PR_MIND_BLAST = 41374, - SPELL_PR_SW_DEATH = 41375, - SPELL_PR_PSYCHIC_SCREAM = 43432, - SPELL_PR_MIND_CONTROL = 43550, - SPELL_PR_PAIN_SUPP = 44416, + SPELL_PR_HEAL = 41372, + SPELL_PR_MIND_BLAST = 41374, + SPELL_PR_SW_DEATH = 41375, + SPELL_PR_PSYCHIC_SCREAM = 43432, + SPELL_PR_MIND_CONTROL = 43550, + SPELL_PR_PAIN_SUPP = 44416, // Rogue - SPELL_RO_BLIND = 43433, - SPELL_RO_SLICE_DICE = 43457, - SPELL_RO_WOUND_POISON = 43461, + SPELL_RO_BLIND = 43433, + SPELL_RO_SLICE_DICE = 43457, + SPELL_RO_WOUND_POISON = 43461, // Shaman - SPELL_SH_CHAIN_LIGHT = 43435, - SPELL_SH_FIRE_NOVA = 43436, - SPELL_SH_HEALING_WAVE = 43548, + SPELL_SH_CHAIN_LIGHT = 43435, + SPELL_SH_FIRE_NOVA = 43436, + SPELL_SH_HEALING_WAVE = 43548, // Warlock - SPELL_WL_CURSE_OF_DOOM = 43439, - SPELL_WL_RAIN_OF_FIRE = 43440, - SPELL_WL_UNSTABLE_AFFL = 43522, - SPELL_WL_UNSTABLE_AFFL_DISPEL = 43523, + SPELL_WL_CURSE_OF_DOOM = 43439, + SPELL_WL_RAIN_OF_FIRE = 43440, + SPELL_WL_UNSTABLE_AFFL = 43522, + SPELL_WL_UNSTABLE_AFFL_DISPEL = 43523, // Warrior - SPELL_WR_MORTAL_STRIKE = 43441, - SPELL_WR_WHIRLWIND = 43442, - SPELL_WR_SPELL_REFLECT = 43443, + SPELL_WR_MORTAL_STRIKE = 43441, + SPELL_WR_WHIRLWIND = 43442, + SPELL_WR_SPELL_REFLECT = 43443, // Thurg - SPELL_BLOODLUST = 43578, - SPELL_CLEAVE = 15496, + SPELL_BLOODLUST = 43578, + SPELL_CLEAVE = 15496, // Gazakroth - SPELL_FIREBOLT = 43584, + SPELL_FIREBOLT = 43584, // Alyson Antille - SPELL_FLASH_HEAL = 43575, - SPELL_DISPEL_MAGIC = 43577, + SPELL_FLASH_HEAL = 43575, + SPELL_DISPEL_MAGIC = 43577, // Lord Raadan - SPELL_FLAME_BREATH = 43582, - SPELL_THUNDERCLAP = 43583, + SPELL_FLAME_BREATH = 43582, + SPELL_THUNDERCLAP = 43583, // Darkheart - SPELL_PSYCHIC_WAIL = 43590, + SPELL_PSYCHIC_WAIL = 43590, // Slither - SPELL_VENOM_SPIT = 43579, + SPELL_VENOM_SPIT = 43579, // Fenstalker - SPELL_VOLATILE_INFECTION = 43586, + SPELL_VOLATILE_INFECTION = 43586, // Koragg - SPELL_COLD_STARE = 43593, - SPELL_MIGHTY_BLOW = 43592 - + SPELL_COLD_STARE = 43593, + SPELL_MIGHTY_BLOW = 43592 }; #define ORIENT 1.5696f @@ -306,8 +301,7 @@ class boss_hexlord_malacrass : public CreatureScript instance->SetData(DATA_HEXLORDEVENT, IN_PROGRESS); DoZoneInCombat(); - me->Yell(YELL_AGGRO, LANG_UNIVERSAL); - DoPlaySoundToSet(me, SOUND_YELL_AGGRO); + Talk(YELL_AGGRO); for (uint8 i = 0; i < 4; ++i) { @@ -327,12 +321,10 @@ class boss_hexlord_malacrass : public CreatureScript switch (urand(0, 1)) { case 0: - me->Yell(YELL_KILL_ONE, LANG_UNIVERSAL); - DoPlaySoundToSet(me, SOUND_YELL_KILL_ONE); + Talk(YELL_KILL_ONE); break; case 1: - me->Yell(YELL_KILL_TWO, LANG_UNIVERSAL); - DoPlaySoundToSet(me, SOUND_YELL_KILL_TWO); + Talk(YELL_KILL_TWO); break; } } @@ -341,8 +333,7 @@ class boss_hexlord_malacrass : public CreatureScript { instance->SetData(DATA_HEXLORDEVENT, DONE); - me->Yell(YELL_DEATH, LANG_UNIVERSAL); - DoPlaySoundToSet(me, SOUND_YELL_DEATH); + Talk(YELL_DEATH); for (uint8 i = 0; i < 4; ++i) { @@ -415,8 +406,7 @@ class boss_hexlord_malacrass : public CreatureScript if (DrainPower_Timer <= diff) { DoCast(me, SPELL_DRAIN_POWER, true); - me->Yell(YELL_DRAIN_POWER, LANG_UNIVERSAL); - DoPlaySoundToSet(me, SOUND_YELL_DRAIN_POWER); + Talk(YELL_DRAIN_POWER); DrainPower_Timer = urand(40000, 55000); // must cast in 60 sec, or buff/debuff will disappear } else DrainPower_Timer -= diff; @@ -427,8 +417,7 @@ class boss_hexlord_malacrass : public CreatureScript else { DoCast(me, SPELL_SPIRIT_BOLTS, false); - me->Yell(YELL_SPIRIT_BOLTS, LANG_UNIVERSAL); - DoPlaySoundToSet(me, SOUND_YELL_SPIRIT_BOLTS); + Talk(YELL_SPIRIT_BOLTS); SpiritBolts_Timer = 40000; SiphonSoul_Timer = 10000; // ready to drain PlayerAbility_Timer = 99999; diff --git a/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp b/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp index 37505a8b74d..0407cb6cd7c 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp @@ -30,21 +30,41 @@ EndScriptData */ #include "GridNotifiersImpl.h" #include "CellImpl.h" -enum Spells +enum Yells { - SPELL_BERSERK = 45078, + YELL_NALORAKK_WAVE1 = 0, + YELL_NALORAKK_WAVE2 = 1, + YELL_NALORAKK_WAVE3 = 2, + YELL_NALORAKK_WAVE4 = 3, + YELL_AGGRO = 4, + YELL_SURGE = 5, + YELL_SHIFTEDTOBEAR = 6, + YELL_SHIFTEDTOTROLL = 7, + YELL_BERSERK = 8, + YELL_KILL_ONE = 9, + YELL_KILL_TWO = 10, + YELL_DEATH = 11 + +// Not yet implemented +// YELL_NALORAKK_EVENT1 = 12, +// YELL_NALORAKK_EVENT2 = 13 +}; +enum Spells +{ // Troll form - SPELL_BRUTALSWIPE = 42384, - SPELL_MANGLE = 42389, - SPELL_MANGLEEFFECT = 44955, - SPELL_SURGE = 42402, - SPELL_BEARFORM = 42377, + SPELL_BRUTALSWIPE = 42384, + SPELL_MANGLE = 42389, + SPELL_MANGLEEFFECT = 44955, + SPELL_SURGE = 42402, + SPELL_BEARFORM = 42377, // Bear form - SPELL_LACERATINGSLASH = 42395, - SPELL_RENDFLESH = 42397, - SPELL_DEAFENINGROAR = 42398 + SPELL_LACERATINGSLASH = 42395, + SPELL_RENDFLESH = 42397, + SPELL_DEAFENINGROAR = 42398, + + SPELL_BERSERK = 45078 }; // Trash Waves @@ -57,45 +77,9 @@ float NalorakkWay[8][3] = {-79.929f, 1395.958f, 27.31f}, {-80.072f, 1374.555f, 40.87f}, // waypoint 3 {-80.072f, 1314.398f, 40.87f}, - {-80.072f, 1295.775f, 48.60f} // waypoint 4 + {-80.072f, 1295.775f, 48.60f} // waypoint 4 }; -#define YELL_NALORAKK_WAVE1 "Get da move on, guards! It be killin' time!" -#define SOUND_NALORAKK_WAVE1 12066 -#define YELL_NALORAKK_WAVE2 "Guards, go already! Who you more afraid of, dem... or me?" -#define SOUND_NALORAKK_WAVE2 12067 -#define YELL_NALORAKK_WAVE3 "Ride now! Ride out dere and bring me back some heads!" -#define SOUND_NALORAKK_WAVE3 12068 -#define YELL_NALORAKK_WAVE4 "I be losin' me patience! Go on: make dem wish dey was never born!" -#define SOUND_NALORAKK_WAVE4 12069 - -//Unimplemented SoundIDs -/* -#define SOUND_NALORAKK_EVENT1 12078 -#define SOUND_NALORAKK_EVENT2 12079 -*/ - -//General defines -#define YELL_AGGRO "You be dead soon enough!" -#define SOUND_YELL_AGGRO 12070 -#define YELL_KILL_ONE "Mua-ha-ha! Now whatchoo got to say?" -#define SOUND_YELL_KILL_ONE 12075 -#define YELL_KILL_TWO "Da Amani gonna rule again!" -#define SOUND_YELL_KILL_TWO 12076 -#define YELL_DEATH "I... be waitin' on da udda side...." -#define SOUND_YELL_DEATH 12077 -#define YELL_BERSERK "You had your chance, now it be too late!" //Never seen this being used, so just guessing from what I hear. -#define SOUND_YELL_BERSERK 12074 -#define YELL_SURGE "I bring da pain!" -#define SOUND_YELL_SURGE 12071 - -#define YELL_SHIFTEDTOTROLL "Make way for Nalorakk!" -#define SOUND_YELL_TOTROLL 12073 - - -#define YELL_SHIFTEDTOBEAR "You call on da beast, you gonna get more dan you bargain for!" -#define SOUND_YELL_TOBEAR 12072 - class boss_nalorakk : public CreatureScript { public: @@ -227,8 +211,7 @@ class boss_nalorakk : public CreatureScript case 0: if (me->IsWithinDistInMap(who, 50)) { - me->Yell(YELL_NALORAKK_WAVE1, LANG_UNIVERSAL); - DoPlaySoundToSet(me, SOUND_NALORAKK_WAVE1); + Talk(YELL_NALORAKK_WAVE1); (*me).GetMotionMaster()->MovePoint(1, NalorakkWay[1][0], NalorakkWay[1][1], NalorakkWay[1][2]); MovePhase ++; @@ -240,8 +223,7 @@ class boss_nalorakk : public CreatureScript case 2: if (me->IsWithinDistInMap(who, 40)) { - me->Yell(YELL_NALORAKK_WAVE2, LANG_UNIVERSAL); - DoPlaySoundToSet(me, SOUND_NALORAKK_WAVE2); + Talk(YELL_NALORAKK_WAVE2); (*me).GetMotionMaster()->MovePoint(3, NalorakkWay[3][0], NalorakkWay[3][1], NalorakkWay[3][2]); MovePhase ++; @@ -253,8 +235,7 @@ class boss_nalorakk : public CreatureScript case 5: if (me->IsWithinDistInMap(who, 40)) { - me->Yell(YELL_NALORAKK_WAVE3, LANG_UNIVERSAL); - DoPlaySoundToSet(me, SOUND_NALORAKK_WAVE3); + Talk(YELL_NALORAKK_WAVE3); (*me).GetMotionMaster()->MovePoint(6, NalorakkWay[6][0], NalorakkWay[6][1], NalorakkWay[6][2]); MovePhase ++; @@ -268,8 +249,7 @@ class boss_nalorakk : public CreatureScript { SendAttacker(who); - me->Yell(YELL_NALORAKK_WAVE4, LANG_UNIVERSAL); - DoPlaySoundToSet(me, SOUND_NALORAKK_WAVE4); + Talk(YELL_NALORAKK_WAVE4); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); @@ -287,8 +267,7 @@ class boss_nalorakk : public CreatureScript { instance->SetData(DATA_NALORAKKEVENT, IN_PROGRESS); - me->Yell(YELL_AGGRO, LANG_UNIVERSAL); - DoPlaySoundToSet(me, SOUND_YELL_AGGRO); + Talk(YELL_AGGRO); DoZoneInCombat(); } @@ -296,8 +275,7 @@ class boss_nalorakk : public CreatureScript { instance->SetData(DATA_NALORAKKEVENT, DONE); - me->Yell(YELL_DEATH, LANG_UNIVERSAL); - DoPlaySoundToSet(me, SOUND_YELL_DEATH); + Talk(YELL_DEATH); } void KilledUnit(Unit* /*victim*/) override @@ -305,12 +283,10 @@ class boss_nalorakk : public CreatureScript switch (urand(0, 1)) { case 0: - me->Yell(YELL_KILL_ONE, LANG_UNIVERSAL); - DoPlaySoundToSet(me, SOUND_YELL_KILL_ONE); + Talk(YELL_KILL_ONE); break; case 1: - me->Yell(YELL_KILL_TWO, LANG_UNIVERSAL); - DoPlaySoundToSet(me, SOUND_YELL_KILL_TWO); + Talk(YELL_KILL_TWO); break; } } @@ -373,8 +349,7 @@ class boss_nalorakk : public CreatureScript if (Berserk_Timer <= diff) { DoCast(me, SPELL_BERSERK, true); - me->Yell(YELL_BERSERK, LANG_UNIVERSAL); - DoPlaySoundToSet(me, SOUND_YELL_BERSERK); + Talk(YELL_BERSERK); Berserk_Timer = 600000; } else Berserk_Timer -= diff; @@ -383,8 +358,7 @@ class boss_nalorakk : public CreatureScript if (inBearForm) { // me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, 5122); - me->Yell(YELL_SHIFTEDTOTROLL, LANG_UNIVERSAL); - DoPlaySoundToSet(me, SOUND_YELL_TOTROLL); + Talk(YELL_SHIFTEDTOTROLL); me->RemoveAurasDueToSpell(SPELL_BEARFORM); Surge_Timer = urand(15000, 20000); BrutalSwipe_Timer = urand(7000, 12000); @@ -395,8 +369,7 @@ class boss_nalorakk : public CreatureScript else { // me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, 0); - me->Yell(YELL_SHIFTEDTOBEAR, LANG_UNIVERSAL); - DoPlaySoundToSet(me, SOUND_YELL_TOBEAR); + Talk(YELL_SHIFTEDTOBEAR); DoCast(me, SPELL_BEARFORM, true); LaceratingSlash_Timer = 2000; // dur 18s RendFlesh_Timer = 3000; // dur 5s @@ -426,8 +399,7 @@ class boss_nalorakk : public CreatureScript if (Surge_Timer <= diff) { - me->Yell(YELL_SURGE, LANG_UNIVERSAL); - DoPlaySoundToSet(me, SOUND_YELL_SURGE); + Talk(YELL_SURGE); Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 45, true); if (target) DoCast(target, SPELL_SURGE); diff --git a/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp b/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp new file mode 100644 index 00000000000..8c781bb9001 --- /dev/null +++ b/src/server/scripts/EasternKingdoms/eastern_kingdoms_script_loader.cpp @@ -0,0 +1,372 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +// This is where scripts' loading functions should be declared: +void AddSC_alterac_valley(); //Alterac Valley +void AddSC_boss_balinda(); +void AddSC_boss_drekthar(); +void AddSC_boss_galvangar(); +void AddSC_boss_vanndar(); +void AddSC_blackrock_depths(); //Blackrock Depths +void AddSC_boss_ambassador_flamelash(); +void AddSC_boss_draganthaurissan(); +void AddSC_boss_general_angerforge(); +void AddSC_boss_high_interrogator_gerstahn(); +void AddSC_boss_magmus(); +void AddSC_boss_moira_bronzebeard(); +void AddSC_boss_tomb_of_seven(); +void AddSC_instance_blackrock_depths(); +void AddSC_boss_drakkisath(); //Blackrock Spire +void AddSC_boss_halycon(); +void AddSC_boss_highlordomokk(); +void AddSC_boss_mothersmolderweb(); +void AddSC_boss_overlordwyrmthalak(); +void AddSC_boss_shadowvosh(); +void AddSC_boss_thebeast(); +void AddSC_boss_warmastervoone(); +void AddSC_boss_quatermasterzigris(); +void AddSC_boss_pyroguard_emberseer(); +void AddSC_boss_gyth(); +void AddSC_boss_rend_blackhand(); +void AddSC_boss_gizrul_the_slavener(); +void AddSC_boss_urok_doomhowl(); +void AddSC_boss_lord_valthalak(); +void AddSC_instance_blackrock_spire(); +void AddSC_boss_razorgore(); //Blackwing lair +void AddSC_boss_vaelastrasz(); +void AddSC_boss_broodlord(); +void AddSC_boss_firemaw(); +void AddSC_boss_ebonroc(); +void AddSC_boss_flamegor(); +void AddSC_boss_chromaggus(); +void AddSC_boss_nefarian(); +void AddSC_instance_blackwing_lair(); +void AddSC_deadmines(); //Deadmines +void AddSC_instance_deadmines(); +void AddSC_boss_mr_smite(); +void AddSC_gnomeregan(); //Gnomeregan +void AddSC_instance_gnomeregan(); +void AddSC_boss_attumen(); //Karazhan +void AddSC_boss_curator(); +void AddSC_boss_maiden_of_virtue(); +void AddSC_boss_shade_of_aran(); +void AddSC_boss_malchezaar(); +void AddSC_boss_terestian_illhoof(); +void AddSC_boss_moroes(); +void AddSC_bosses_opera(); +void AddSC_boss_netherspite(); +void AddSC_instance_karazhan(); +void AddSC_karazhan(); +void AddSC_boss_nightbane(); +void AddSC_boss_felblood_kaelthas(); // Magister's Terrace +void AddSC_boss_selin_fireheart(); +void AddSC_boss_vexallus(); +void AddSC_boss_priestess_delrissa(); +void AddSC_instance_magisters_terrace(); +void AddSC_magisters_terrace(); +void AddSC_boss_lucifron(); //Molten core +void AddSC_boss_magmadar(); +void AddSC_boss_gehennas(); +void AddSC_boss_garr(); +void AddSC_boss_baron_geddon(); +void AddSC_boss_shazzrah(); +void AddSC_boss_golemagg(); +void AddSC_boss_sulfuron(); +void AddSC_boss_majordomo(); +void AddSC_boss_ragnaros(); +void AddSC_instance_molten_core(); +void AddSC_instance_ragefire_chasm(); //Ragefire Chasm +void AddSC_the_scarlet_enclave(); //Scarlet Enclave +void AddSC_the_scarlet_enclave_c1(); +void AddSC_the_scarlet_enclave_c2(); +void AddSC_the_scarlet_enclave_c5(); +void AddSC_boss_arcanist_doan(); //Scarlet Monastery +void AddSC_boss_azshir_the_sleepless(); +void AddSC_boss_bloodmage_thalnos(); +void AddSC_boss_headless_horseman(); +void AddSC_boss_herod(); +void AddSC_boss_high_inquisitor_fairbanks(); +void AddSC_boss_houndmaster_loksey(); +void AddSC_boss_interrogator_vishas(); +void AddSC_boss_scorn(); +void AddSC_instance_scarlet_monastery(); +void AddSC_boss_mograine_and_whitemane(); +void AddSC_boss_darkmaster_gandling(); //Scholomance +void AddSC_boss_death_knight_darkreaver(); +void AddSC_boss_theolenkrastinov(); +void AddSC_boss_illuciabarov(); +void AddSC_boss_instructormalicia(); +void AddSC_boss_jandicebarov(); +void AddSC_boss_kormok(); +void AddSC_boss_lordalexeibarov(); +void AddSC_boss_lorekeeperpolkelt(); +void AddSC_boss_rasfrost(); +void AddSC_boss_theravenian(); +void AddSC_boss_vectus(); +void AddSC_boss_kirtonos_the_herald(); +void AddSC_instance_scholomance(); +void AddSC_shadowfang_keep(); //Shadowfang keep +void AddSC_instance_shadowfang_keep(); +void AddSC_boss_magistrate_barthilas(); //Stratholme +void AddSC_boss_maleki_the_pallid(); +void AddSC_boss_nerubenkan(); +void AddSC_boss_cannon_master_willey(); +void AddSC_boss_baroness_anastari(); +void AddSC_boss_ramstein_the_gorger(); +void AddSC_boss_timmy_the_cruel(); +void AddSC_boss_postmaster_malown(); +void AddSC_boss_baron_rivendare(); +void AddSC_boss_dathrohan_balnazzar(); +void AddSC_boss_order_of_silver_hand(); +void AddSC_instance_stratholme(); +void AddSC_stratholme(); +void AddSC_sunken_temple(); // Sunken Temple +void AddSC_instance_sunken_temple(); +void AddSC_instance_sunwell_plateau(); //Sunwell Plateau +void AddSC_boss_kalecgos(); +void AddSC_boss_brutallus(); +void AddSC_boss_felmyst(); +void AddSC_boss_eredar_twins(); +void AddSC_boss_muru(); +void AddSC_boss_kiljaeden(); +void AddSC_sunwell_plateau(); +void AddSC_boss_archaedas(); //Uldaman +void AddSC_boss_ironaya(); +void AddSC_uldaman(); +void AddSC_instance_uldaman(); +void AddSC_instance_the_stockade(); //The Stockade +void AddSC_boss_akilzon(); //Zul'Aman +void AddSC_boss_halazzi(); +void AddSC_boss_hex_lord_malacrass(); +void AddSC_boss_janalai(); +void AddSC_boss_nalorakk(); +void AddSC_boss_zuljin(); +void AddSC_instance_zulaman(); +void AddSC_zulaman(); +void AddSC_boss_jeklik(); //Zul'Gurub +void AddSC_boss_venoxis(); +void AddSC_boss_marli(); +void AddSC_boss_mandokir(); +void AddSC_boss_gahzranka(); +void AddSC_boss_thekal(); +void AddSC_boss_arlokk(); +void AddSC_boss_jindo(); +void AddSC_boss_hakkar(); +void AddSC_boss_grilek(); +void AddSC_boss_hazzarah(); +void AddSC_boss_renataki(); +void AddSC_boss_wushoolay(); +void AddSC_instance_zulgurub(); +//void AddSC_alterac_mountains(); +void AddSC_arathi_highlands(); +void AddSC_blasted_lands(); +void AddSC_burning_steppes(); +void AddSC_duskwood(); +void AddSC_eastern_plaguelands(); +void AddSC_ghostlands(); +void AddSC_hinterlands(); +void AddSC_isle_of_queldanas(); +void AddSC_loch_modan(); +void AddSC_redridge_mountains(); +void AddSC_silverpine_forest(); +void AddSC_stormwind_city(); +void AddSC_stranglethorn_vale(); +void AddSC_swamp_of_sorrows(); +void AddSC_tirisfal_glades(); +void AddSC_undercity(); +void AddSC_western_plaguelands(); +void AddSC_wetlands(); + +// The name of this function should match: +// void Add${NameOfDirectory}Scripts() +void AddEasternKingdomsScripts() +{ + AddSC_alterac_valley(); //Alterac Valley + AddSC_boss_balinda(); + AddSC_boss_drekthar(); + AddSC_boss_galvangar(); + AddSC_boss_vanndar(); + AddSC_blackrock_depths(); //Blackrock Depths + AddSC_boss_ambassador_flamelash(); + AddSC_boss_draganthaurissan(); + AddSC_boss_general_angerforge(); + AddSC_boss_high_interrogator_gerstahn(); + AddSC_boss_magmus(); + AddSC_boss_moira_bronzebeard(); + AddSC_boss_tomb_of_seven(); + AddSC_instance_blackrock_depths(); + AddSC_boss_drakkisath(); //Blackrock Spire + AddSC_boss_halycon(); + AddSC_boss_highlordomokk(); + AddSC_boss_mothersmolderweb(); + AddSC_boss_overlordwyrmthalak(); + AddSC_boss_shadowvosh(); + AddSC_boss_thebeast(); + AddSC_boss_warmastervoone(); + AddSC_boss_quatermasterzigris(); + AddSC_boss_pyroguard_emberseer(); + AddSC_boss_gyth(); + AddSC_boss_rend_blackhand(); + AddSC_boss_gizrul_the_slavener(); + AddSC_boss_urok_doomhowl(); + AddSC_boss_lord_valthalak(); + AddSC_instance_blackrock_spire(); + AddSC_boss_razorgore(); //Blackwing lair + AddSC_boss_vaelastrasz(); + AddSC_boss_broodlord(); + AddSC_boss_firemaw(); + AddSC_boss_ebonroc(); + AddSC_boss_flamegor(); + AddSC_boss_chromaggus(); + AddSC_boss_nefarian(); + AddSC_instance_blackwing_lair(); + AddSC_deadmines(); //Deadmines + AddSC_boss_mr_smite(); + AddSC_instance_deadmines(); + AddSC_gnomeregan(); //Gnomeregan + AddSC_instance_gnomeregan(); + AddSC_boss_attumen(); //Karazhan + AddSC_boss_curator(); + AddSC_boss_maiden_of_virtue(); + AddSC_boss_shade_of_aran(); + AddSC_boss_malchezaar(); + AddSC_boss_terestian_illhoof(); + AddSC_boss_moroes(); + AddSC_bosses_opera(); + AddSC_boss_netherspite(); + AddSC_instance_karazhan(); + AddSC_karazhan(); + AddSC_boss_nightbane(); + AddSC_boss_felblood_kaelthas(); // Magister's Terrace + AddSC_boss_selin_fireheart(); + AddSC_boss_vexallus(); + AddSC_boss_priestess_delrissa(); + AddSC_instance_magisters_terrace(); + AddSC_magisters_terrace(); + AddSC_boss_lucifron(); //Molten core + AddSC_boss_magmadar(); + AddSC_boss_gehennas(); + AddSC_boss_garr(); + AddSC_boss_baron_geddon(); + AddSC_boss_shazzrah(); + AddSC_boss_golemagg(); + AddSC_boss_sulfuron(); + AddSC_boss_majordomo(); + AddSC_boss_ragnaros(); + AddSC_instance_molten_core(); + AddSC_instance_ragefire_chasm(); //Ragefire Chasm + AddSC_the_scarlet_enclave(); //Scarlet Enclave + AddSC_the_scarlet_enclave_c1(); + AddSC_the_scarlet_enclave_c2(); + AddSC_the_scarlet_enclave_c5(); + AddSC_boss_arcanist_doan(); //Scarlet Monastery + AddSC_boss_azshir_the_sleepless(); + AddSC_boss_bloodmage_thalnos(); + AddSC_boss_headless_horseman(); + AddSC_boss_herod(); + AddSC_boss_high_inquisitor_fairbanks(); + AddSC_boss_houndmaster_loksey(); + AddSC_boss_interrogator_vishas(); + AddSC_boss_scorn(); + AddSC_instance_scarlet_monastery(); + AddSC_boss_mograine_and_whitemane(); + AddSC_boss_darkmaster_gandling(); //Scholomance + AddSC_boss_death_knight_darkreaver(); + AddSC_boss_theolenkrastinov(); + AddSC_boss_illuciabarov(); + AddSC_boss_instructormalicia(); + AddSC_boss_jandicebarov(); + AddSC_boss_kormok(); + AddSC_boss_lordalexeibarov(); + AddSC_boss_lorekeeperpolkelt(); + AddSC_boss_rasfrost(); + AddSC_boss_theravenian(); + AddSC_boss_vectus(); + AddSC_boss_kirtonos_the_herald(); + AddSC_instance_scholomance(); + AddSC_shadowfang_keep(); //Shadowfang keep + AddSC_instance_shadowfang_keep(); + AddSC_boss_magistrate_barthilas(); //Stratholme + AddSC_boss_maleki_the_pallid(); + AddSC_boss_nerubenkan(); + AddSC_boss_cannon_master_willey(); + AddSC_boss_baroness_anastari(); + AddSC_boss_ramstein_the_gorger(); + AddSC_boss_timmy_the_cruel(); + AddSC_boss_postmaster_malown(); + AddSC_boss_baron_rivendare(); + AddSC_boss_dathrohan_balnazzar(); + AddSC_boss_order_of_silver_hand(); + AddSC_instance_stratholme(); + AddSC_stratholme(); + AddSC_sunken_temple(); // Sunken Temple + AddSC_instance_sunken_temple(); + AddSC_instance_sunwell_plateau(); //Sunwell Plateau + AddSC_boss_kalecgos(); + AddSC_boss_brutallus(); + AddSC_boss_felmyst(); + AddSC_boss_eredar_twins(); + AddSC_boss_muru(); + AddSC_boss_kiljaeden(); + AddSC_sunwell_plateau(); + AddSC_instance_the_stockade(); //The Stockade + AddSC_boss_archaedas(); //Uldaman + AddSC_boss_ironaya(); + AddSC_uldaman(); + AddSC_instance_uldaman(); + AddSC_boss_akilzon(); //Zul'Aman + AddSC_boss_halazzi(); + AddSC_boss_hex_lord_malacrass(); + AddSC_boss_janalai(); + AddSC_boss_nalorakk(); + AddSC_boss_zuljin(); + AddSC_instance_zulaman(); + AddSC_zulaman(); + AddSC_boss_jeklik(); //Zul'Gurub + AddSC_boss_venoxis(); + AddSC_boss_marli(); + AddSC_boss_mandokir(); + AddSC_boss_gahzranka(); + AddSC_boss_thekal(); + AddSC_boss_arlokk(); + AddSC_boss_jindo(); + AddSC_boss_hakkar(); + AddSC_boss_grilek(); + AddSC_boss_hazzarah(); + AddSC_boss_renataki(); + AddSC_boss_wushoolay(); + AddSC_instance_zulgurub(); + //AddSC_alterac_mountains(); + AddSC_arathi_highlands(); + AddSC_blasted_lands(); + AddSC_burning_steppes(); + AddSC_duskwood(); + AddSC_eastern_plaguelands(); + AddSC_ghostlands(); + AddSC_hinterlands(); + AddSC_isle_of_queldanas(); + AddSC_loch_modan(); + AddSC_redridge_mountains(); + AddSC_silverpine_forest(); + AddSC_stormwind_city(); + AddSC_stranglethorn_vale(); + AddSC_swamp_of_sorrows(); + AddSC_tirisfal_glades(); + AddSC_undercity(); + AddSC_western_plaguelands(); + AddSC_wetlands(); +} diff --git a/src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp b/src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp index df61a010f84..6caf253570a 100644 --- a/src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp +++ b/src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp @@ -19,7 +19,7 @@ /* ScriptData SDName: Burning_Steppes SD%Complete: 100 -SDComment: Quest support: 4224, 4866 +SDComment: Quest support: 4866 SDCategory: Burning Steppes EndScriptData */ @@ -36,25 +36,11 @@ EndContentData */ ## npc_ragged_john ######*/ -#define GOSSIP_HELLO "Official buisness, John. I need some information about Marsha Windsor. Tell me about the last time you saw him." -#define GOSSIP_SELECT1 "So what did you do?" -#define GOSSIP_SELECT2 "Start making sense, dwarf. I don't want to have anything to do with your cracker, your pappy, or any sort of 'discreditin'." -#define GOSSIP_SELECT3 "Ironfoe?" -#define GOSSIP_SELECT4 "Interesting... continue John." -#define GOSSIP_SELECT5 "So that's how Windsor died..." -#define GOSSIP_SELECT6 "So how did he die?" -#define GOSSIP_SELECT7 "Ok so where the hell is he? Wait a minute! Are you drunk?" -#define GOSSIP_SELECT8 "WHY is he in Blackrock Depths?" -#define GOSSIP_SELECT9 "300? So the Dark Irons killed him and dragged him into the Depths?" -#define GOSSIP_SELECT10 "Ahh... Ironfoe" -#define GOSSIP_SELECT11 "Thanks, Ragged John. Your story was very uplifting and informative" - enum RaggedJohn { - QUEST_THE_TRUE_MASTERS = 4224, - QUEST_MOTHERS_MILK = 4866, - SPELL_MOTHERS_MILK = 16468, - SPELL_WICKED_MILKING = 16472 + QUEST_MOTHERS_MILK = 4866, + SPELL_MOTHERS_MILK = 16468, + SPELL_WICKED_MILKING = 16472 }; class npc_ragged_john : public CreatureScript @@ -86,72 +72,13 @@ public: void EnterCombat(Unit* /*who*/) override { } }; - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - player->PlayerTalkClass->ClearMenus(); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - player->SEND_GOSSIP_MENU(2714, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+1: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - player->SEND_GOSSIP_MENU(2715, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+2: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - player->SEND_GOSSIP_MENU(2716, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+3: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); - player->SEND_GOSSIP_MENU(2717, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+4: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); - player->SEND_GOSSIP_MENU(2718, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+5: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); - player->SEND_GOSSIP_MENU(2719, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+6: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT7, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 7); - player->SEND_GOSSIP_MENU(2720, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+7: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT8, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 8); - player->SEND_GOSSIP_MENU(2721, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+8: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT9, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 9); - player->SEND_GOSSIP_MENU(2722, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+9: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT10, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 10); - player->SEND_GOSSIP_MENU(2723, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+10: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT11, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11); - player->SEND_GOSSIP_MENU(2725, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+11: - player->CLOSE_GOSSIP_MENU(); - player->AreaExploredOrEventHappens(QUEST_THE_TRUE_MASTERS); - break; - } - return true; - } - bool OnGossipHello(Player* player, Creature* creature) override { if (creature->IsQuestGiver()) + { player->PrepareQuestMenu(creature->GetGUID()); - - if (player->GetQuestStatus(QUEST_THE_TRUE_MASTERS) == QUEST_STATUS_INCOMPLETE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HELLO, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - - player->SEND_GOSSIP_MENU(2713, creature->GetGUID()); + player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); + } return true; } diff --git a/src/server/scripts/EasternKingdoms/zone_eastern_plaguelands.cpp b/src/server/scripts/EasternKingdoms/zone_eastern_plaguelands.cpp index ce0ebf4d129..4cc72715868 100644 --- a/src/server/scripts/EasternKingdoms/zone_eastern_plaguelands.cpp +++ b/src/server/scripts/EasternKingdoms/zone_eastern_plaguelands.cpp @@ -19,7 +19,7 @@ /* ScriptData SDName: Eastern_Plaguelands SD%Complete: 100 -SDComment: Quest support: 5211, 5742. Special vendor Augustus the Touched +SDComment: Quest support: 5211. Special vendor Augustus the Touched SDCategory: Eastern Plaguelands EndScriptData */ @@ -27,7 +27,6 @@ EndScriptData */ npc_ghoul_flayer npc_augustus_the_touched npc_darrowshire_spirit -npc_tirion_fordring EndContentData */ #include "ScriptMgr.h" @@ -133,63 +132,9 @@ public: }; }; -/*###### -## npc_tirion_fordring -######*/ - -#define GOSSIP_HELLO "I am ready to hear your tale, Tirion." -#define GOSSIP_SELECT1 "Thank you, Tirion. What of your identity?" -#define GOSSIP_SELECT2 "That is terrible." -#define GOSSIP_SELECT3 "I will, Tirion." - -class npc_tirion_fordring : public CreatureScript -{ -public: - npc_tirion_fordring() : CreatureScript("npc_tirion_fordring") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - player->PlayerTalkClass->ClearMenus(); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF+1: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - player->SEND_GOSSIP_MENU(4493, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+2: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - player->SEND_GOSSIP_MENU(4494, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+3: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); - player->SEND_GOSSIP_MENU(4495, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+4: - player->CLOSE_GOSSIP_MENU(); - player->AreaExploredOrEventHappens(5742); - break; - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (player->GetQuestStatus(5742) == QUEST_STATUS_INCOMPLETE && player->getStandState() == UNIT_STAND_STATE_SIT) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HELLO, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - - player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); - - return true; - } -}; - void AddSC_eastern_plaguelands() { new npc_ghoul_flayer(); new npc_augustus_the_touched(); new npc_darrowshire_spirit(); - new npc_tirion_fordring(); } diff --git a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp index 2d6d4da5aef..4a585bcb267 100644 --- a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp +++ b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp @@ -19,14 +19,12 @@ /* ScriptData SDName: Stormwind_City SD%Complete: 100 -SDComment: Quest support: 1640, 1447, 4185, 11223, 434. +SDComment: Quest support: 1640, 1447, 434. SDCategory: Stormwind City EndScriptData */ /* ContentData -npc_archmage_malin npc_bartleby -npc_lady_katrana_prestor npc_tyrion npc_tyrion_spybot npc_marzon_silent_blade @@ -40,50 +38,13 @@ EndContentData */ #include "Player.h" /*###### -## npc_archmage_malin -######*/ - -#define GOSSIP_ITEM_MALIN "Can you send me to Theramore? I have an urgent message for Lady Jaina from Highlord Bolvar." - -class npc_archmage_malin : public CreatureScript -{ -public: - npc_archmage_malin() : CreatureScript("npc_archmage_malin") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - player->PlayerTalkClass->ClearMenus(); - if (action == GOSSIP_ACTION_INFO_DEF) - { - player->CLOSE_GOSSIP_MENU(); - creature->CastSpell(player, 42711, true); - } - - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (player->GetQuestStatus(11223) == QUEST_STATUS_COMPLETE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_MALIN, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - - player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); - - return true; - } -}; - -/*###### ## npc_bartleby ######*/ enum Bartleby { - FACTION_ENEMY = 168, - QUEST_BEAT = 1640 + FACTION_ENEMY = 168, + QUEST_BEAT = 1640 }; class npc_bartleby : public CreatureScript @@ -148,71 +109,18 @@ public: }; /*###### -## npc_lady_katrana_prestor -######*/ - -#define GOSSIP_ITEM_KAT_1 "Pardon the intrusion, Lady Prestor, but Highlord Bolvar suggested that I seek your advice." -#define GOSSIP_ITEM_KAT_2 "My apologies, Lady Prestor." -#define GOSSIP_ITEM_KAT_3 "Begging your pardon, Lady Prestor. That was not my intent." -#define GOSSIP_ITEM_KAT_4 "Thank you for your time, Lady Prestor." - -class npc_lady_katrana_prestor : public CreatureScript -{ -public: - npc_lady_katrana_prestor() : CreatureScript("npc_lady_katrana_prestor") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - player->PlayerTalkClass->ClearMenus(); - switch (action) - { - case GOSSIP_ACTION_INFO_DEF: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAT_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - player->SEND_GOSSIP_MENU(2694, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+1: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAT_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - player->SEND_GOSSIP_MENU(2695, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+2: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAT_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - player->SEND_GOSSIP_MENU(2696, creature->GetGUID()); - break; - case GOSSIP_ACTION_INFO_DEF+3: - player->CLOSE_GOSSIP_MENU(); - player->AreaExploredOrEventHappens(4185); - break; - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (player->GetQuestStatus(4185) == QUEST_STATUS_INCOMPLETE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KAT_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - - player->SEND_GOSSIP_MENU(2693, creature->GetGUID()); - - return true; - } -}; - -/*###### ## npc_lord_gregor_lescovar ######*/ enum LordGregorLescovar { - SAY_GUARD_2 = 0, - SAY_LESCOVAR_2 = 0, - SAY_LESCOVAR_3 = 1, - SAY_LESCOVAR_4 = 2, - SAY_MARZON_1 = 0, - SAY_MARZON_2 = 1, - SAY_TYRION_2 = 1, + SAY_GUARD_2 = 0, + SAY_LESCOVAR_2 = 0, + SAY_LESCOVAR_3 = 1, + SAY_LESCOVAR_4 = 2, + SAY_MARZON_1 = 0, + SAY_MARZON_2 = 1, + SAY_TYRION_2 = 1, NPC_STORMWIND_ROYAL = 1756, NPC_MARZON_BLADE = 1755, @@ -650,9 +558,7 @@ public: void AddSC_stormwind_city() { - new npc_archmage_malin(); new npc_bartleby(); - new npc_lady_katrana_prestor(); new npc_tyrion(); new npc_tyrion_spybot(); new npc_lord_gregor_lescovar(); diff --git a/src/server/scripts/Events/CMakeLists.txt b/src/server/scripts/Events/CMakeLists.txt deleted file mode 100644 index 1c9e5cfe8e1..00000000000 --- a/src/server/scripts/Events/CMakeLists.txt +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> -# -# This file is free software; as a special exception the author gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -file(GLOB_RECURSE sources_Events Events/*.cpp Events/*.h) - -set(scripts_STAT_SRCS - ${scripts_STAT_SRCS} - ${sources_Events} -) - -message(" -> Prepared: Events") diff --git a/src/server/scripts/Events/events_script_loader.cpp b/src/server/scripts/Events/events_script_loader.cpp new file mode 100644 index 00000000000..625c08f5389 --- /dev/null +++ b/src/server/scripts/Events/events_script_loader.cpp @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +// This is where scripts' loading functions should be declared: +void AddSC_event_childrens_week(); + +// The name of this function should match: +// void Add${NameOfDirectory}Scripts() +void AddEventsScripts() +{ + AddSC_event_childrens_week(); +} diff --git a/src/server/scripts/Kalimdor/CMakeLists.txt b/src/server/scripts/Kalimdor/CMakeLists.txt deleted file mode 100644 index 2d1b4b49649..00000000000 --- a/src/server/scripts/Kalimdor/CMakeLists.txt +++ /dev/null @@ -1,121 +0,0 @@ -# Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> -# -# This file is free software; as a special exception the author gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -set(scripts_STAT_SRCS - ${scripts_STAT_SRCS} - Kalimdor/zone_stonetalon_mountains.cpp - Kalimdor/zone_silithus.cpp - Kalimdor/zone_moonglade.cpp - Kalimdor/RazorfenDowns/razorfen_downs.cpp - Kalimdor/RazorfenDowns/instance_razorfen_downs.cpp - Kalimdor/RazorfenDowns/boss_tuten_kash.cpp - Kalimdor/RazorfenDowns/boss_mordresh_fire_eye.cpp - Kalimdor/RazorfenDowns/boss_glutton.cpp - Kalimdor/RazorfenDowns/boss_amnennar_the_coldbringer.cpp - Kalimdor/RazorfenDowns/razorfen_downs.h - Kalimdor/ZulFarrak/zulfarrak.cpp - Kalimdor/ZulFarrak/instance_zulfarrak.cpp - Kalimdor/ZulFarrak/boss_zum_rah.cpp - Kalimdor/ZulFarrak/zulfarrak.h - Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_epoch_hunter.cpp - Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.h - Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_leutenant_drake.cpp - Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp - Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/instance_old_hillsbrad.cpp - Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/boss_captain_skarloc.cpp - Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_archimonde.cpp - Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h - Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.h - Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_kazrogal.cpp - Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.cpp - Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.cpp - Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.cpp - Kalimdor/CavernsOfTime/BattleForMountHyjal/instance_hyjal.cpp - Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_rage_winterchill.cpp - Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal.h - Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_azgalor.cpp - Kalimdor/CavernsOfTime/BattleForMountHyjal/boss_anetheron.cpp - Kalimdor/CavernsOfTime/CullingOfStratholme/boss_infinite_corruptor.cpp - Kalimdor/CavernsOfTime/CullingOfStratholme/boss_salramm_the_fleshcrafter.cpp - Kalimdor/CavernsOfTime/CullingOfStratholme/boss_meathook.cpp - Kalimdor/CavernsOfTime/CullingOfStratholme/boss_mal_ganis.cpp - Kalimdor/CavernsOfTime/CullingOfStratholme/boss_chrono_lord_epoch.cpp - Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp - Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp - Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h - Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.h - Kalimdor/CavernsOfTime/TheBlackMorass/instance_the_black_morass.cpp - Kalimdor/CavernsOfTime/TheBlackMorass/boss_chrono_lord_deja.cpp - Kalimdor/CavernsOfTime/TheBlackMorass/the_black_morass.cpp - Kalimdor/CavernsOfTime/TheBlackMorass/boss_aeonus.cpp - Kalimdor/CavernsOfTime/TheBlackMorass/boss_temporus.cpp - Kalimdor/BlackfathomDeeps/boss_kelris.cpp - Kalimdor/BlackfathomDeeps/instance_blackfathom_deeps.cpp - Kalimdor/BlackfathomDeeps/boss_gelihast.cpp - Kalimdor/BlackfathomDeeps/blackfathom_deeps.cpp - Kalimdor/BlackfathomDeeps/boss_aku_mai.cpp - Kalimdor/BlackfathomDeeps/blackfathom_deeps.h - Kalimdor/zone_azuremyst_isle.cpp - Kalimdor/zone_orgrimmar.cpp - Kalimdor/zone_desolace.cpp - Kalimdor/zone_feralas.cpp - Kalimdor/Maraudon/boss_princess_theradras.cpp - Kalimdor/Maraudon/boss_landslide.cpp - Kalimdor/Maraudon/boss_celebras_the_cursed.cpp - Kalimdor/Maraudon/boss_noxxion.cpp - Kalimdor/Maraudon/instance_maraudon.cpp - Kalimdor/TempleOfAhnQiraj/boss_fankriss.cpp - Kalimdor/TempleOfAhnQiraj/boss_huhuran.cpp - Kalimdor/TempleOfAhnQiraj/instance_temple_of_ahnqiraj.cpp - Kalimdor/TempleOfAhnQiraj/mob_anubisath_sentinel.cpp - Kalimdor/TempleOfAhnQiraj/boss_viscidus.cpp - Kalimdor/TempleOfAhnQiraj/boss_twinemperors.cpp - Kalimdor/TempleOfAhnQiraj/boss_sartura.cpp - Kalimdor/TempleOfAhnQiraj/boss_cthun.cpp - Kalimdor/TempleOfAhnQiraj/temple_of_ahnqiraj.h - Kalimdor/TempleOfAhnQiraj/boss_skeram.cpp - Kalimdor/TempleOfAhnQiraj/boss_ouro.cpp - Kalimdor/TempleOfAhnQiraj/boss_bug_trio.cpp - Kalimdor/zone_darkshore.cpp - Kalimdor/RuinsOfAhnQiraj/boss_buru.cpp - Kalimdor/RuinsOfAhnQiraj/instance_ruins_of_ahnqiraj.cpp - Kalimdor/RuinsOfAhnQiraj/boss_rajaxx.cpp - Kalimdor/RuinsOfAhnQiraj/boss_ossirian.cpp - Kalimdor/RuinsOfAhnQiraj/boss_ayamiss.cpp - Kalimdor/RuinsOfAhnQiraj/boss_moam.cpp - Kalimdor/RuinsOfAhnQiraj/ruins_of_ahnqiraj.h - Kalimdor/RuinsOfAhnQiraj/boss_kurinnaxx.cpp - Kalimdor/zone_bloodmyst_isle.cpp - Kalimdor/zone_thunder_bluff.cpp - Kalimdor/zone_azshara.cpp - Kalimdor/RazorfenKraul/razorfen_kraul.h - Kalimdor/RazorfenKraul/instance_razorfen_kraul.cpp - Kalimdor/RazorfenKraul/razorfen_kraul.cpp - Kalimdor/zone_the_barrens.cpp - Kalimdor/zone_ungoro_crater.cpp - Kalimdor/WailingCaverns/wailing_caverns.h - Kalimdor/WailingCaverns/instance_wailing_caverns.cpp - Kalimdor/WailingCaverns/wailing_caverns.cpp - Kalimdor/zone_durotar.cpp - Kalimdor/zone_felwood.cpp - Kalimdor/boss_azuregos.cpp - Kalimdor/zone_tanaris.cpp - Kalimdor/zone_dustwallow_marsh.cpp - Kalimdor/zone_winterspring.cpp - Kalimdor/zone_thousand_needles.cpp - Kalimdor/zone_ashenvale.cpp - Kalimdor/OnyxiasLair/boss_onyxia.cpp - Kalimdor/OnyxiasLair/onyxias_lair.h - Kalimdor/OnyxiasLair/instance_onyxias_lair.cpp - Kalimdor/RagefireChasm/instance_ragefire_chasm.cpp - Kalimdor/DireMaul/instance_dire_maul.cpp -) - -message(" -> Prepared: Kalimdor") diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h index 55b85801652..54d3c53039e 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjalAI.h @@ -121,15 +121,15 @@ struct hyjalAI : public npc_escortAI void Initialize(); - void Reset(); // Generically used to reset our variables. Do *not* call in EnterEvadeMode as this may make problems if the raid is still in combat + void Reset() override; // Generically used to reset our variables. Do *not* call in EnterEvadeMode as this may make problems if the raid is still in combat - void EnterEvadeMode(EvadeReason /*why*/ = EVADE_REASON_OTHER); // Send creature back to spawn location and evade. + void EnterEvadeMode(EvadeReason /*why*/ = EVADE_REASON_OTHER) override; // Send creature back to spawn location and evade. - void EnterCombat(Unit* /*who*/); // Used to reset cooldowns for our spells and to inform the raid that we're under attack + void EnterCombat(Unit* /*who*/) override; // Used to reset cooldowns for our spells and to inform the raid that we're under attack - void UpdateAI(uint32 diff); // Called to summon waves, check for boss deaths and to cast our spells. + void UpdateAI(uint32 diff) override; // Called to summon waves, check for boss deaths and to cast our spells. - void JustDied(Unit* /*killer*/); // Called on death, informs the raid that they have failed. + void JustDied(Unit* /*killer*/) override; // Called on death, informs the raid that they have failed. void SetFaction(uint32 _faction) // Set the faction to either Alliance or Horde in Hyjal { @@ -140,13 +140,13 @@ struct hyjalAI : public npc_escortAI void SpawnVeins(); void DeSpawnVeins(); - void JustSummoned(Creature* summoned); - void SummonedCreatureDespawn(Creature* summoned); + void JustSummoned(Creature* summoned) override; + void SummonedCreatureDespawn(Creature* summoned) override; void HideNearPos(float x, float y); void RespawnNearPos(float x, float y); - void WaypointReached(uint32 waypointId); + void WaypointReached(uint32 waypointId) override; void DoOverrun(uint32 faction, const uint32 diff); - void MoveInLineOfSight(Unit* who); + void MoveInLineOfSight(Unit* who) override; void SummonCreature(uint32 entry, float Base[4][3]); // Summons a creature for that wave in that base diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.h b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.h index 5275c07f63a..f29851e7cea 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.h +++ b/src/server/scripts/Kalimdor/CavernsOfTime/BattleForMountHyjal/hyjal_trash.h @@ -25,11 +25,11 @@ struct hyjal_trashAI : public npc_escortAI { hyjal_trashAI(Creature* creature); - void UpdateAI(uint32 diff); + void UpdateAI(uint32 diff) override; - void JustDied(Unit* /*killer*/); + void JustDied(Unit* /*killer*/) override; - void DamageTaken(Unit* done_by, uint32 &damage); + void DamageTaken(Unit* done_by, uint32 &damage) override; public: InstanceScript* instance; diff --git a/src/server/scripts/Kalimdor/kalimdor_script_loader.cpp b/src/server/scripts/Kalimdor/kalimdor_script_loader.cpp new file mode 100644 index 00000000000..f1969a063d6 --- /dev/null +++ b/src/server/scripts/Kalimdor/kalimdor_script_loader.cpp @@ -0,0 +1,206 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +// This is where scripts' loading functions should be declared: +void AddSC_blackfathom_deeps(); //Blackfathom Depths +void AddSC_boss_gelihast(); +void AddSC_boss_kelris(); +void AddSC_boss_aku_mai(); +void AddSC_instance_blackfathom_deeps(); +void AddSC_hyjal(); //CoT Battle for Mt. Hyjal +void AddSC_boss_archimonde(); +void AddSC_instance_mount_hyjal(); +void AddSC_hyjal_trash(); +void AddSC_boss_rage_winterchill(); +void AddSC_boss_anetheron(); +void AddSC_boss_kazrogal(); +void AddSC_boss_azgalor(); +void AddSC_boss_captain_skarloc(); //CoT Old Hillsbrad +void AddSC_boss_epoch_hunter(); +void AddSC_boss_lieutenant_drake(); +void AddSC_instance_old_hillsbrad(); +void AddSC_old_hillsbrad(); +void AddSC_boss_aeonus(); //CoT The Black Morass +void AddSC_boss_chrono_lord_deja(); +void AddSC_boss_temporus(); +void AddSC_the_black_morass(); +void AddSC_instance_the_black_morass(); +void AddSC_boss_epoch(); //CoT Culling Of Stratholme +void AddSC_boss_infinite_corruptor(); +void AddSC_boss_salramm(); +void AddSC_boss_mal_ganis(); +void AddSC_boss_meathook(); +void AddSC_culling_of_stratholme(); +void AddSC_instance_culling_of_stratholme(); +void AddSC_instance_dire_maul(); //Dire Maul +void AddSC_boss_celebras_the_cursed(); //Maraudon +void AddSC_boss_landslide(); +void AddSC_boss_noxxion(); +void AddSC_boss_ptheradras(); +void AddSC_instance_maraudon(); +void AddSC_boss_onyxia(); //Onyxia's Lair +void AddSC_instance_onyxias_lair(); +void AddSC_boss_tuten_kash(); //Razorfen Downs +void AddSC_boss_mordresh_fire_eye(); +void AddSC_boss_glutton(); +void AddSC_boss_amnennar_the_coldbringer(); +void AddSC_razorfen_downs(); +void AddSC_instance_razorfen_downs(); +void AddSC_razorfen_kraul(); //Razorfen Kraul +void AddSC_instance_razorfen_kraul(); +void AddSC_boss_kurinnaxx(); //Ruins of ahn'qiraj +void AddSC_boss_rajaxx(); +void AddSC_boss_moam(); +void AddSC_boss_buru(); +void AddSC_boss_ayamiss(); +void AddSC_boss_ossirian(); +void AddSC_instance_ruins_of_ahnqiraj(); +void AddSC_boss_cthun(); //Temple of ahn'qiraj +void AddSC_boss_viscidus(); +void AddSC_boss_fankriss(); +void AddSC_boss_huhuran(); +void AddSC_bug_trio(); +void AddSC_boss_sartura(); +void AddSC_boss_skeram(); +void AddSC_boss_twinemperors(); +void AddSC_boss_ouro(); +void AddSC_npc_anubisath_sentinel(); +void AddSC_instance_temple_of_ahnqiraj(); +void AddSC_wailing_caverns(); //Wailing caverns +void AddSC_instance_wailing_caverns(); +void AddSC_boss_zum_rah(); //Zul'Farrak +void AddSC_zulfarrak(); +void AddSC_instance_zulfarrak(); + +void AddSC_ashenvale(); +void AddSC_azshara(); +void AddSC_azuremyst_isle(); +void AddSC_bloodmyst_isle(); +void AddSC_boss_azuregos(); +void AddSC_darkshore(); +void AddSC_desolace(); +void AddSC_durotar(); +void AddSC_dustwallow_marsh(); +void AddSC_felwood(); +void AddSC_feralas(); +void AddSC_moonglade(); +void AddSC_orgrimmar(); +void AddSC_silithus(); +void AddSC_stonetalon_mountains(); +void AddSC_tanaris(); +void AddSC_the_barrens(); +void AddSC_thousand_needles(); +void AddSC_thunder_bluff(); +void AddSC_ungoro_crater(); +void AddSC_winterspring(); + +// The name of this function should match: +// void Add${NameOfDirectory}Scripts() +void AddKalimdorScripts() +{ + AddSC_blackfathom_deeps(); //Blackfathom Depths + AddSC_boss_gelihast(); + AddSC_boss_kelris(); + AddSC_boss_aku_mai(); + AddSC_instance_blackfathom_deeps(); + AddSC_hyjal(); //CoT Battle for Mt. Hyjal + AddSC_boss_archimonde(); + AddSC_instance_mount_hyjal(); + AddSC_hyjal_trash(); + AddSC_boss_rage_winterchill(); + AddSC_boss_anetheron(); + AddSC_boss_kazrogal(); + AddSC_boss_azgalor(); + AddSC_boss_captain_skarloc(); //CoT Old Hillsbrad + AddSC_boss_epoch_hunter(); + AddSC_boss_lieutenant_drake(); + AddSC_instance_old_hillsbrad(); + AddSC_old_hillsbrad(); + AddSC_boss_aeonus(); //CoT The Black Morass + AddSC_boss_chrono_lord_deja(); + AddSC_boss_temporus(); + AddSC_the_black_morass(); + AddSC_instance_the_black_morass(); + AddSC_boss_epoch(); //CoT Culling Of Stratholme + AddSC_boss_infinite_corruptor(); + AddSC_boss_salramm(); + AddSC_boss_mal_ganis(); + AddSC_boss_meathook(); + AddSC_culling_of_stratholme(); + AddSC_instance_culling_of_stratholme(); + AddSC_instance_dire_maul(); //Dire Maul + AddSC_boss_celebras_the_cursed(); //Maraudon + AddSC_boss_landslide(); + AddSC_boss_noxxion(); + AddSC_boss_ptheradras(); + AddSC_instance_maraudon(); + AddSC_boss_onyxia(); //Onyxia's Lair + AddSC_instance_onyxias_lair(); + AddSC_boss_tuten_kash(); //Razorfen Downs + AddSC_boss_mordresh_fire_eye(); + AddSC_boss_glutton(); + AddSC_boss_amnennar_the_coldbringer(); + AddSC_razorfen_downs(); + AddSC_instance_razorfen_downs(); + AddSC_razorfen_kraul(); //Razorfen Kraul + AddSC_instance_razorfen_kraul(); + AddSC_boss_kurinnaxx(); //Ruins of ahn'qiraj + AddSC_boss_rajaxx(); + AddSC_boss_moam(); + AddSC_boss_buru(); + AddSC_boss_ayamiss(); + AddSC_boss_ossirian(); + AddSC_instance_ruins_of_ahnqiraj(); + AddSC_boss_cthun(); //Temple of ahn'qiraj + AddSC_boss_viscidus(); + AddSC_boss_fankriss(); + AddSC_boss_huhuran(); + AddSC_bug_trio(); + AddSC_boss_sartura(); + AddSC_boss_skeram(); + AddSC_boss_twinemperors(); + AddSC_boss_ouro(); + AddSC_npc_anubisath_sentinel(); + AddSC_instance_temple_of_ahnqiraj(); + AddSC_wailing_caverns(); //Wailing caverns + AddSC_instance_wailing_caverns(); + AddSC_boss_zum_rah(); //Zul'Farrak + AddSC_zulfarrak(); + AddSC_instance_zulfarrak(); + + AddSC_ashenvale(); + AddSC_azshara(); + AddSC_azuremyst_isle(); + AddSC_bloodmyst_isle(); + AddSC_boss_azuregos(); + AddSC_darkshore(); + AddSC_desolace(); + AddSC_durotar(); + AddSC_dustwallow_marsh(); + AddSC_felwood(); + AddSC_feralas(); + AddSC_moonglade(); + AddSC_orgrimmar(); + AddSC_silithus(); + AddSC_stonetalon_mountains(); + AddSC_tanaris(); + AddSC_the_barrens(); + AddSC_thousand_needles(); + AddSC_thunder_bluff(); + AddSC_ungoro_crater(); + AddSC_winterspring(); +} diff --git a/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp b/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp index 273e81d83c0..6063b9fe5c6 100644 --- a/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp +++ b/src/server/scripts/Kalimdor/zone_bloodmyst_isle.cpp @@ -240,11 +240,6 @@ class npc_sironas : public CreatureScript public: npc_sironas() : CreatureScript("npc_sironas") { } - CreatureAI* GetAI(Creature* creature) const - { - return new npc_sironasAI(creature); - } - struct npc_sironasAI : public ScriptedAI { npc_sironasAI(Creature* creature) : ScriptedAI(creature) { } @@ -343,6 +338,11 @@ public: GuidList _beamGuidList; EventMap _events; }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_sironasAI(creature); + } }; /*###### @@ -354,11 +354,6 @@ class npc_demolitionist_legoso : public CreatureScript public: npc_demolitionist_legoso() : CreatureScript("npc_demolitionist_legoso") { } - CreatureAI* GetAI(Creature* creature) const - { - return new npc_demolitionist_legosoAI(creature); - } - struct npc_demolitionist_legosoAI : public npc_escortAI { npc_demolitionist_legosoAI(Creature* creature) : npc_escortAI(creature) @@ -812,6 +807,11 @@ public: GuidList _explosivesGuids; EventMap _events; }; + + CreatureAI* GetAI(Creature* creature) const override + { + return new npc_demolitionist_legosoAI(creature); + } }; void AddSC_bloodmyst_isle() diff --git a/src/server/scripts/Kalimdor/zone_desolace.cpp b/src/server/scripts/Kalimdor/zone_desolace.cpp index 621e0b0a585..ca32ea7420b 100644 --- a/src/server/scripts/Kalimdor/zone_desolace.cpp +++ b/src/server/scripts/Kalimdor/zone_desolace.cpp @@ -66,7 +66,6 @@ public: npc_aged_dying_ancient_kodoAI(Creature* creature) : ScriptedAI(creature) { } void MoveInLineOfSight(Unit* who) override - { if (who->GetEntry() == NPC_SMEED && me->IsWithinDistInMap(who, 10.0f) && !me->HasAura(SPELL_KODO_KOMBO_GOSSIP)) { diff --git a/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp b/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp index 9df9f0b604a..be49778ee4a 100644 --- a/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp +++ b/src/server/scripts/Kalimdor/zone_dustwallow_marsh.cpp @@ -24,7 +24,6 @@ SDCategory: Dustwallow Marsh EndScriptData */ /* ContentData -npc_lady_jaina_proudmoore npc_nat_pagle npc_private_hendel npc_cassa_crimsonwing - handled by npc_taxi @@ -39,49 +38,6 @@ EndContentData */ #include "WorldSession.h" /*###### -## npc_lady_jaina_proudmoore -######*/ - -enum LadyJaina -{ - QUEST_JAINAS_AUTOGRAPH = 558, - SPELL_JAINAS_AUTOGRAPH = 23122 -}; - -#define GOSSIP_ITEM_JAINA "I know this is rather silly but i have a young ward who is a bit shy and would like your autograph." - -class npc_lady_jaina_proudmoore : public CreatureScript -{ -public: - npc_lady_jaina_proudmoore() : CreatureScript("npc_lady_jaina_proudmoore") { } - - bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override - { - player->PlayerTalkClass->ClearMenus(); - if (action == GOSSIP_SENDER_INFO) - { - player->SEND_GOSSIP_MENU(7012, creature->GetGUID()); - player->CastSpell(player, SPELL_JAINAS_AUTOGRAPH, false); - } - return true; - } - - bool OnGossipHello(Player* player, Creature* creature) override - { - if (creature->IsQuestGiver()) - player->PrepareQuestMenu(creature->GetGUID()); - - if (player->GetQuestStatus(QUEST_JAINAS_AUTOGRAPH) == QUEST_STATUS_INCOMPLETE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_JAINA, GOSSIP_SENDER_MAIN, GOSSIP_SENDER_INFO); - - player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); - - return true; - } - -}; - -/*###### ## npc_nat_pagle ######*/ @@ -417,7 +373,6 @@ class spell_energize_aoe : public SpellScriptLoader void AddSC_dustwallow_marsh() { - new npc_lady_jaina_proudmoore(); new npc_nat_pagle(); new npc_private_hendel(); new npc_zelfrax(); diff --git a/src/server/scripts/Kalimdor/zone_orgrimmar.cpp b/src/server/scripts/Kalimdor/zone_orgrimmar.cpp index ac26aa1f811..99a5efc0a4d 100644 --- a/src/server/scripts/Kalimdor/zone_orgrimmar.cpp +++ b/src/server/scripts/Kalimdor/zone_orgrimmar.cpp @@ -143,20 +143,30 @@ public: enum ThrallWarchief { - QUEST_6566 = 6566, - - SPELL_CHAIN_LIGHTNING = 16033, - SPELL_SHOCK = 16034 + GOSSIP_MENU_OPTION_ID_ALL = 0, + + OPTION_PLEASE_SHARE_YOUR = 3664, + OPTION_WHAT_DISCOVERIES = 3665, + OPTION_USURPER = 3666, + OPTION_WITH_ALL_DUE_RESPECT = 3667, + OPTION_I_I_DID_NOT_THINK_OF = 3668, + OPTION_I_LIVE_ONLY_TO_SERVE = 3669, + OPTION_OF_COURSE_WARCHIEF = 3670, + + GOSSIP_MEMBERS_OF_THE_HORDE = 4477, + GOSSIP_THE_SHATTERED_HAND = 5733, + GOSSIP_IT_WOULD_APPEAR_AS = 5734, + GOSSIP_THE_BROOD_MOTHER = 5735, + GOSSIP_SO_MUCH_TO_LEARN = 5736, + GOSSIP_I_DO_NOT_FAULT_YOU = 5737, + GOSSIP_NOW_PAY_ATTENTION = 5738, + + QUEST_WHAT_THE_WIND_CARRIES = 6566, + + SPELL_CHAIN_LIGHTNING = 16033, + SPELL_SHOCK = 16034 }; -#define GOSSIP_HTW "Please share your wisdom with me, Warchief." -#define GOSSIP_STW1 "What discoveries?" -#define GOSSIP_STW2 "Usurper?" -#define GOSSIP_STW3 "With all due respect, Warchief - why not allow them to be destroyed? Does this not strengthen our position?" -#define GOSSIP_STW4 "I... I did not think of it that way, Warchief." -#define GOSSIP_STW5 "I live only to serve, Warchief! My life is empty and meaningless without your guidance." -#define GOSSIP_STW6 "Of course, Warchief!" - /// @todo verify abilities/timers class npc_thrall_warchief : public CreatureScript { @@ -169,32 +179,32 @@ public: switch (action) { case GOSSIP_ACTION_INFO_DEF+1: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_STW1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); - player->SEND_GOSSIP_MENU(5733, creature->GetGUID()); + player->ADD_GOSSIP_ITEM_DB(OPTION_WHAT_DISCOVERIES, GOSSIP_MENU_OPTION_ID_ALL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); + player->SEND_GOSSIP_MENU(GOSSIP_THE_SHATTERED_HAND, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+2: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_STW2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3); - player->SEND_GOSSIP_MENU(5734, creature->GetGUID()); + player->ADD_GOSSIP_ITEM_DB(OPTION_USURPER, GOSSIP_MENU_OPTION_ID_ALL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3); + player->SEND_GOSSIP_MENU(GOSSIP_IT_WOULD_APPEAR_AS, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+3: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_STW3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4); - player->SEND_GOSSIP_MENU(5735, creature->GetGUID()); + player->ADD_GOSSIP_ITEM_DB(OPTION_WITH_ALL_DUE_RESPECT, GOSSIP_MENU_OPTION_ID_ALL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4); + player->SEND_GOSSIP_MENU(GOSSIP_THE_BROOD_MOTHER, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+4: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_STW4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5); - player->SEND_GOSSIP_MENU(5736, creature->GetGUID()); + player->ADD_GOSSIP_ITEM_DB(OPTION_I_I_DID_NOT_THINK_OF, GOSSIP_MENU_OPTION_ID_ALL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5); + player->SEND_GOSSIP_MENU(GOSSIP_SO_MUCH_TO_LEARN, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+5: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_STW5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+6); - player->SEND_GOSSIP_MENU(5737, creature->GetGUID()); + player->ADD_GOSSIP_ITEM_DB(OPTION_I_LIVE_ONLY_TO_SERVE, GOSSIP_MENU_OPTION_ID_ALL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+6); + player->SEND_GOSSIP_MENU(GOSSIP_I_DO_NOT_FAULT_YOU, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+6: - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_STW6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+7); - player->SEND_GOSSIP_MENU(5738, creature->GetGUID()); + player->ADD_GOSSIP_ITEM_DB(OPTION_OF_COURSE_WARCHIEF, GOSSIP_MENU_OPTION_ID_ALL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+7); + player->SEND_GOSSIP_MENU(GOSSIP_NOW_PAY_ATTENTION, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+7: player->CLOSE_GOSSIP_MENU(); - player->AreaExploredOrEventHappens(QUEST_6566); + player->AreaExploredOrEventHappens(QUEST_WHAT_THE_WIND_CARRIES); break; } return true; @@ -205,10 +215,10 @@ public: if (creature->IsQuestGiver()) player->PrepareQuestMenu(creature->GetGUID()); - if (player->GetQuestStatus(QUEST_6566) == QUEST_STATUS_INCOMPLETE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HTW, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + if (player->GetQuestStatus(QUEST_WHAT_THE_WIND_CARRIES) == QUEST_STATUS_INCOMPLETE) + player->ADD_GOSSIP_ITEM_DB(OPTION_PLEASE_SHARE_YOUR, GOSSIP_MENU_OPTION_ID_ALL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); + player->SEND_GOSSIP_MENU(GOSSIP_MEMBERS_OF_THE_HORDE, creature->GetGUID()); return true; } diff --git a/src/server/scripts/Northrend/CMakeLists.txt b/src/server/scripts/Northrend/CMakeLists.txt deleted file mode 100644 index 1dc453ad416..00000000000 --- a/src/server/scripts/Northrend/CMakeLists.txt +++ /dev/null @@ -1,199 +0,0 @@ -# Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> -# -# This file is free software; as a special exception the author gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -set(scripts_STAT_SRCS - ${scripts_STAT_SRCS} - Northrend/zone_wintergrasp.cpp - Northrend/isle_of_conquest.cpp - Northrend/zone_storm_peaks.cpp - Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp - Northrend/Ulduar/HallsOfLightning/boss_bjarngrim.cpp - Northrend/Ulduar/HallsOfLightning/halls_of_lightning.h - Northrend/Ulduar/HallsOfLightning/boss_ionar.cpp - Northrend/Ulduar/HallsOfLightning/boss_volkhan.cpp - Northrend/Ulduar/HallsOfLightning/boss_loken.cpp - Northrend/Ulduar/Ulduar/boss_general_vezax.cpp - Northrend/Ulduar/Ulduar/boss_thorim.cpp - Northrend/Ulduar/Ulduar/boss_ignis.cpp - Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp - Northrend/Ulduar/Ulduar/instance_ulduar.cpp - Northrend/Ulduar/Ulduar/boss_auriaya.cpp - Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp - Northrend/Ulduar/Ulduar/boss_hodir.cpp - Northrend/Ulduar/Ulduar/boss_assembly_of_iron.cpp - Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp - Northrend/Ulduar/Ulduar/boss_xt002.cpp - Northrend/Ulduar/Ulduar/boss_mimiron.cpp - Northrend/Ulduar/Ulduar/ulduar.h - Northrend/Ulduar/Ulduar/boss_freya.cpp - Northrend/Ulduar/Ulduar/boss_razorscale.cpp - Northrend/Ulduar/Ulduar/boss_kologarn.cpp - Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp - Northrend/Ulduar/HallsOfStone/halls_of_stone.h - Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp - Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp - Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp - Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp - Northrend/ChamberOfAspects/ObsidianSanctum/instance_obsidian_sanctum.cpp - Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.h - Northrend/ChamberOfAspects/ObsidianSanctum/boss_sartharion.cpp - Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.cpp - Northrend/ChamberOfAspects/RubySanctum/instance_ruby_sanctum.cpp - Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.h - Northrend/ChamberOfAspects/RubySanctum/ruby_sanctum.cpp - Northrend/ChamberOfAspects/RubySanctum/boss_baltharus_the_warborn.cpp - Northrend/ChamberOfAspects/RubySanctum/boss_saviana_ragefire.cpp - Northrend/ChamberOfAspects/RubySanctum/boss_general_zarithrian.cpp - Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp - Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.h - Northrend/FrozenHalls/HallsOfReflection/boss_falric.cpp - Northrend/FrozenHalls/HallsOfReflection/instance_halls_of_reflection.cpp - Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp - Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp - Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp - Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp - Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp - Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp - Northrend/FrozenHalls/PitOfSaron/pit_of_saron.h - Northrend/FrozenHalls/PitOfSaron/instance_pit_of_saron.cpp - Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp - Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp - Northrend/FrozenHalls/ForgeOfSouls/instance_forge_of_souls.cpp - Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp - Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.h - Northrend/Nexus/EyeOfEternity/boss_malygos.cpp - Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp - Northrend/Nexus/EyeOfEternity/eye_of_eternity.h - Northrend/Nexus/Oculus/boss_eregos.cpp - Northrend/Nexus/Oculus/boss_drakos.cpp - Northrend/Nexus/Oculus/oculus.h - Northrend/Nexus/Oculus/boss_varos.cpp - Northrend/Nexus/Oculus/boss_urom.cpp - Northrend/Nexus/Oculus/oculus.cpp - Northrend/Nexus/Oculus/instance_oculus.cpp - Northrend/Nexus/Nexus/boss_nexus_commanders.cpp - Northrend/Nexus/Nexus/boss_ormorok.cpp - Northrend/Nexus/Nexus/boss_magus_telestra.cpp - Northrend/Nexus/Nexus/instance_nexus.cpp - Northrend/Nexus/Nexus/boss_keristrasza.cpp - Northrend/Nexus/Nexus/boss_anomalus.cpp - Northrend/Nexus/Nexus/nexus.h - Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_anubarak_trial.cpp - Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_faction_champions.cpp - Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_lord_jaraxxus.cpp - Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.h - Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp - Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp - Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp - Northrend/CrusadersColiseum/TrialOfTheCrusader/instance_trial_of_the_crusader.cpp - Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.h - Northrend/CrusadersColiseum/TrialOfTheChampion/trial_of_the_champion.cpp - Northrend/CrusadersColiseum/TrialOfTheChampion/boss_grand_champions.cpp - Northrend/CrusadersColiseum/TrialOfTheChampion/boss_black_knight.cpp - Northrend/CrusadersColiseum/TrialOfTheChampion/instance_trial_of_the_champion.cpp - Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp - Northrend/Naxxramas/boss_loatheb.cpp - Northrend/Naxxramas/boss_anubrekhan.cpp - Northrend/Naxxramas/boss_maexxna.cpp - Northrend/Naxxramas/boss_patchwerk.cpp - Northrend/Naxxramas/boss_gothik.cpp - Northrend/Naxxramas/boss_faerlina.cpp - Northrend/Naxxramas/boss_gluth.cpp - Northrend/Naxxramas/boss_four_horsemen.cpp - Northrend/Naxxramas/naxxramas.h - Northrend/Naxxramas/boss_kelthuzad.cpp - Northrend/Naxxramas/boss_heigan.cpp - Northrend/Naxxramas/boss_thaddius.cpp - Northrend/Naxxramas/boss_razuvious.cpp - Northrend/Naxxramas/boss_sapphiron.cpp - Northrend/Naxxramas/instance_naxxramas.cpp - Northrend/Naxxramas/boss_grobbulus.cpp - Northrend/Naxxramas/boss_noth.cpp - Northrend/zone_crystalsong_forest.cpp - Northrend/VaultOfArchavon/boss_archavon.cpp - Northrend/VaultOfArchavon/boss_koralon.cpp - Northrend/VaultOfArchavon/vault_of_archavon.h - Northrend/VaultOfArchavon/instance_vault_of_archavon.cpp - Northrend/VaultOfArchavon/boss_emalon.cpp - Northrend/VaultOfArchavon/boss_toravon.cpp - Northrend/zone_sholazar_basin.cpp - Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp - Northrend/UtgardeKeep/UtgardePinnacle/boss_palehoof.cpp - Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp - Northrend/UtgardeKeep/UtgardePinnacle/boss_ymiron.cpp - Northrend/UtgardeKeep/UtgardePinnacle/instance_utgarde_pinnacle.cpp - Northrend/UtgardeKeep/UtgardePinnacle/utgarde_pinnacle.h - Northrend/UtgardeKeep/UtgardeKeep/boss_ingvar_the_plunderer.cpp - Northrend/UtgardeKeep/UtgardeKeep/boss_skarvald_dalronn.cpp - Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.h - Northrend/UtgardeKeep/UtgardeKeep/instance_utgarde_keep.cpp - Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp - Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp - Northrend/zone_dragonblight.cpp - Northrend/zone_grizzly_hills.cpp - Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h - Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp - Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp - Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp - Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp - Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp - Northrend/AzjolNerub/Ahnkahet/boss_prince_taldaram.cpp - Northrend/AzjolNerub/Ahnkahet/instance_ahnkahet.cpp - Northrend/AzjolNerub/Ahnkahet/boss_jedoga_shadowseeker.cpp - Northrend/AzjolNerub/Ahnkahet/boss_elder_nadox.cpp - Northrend/AzjolNerub/Ahnkahet/boss_amanitar.cpp - Northrend/AzjolNerub/Ahnkahet/ahnkahet.h - Northrend/VioletHold/boss_zuramat.cpp - Northrend/VioletHold/instance_violet_hold.cpp - Northrend/VioletHold/boss_lavanthor.cpp - Northrend/VioletHold/boss_cyanigosa.cpp - Northrend/VioletHold/violet_hold.h - Northrend/VioletHold/boss_ichoron.cpp - Northrend/VioletHold/boss_moragg.cpp - Northrend/VioletHold/boss_xevozz.cpp - Northrend/VioletHold/boss_erekem.cpp - Northrend/VioletHold/violet_hold.cpp - Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp - Northrend/IcecrownCitadel/icecrown_citadel.cpp - Northrend/IcecrownCitadel/icecrown_citadel.h - Northrend/IcecrownCitadel/icecrown_citadel_teleport.cpp - Northrend/IcecrownCitadel/boss_lord_marrowgar.cpp - Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp - Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp - Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp - Northrend/IcecrownCitadel/boss_festergut.cpp - Northrend/IcecrownCitadel/boss_rotface.cpp - Northrend/IcecrownCitadel/boss_professor_putricide.cpp - Northrend/IcecrownCitadel/boss_blood_prince_council.cpp - Northrend/IcecrownCitadel/boss_blood_queen_lana_thel.cpp - Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp - Northrend/IcecrownCitadel/boss_sindragosa.cpp - Northrend/IcecrownCitadel/boss_the_lich_king.cpp - Northrend/zone_zuldrak.cpp - Northrend/zone_icecrown.cpp - Northrend/Gundrak/boss_slad_ran.cpp - Northrend/Gundrak/instance_gundrak.cpp - Northrend/Gundrak/boss_drakkari_colossus.cpp - Northrend/Gundrak/gundrak.h - Northrend/Gundrak/boss_gal_darah.cpp - Northrend/Gundrak/boss_moorabi.cpp - Northrend/Gundrak/boss_eck.cpp - Northrend/zone_borean_tundra.cpp - Northrend/zone_howling_fjord.cpp - Northrend/zone_dalaran.cpp - Northrend/DraktharonKeep/boss_trollgore.cpp - Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp - Northrend/DraktharonKeep/boss_novos.cpp - Northrend/DraktharonKeep/drak_tharon_keep.h - Northrend/DraktharonKeep/boss_tharon_ja.cpp - Northrend/DraktharonKeep/boss_king_dred.cpp -) - -message(" -> Prepared: Northrend") diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp index eb1e769c07e..278f6a7ab4f 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_twin_valkyr.cpp @@ -132,7 +132,7 @@ class OrbsDespawner : public BasicEvent { } - bool Execute(uint64 /*currTime*/, uint32 /*diff*/) + bool Execute(uint64 /*currTime*/, uint32 /*diff*/) override { Trinity::CreatureWorker<OrbsDespawner> worker(_creature, *this); _creature->VisitNearbyGridObject(5000.0f, worker); diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp index 96bd0aaa35e..5410f403ab9 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_scourgelord_tyrannus.cpp @@ -22,6 +22,7 @@ #include "pit_of_saron.h" #include "Vehicle.h" #include "Player.h" +#include "PlayerAI.h" enum Yells { @@ -438,9 +439,10 @@ class spell_tyrannus_overlord_brand : public SpellScriptLoader if (GetTarget()->GetTypeId() != TYPEID_PLAYER) return; - oldAI = GetTarget()->GetAI(); - oldAIState = GetTarget()->IsAIEnabled; - GetTarget()->SetAI(new player_overlord_brandAI(GetTarget()->ToPlayer(), GetCasterGUID())); + Player* pTarget = GetTarget()->ToPlayer(); + oldAI = pTarget->AI(); + oldAIState = pTarget->IsAIEnabled; + GetTarget()->SetAI(new player_overlord_brandAI(pTarget, GetCasterGUID())); GetTarget()->IsAIEnabled = true; } @@ -450,7 +452,7 @@ class spell_tyrannus_overlord_brand : public SpellScriptLoader return; GetTarget()->IsAIEnabled = oldAIState; - UnitAI* thisAI = GetTarget()->GetAI(); + PlayerAI* thisAI = GetTarget()->ToPlayer()->AI(); GetTarget()->SetAI(oldAI); delete thisAI; } @@ -461,7 +463,7 @@ class spell_tyrannus_overlord_brand : public SpellScriptLoader AfterEffectRemove += AuraEffectRemoveFn(spell_tyrannus_overlord_brand_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); } - UnitAI* oldAI; + PlayerAI* oldAI; bool oldAIState; }; diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp index f59701b9c25..166e9739a95 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp @@ -160,7 +160,7 @@ class StandUpEvent : public BasicEvent public: StandUpEvent(Creature& owner) : BasicEvent(), _owner(owner) { } - bool Execute(uint64 /*eventTime*/, uint32 /*diff*/) + bool Execute(uint64 /*eventTime*/, uint32 /*diff*/) override { _owner.HandleEmoteCommand(EMOTE_ONESHOT_ROAR); _owner.SetReactState(REACT_AGGRESSIVE); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp index d3cf6495aa7..b3a11b8eb31 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_lady_deathwhisper.cpp @@ -203,7 +203,7 @@ class DaranavanMoveEvent : public BasicEvent public: DaranavanMoveEvent(Creature& darnavan) : _darnavan(darnavan) { } - bool Execute(uint64 /*time*/, uint32 /*diff*/) + bool Execute(uint64 /*time*/, uint32 /*diff*/) override { _darnavan.GetMotionMaster()->MovePoint(POINT_DESPAWN, SummonPositions[6]); return true; @@ -421,7 +421,7 @@ class boss_lady_deathwhisper : public CreatureScript void UpdateAI(uint32 diff) override { - if ((!UpdateVictim() && !events.IsInPhase(PHASE_INTRO))) + if (!UpdateVictim() && !events.IsInPhase(PHASE_INTRO)) return; events.Update(diff); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp index 2db9d206a00..f4e9d4673f2 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp @@ -562,7 +562,7 @@ class boss_professor_putricide : public CreatureScript void UpdateAI(uint32 diff) override { - if ((!(events.IsInPhase(PHASE_ROTFACE) || events.IsInPhase(PHASE_FESTERGUT)) && !UpdateVictim())) + if (!(events.IsInPhase(PHASE_ROTFACE) || events.IsInPhase(PHASE_FESTERGUT)) && !UpdateVictim()) return; events.Update(diff); @@ -776,7 +776,7 @@ class npc_volatile_ooze : public CreatureScript { } - void CastMainSpell() + void CastMainSpell() override { me->CastSpell(me, SPELL_VOLATILE_OOZE_ADHESIVE, false); } @@ -800,7 +800,7 @@ class npc_gas_cloud : public CreatureScript _newTargetSelectTimer = 0; } - void CastMainSpell() + void CastMainSpell() override { me->CastCustomSpell(SPELL_GASEOUS_BLOAT, SPELLVALUE_AURA_STACK, 10, me, false); } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp index 683dd976b7a..bf69a49055c 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_rotface.cpp @@ -856,14 +856,14 @@ class spell_rotface_vile_gas_trigger : public SpellScriptLoader GetCaster()->CastSpell(GetHitUnit(), SPELL_VILE_GAS_TRIGGER_SUMMON); } - void Register() + void Register() override { OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_rotface_vile_gas_trigger_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); OnEffectHitTarget += SpellEffectFn(spell_rotface_vile_gas_trigger_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; - SpellScript* GetSpellScript() const + SpellScript* GetSpellScript() const override { return new spell_rotface_vile_gas_trigger_SpellScript(); } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp index ac094588d35..0b129f3aa89 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp @@ -134,6 +134,7 @@ enum FrostwingData DATA_WHELP_MARKER = 2, DATA_LINKED_GAMEOBJECT = 3, DATA_TRAPPED_PLAYER = 4, + DATA_IS_THIRD_PHASE = 5 }; enum MovementPoints @@ -168,7 +169,7 @@ class FrostwyrmLandEvent : public BasicEvent public: FrostwyrmLandEvent(Creature& owner, Position const& dest) : _owner(owner), _dest(dest) { } - bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/) + bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/) override { _owner.GetMotionMaster()->MoveLand(POINT_FROSTWYRM_LAND, _dest); return true; @@ -184,7 +185,7 @@ class FrostBombExplosion : public BasicEvent public: FrostBombExplosion(Creature* owner, ObjectGuid sindragosaGUID) : _owner(owner), _sindragosaGUID(sindragosaGUID) { } - bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/) + bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/) override { _owner->CastSpell((Unit*)NULL, SPELL_FROST_BOMB, false, NULL, NULL, _sindragosaGUID); _owner->RemoveAurasDueToSpell(SPELL_FROST_BOMB_VISUAL); @@ -196,20 +197,19 @@ class FrostBombExplosion : public BasicEvent ObjectGuid _sindragosaGUID; }; -class FrostBeaconSelector +class FrostBeaconSelector : NonTankTargetSelector { public: - FrostBeaconSelector(Unit* source) : _source(source) { } + FrostBeaconSelector(Unit* source) : NonTankTargetSelector(source, true) { } - bool operator()(Unit* target) const + bool operator()(WorldObject* target) const { - return target->GetTypeId() == TYPEID_PLAYER && - target != _source->GetVictim() && - !target->HasAura(SPELL_ICE_TOMB_UNTARGETABLE); - } + if (Unit* unitTarget = target->ToUnit()) + return !NonTankTargetSelector::operator()(unitTarget) || + unitTarget->HasAura(SPELL_ICE_TOMB_UNTARGETABLE); - private: - Unit* _source; + return false; + } }; class boss_sindragosa : public CreatureScript @@ -326,9 +326,15 @@ class boss_sindragosa : public CreatureScript uint32 GetData(uint32 type) const override { - if (type == DATA_MYSTIC_BUFFET_STACK) - return _mysticBuffetStack; - return 0xFFFFFFFF; + switch (type) + { + case DATA_MYSTIC_BUFFET_STACK: + return _mysticBuffetStack; + case DATA_IS_THIRD_PHASE: + return _isThirdPhase; + default: + return 0xFFFFFFFF; + } } void MovementInform(uint32 type, uint32 point) override @@ -419,7 +425,6 @@ class boss_sindragosa : public CreatureScript if (spellId == spell->Id) if (Aura const* mysticBuffet = target->GetAura(spell->Id)) _mysticBuffetStack = std::max<uint8>(_mysticBuffetStack, mysticBuffet->GetStackAmount()); - } void UpdateAI(uint32 diff) override @@ -494,11 +499,7 @@ class boss_sindragosa : public CreatureScript me->GetMotionMaster()->MovePoint(POINT_AIR_PHASE_FAR, SindragosaAirPosFar); break; case EVENT_ICE_TOMB: - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, FrostBeaconSelector(me))) - { - Talk(EMOTE_WARN_FROZEN_ORB, target); - me->CastCustomSpell(SPELL_ICE_TOMB_TARGET, SPELLVALUE_MAX_TARGETS, 1, nullptr, TRIGGERED_FULL_MASK); - } + me->CastCustomSpell(SPELL_ICE_TOMB_TARGET, SPELLVALUE_MAX_TARGETS, 1, nullptr, TRIGGERED_FULL_MASK); events.ScheduleEvent(EVENT_ICE_TOMB, urand(16000, 23000)); break; case EVENT_FROST_BOMB: @@ -1576,6 +1577,41 @@ class spell_frostwarden_handler_focus_fire : public SpellScriptLoader } }; +class spell_sindragosa_ice_tomb_target : public SpellScriptLoader +{ +public: + spell_sindragosa_ice_tomb_target() : SpellScriptLoader("spell_sindragosa_ice_tomb_target") { } + + class spell_sindragosa_ice_tomb_target_SpellScript : public SpellScript + { + PrepareSpellScript(spell_sindragosa_ice_tomb_target_SpellScript); + + void FilterTargets(std::list<WorldObject*>& unitList) + { + Unit* caster = GetCaster(); + unitList.remove_if(FrostBeaconSelector(caster)); + } + + void HandleSindragosaTalk(SpellEffIndex /*effIndex*/) + { + if (Creature* creatureCaster = GetCaster()->ToCreature()) + if (creatureCaster->GetAI()->GetData(DATA_IS_THIRD_PHASE)) + creatureCaster->AI()->Talk(EMOTE_WARN_FROZEN_ORB, GetHitUnit()); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sindragosa_ice_tomb_target_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectLaunchTarget += SpellEffectFn(spell_sindragosa_ice_tomb_target_SpellScript::HandleSindragosaTalk, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_sindragosa_ice_tomb_target_SpellScript(); + } +}; + class at_sindragosa_lair : public AreaTriggerScript { public: @@ -1641,6 +1677,7 @@ void AddSC_boss_sindragosa() new spell_frostwarden_handler_focus_fire(); new spell_trigger_spell_from_caster("spell_sindragosa_ice_tomb", SPELL_ICE_TOMB_DUMMY, TRIGGERED_IGNORE_SET_FACING); new spell_trigger_spell_from_caster("spell_sindragosa_ice_tomb_dummy", SPELL_FROST_BEACON); + new spell_sindragosa_ice_tomb_target(); new at_sindragosa_lair(); new achievement_all_you_can_eat(); } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp index 9fa624aaad3..4675989228a 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_the_lich_king.cpp @@ -437,7 +437,7 @@ class StartMovementEvent : public BasicEvent { } - bool Execute(uint64 /*time*/, uint32 /*diff*/) + bool Execute(uint64 /*time*/, uint32 /*diff*/) override { _owner->SetReactState(REACT_AGGRESSIVE); if (Creature* _summoner = ObjectAccessor::GetCreature(*_owner, _summonerGuid)) @@ -459,7 +459,7 @@ class VileSpiritActivateEvent : public BasicEvent { } - bool Execute(uint64 /*time*/, uint32 /*diff*/) + bool Execute(uint64 /*time*/, uint32 /*diff*/) override { _owner->SetReactState(REACT_AGGRESSIVE); _owner->CastSpell(_owner, SPELL_VILE_SPIRIT_MOVE_SEARCH, true); @@ -479,7 +479,7 @@ class TriggerWickedSpirit : public BasicEvent { } - bool Execute(uint64 /*time*/, uint32 /*diff*/) + bool Execute(uint64 /*time*/, uint32 /*diff*/) override { _owner->CastCustomSpell(SPELL_TRIGGER_VILE_SPIRIT_HEROIC, SPELLVALUE_MAX_TARGETS, 1, NULL, true); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp index 4f35f848927..b07de3457bd 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_valithria_dreamwalker.cpp @@ -179,7 +179,7 @@ class DelayedCastEvent : public BasicEvent { } - bool Execute(uint64 /*time*/, uint32 /*diff*/) + bool Execute(uint64 /*time*/, uint32 /*diff*/) override { _trigger->CastSpell(_trigger, _spellId, false, NULL, NULL, _originalCaster); if (_despawnTime) @@ -201,7 +201,7 @@ class AuraRemoveEvent : public BasicEvent { } - bool Execute(uint64 /*time*/, uint32 /*diff*/) + bool Execute(uint64 /*time*/, uint32 /*diff*/) override { _trigger->RemoveAurasDueToSpell(_spellId); return true; @@ -219,7 +219,7 @@ class ValithriaDespawner : public BasicEvent { } - bool Execute(uint64 /*currTime*/, uint32 /*diff*/) + bool Execute(uint64 /*currTime*/, uint32 /*diff*/) override { Trinity::CreatureWorker<ValithriaDespawner> worker(_creature, *this); _creature->VisitNearbyGridObject(333.0f, worker); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp index 25ca99f6a20..abb9c025771 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/icecrown_citadel.cpp @@ -365,7 +365,7 @@ class CaptainSurviveTalk : public BasicEvent public: explicit CaptainSurviveTalk(Creature const& owner) : _owner(owner) { } - bool Execute(uint64 /*currTime*/, uint32 /*diff*/) + bool Execute(uint64 /*currTime*/, uint32 /*diff*/) override { _owner.AI()->Talk(SAY_CAPTAIN_SURVIVE_TALK); return true; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp index 89868fc7bf2..b2a1bb70077 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_algalon_the_observer.cpp @@ -1164,6 +1164,7 @@ class spell_algalon_trigger_3_adds : public SpellScriptLoader void Register() override { OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_algalon_trigger_3_adds_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + OnEffectHitTarget += SpellEffectFn(spell_algalon_trigger_3_adds_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp index 6dfc3bf01e7..98827fb3e00 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_flame_leviathan.cpp @@ -334,7 +334,8 @@ class boss_flame_leviathan : public CreatureScript void SpellHit(Unit* /*caster*/, SpellInfo const* spell) override { if (spell->Id == SPELL_START_THE_ENGINE) - ASSERT_NOTNULL(me->GetVehicleKit())->InstallAllAccessories(false); + if (Vehicle* vehicleKit = me->GetVehicleKit()) + vehicleKit->InstallAllAccessories(false); if (spell->Id == SPELL_ELECTROSHOCK) me->InterruptSpell(CURRENT_CHANNELED_SPELL); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp index e694433c614..309d5d4c62f 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_mimiron.cpp @@ -2759,7 +2759,7 @@ class achievement_setup_boom : public AchievementCriteriaScript public: achievement_setup_boom() : AchievementCriteriaScript("achievement_setup_boom") { } - bool OnCheck(Player* /*source*/, Unit* target) + bool OnCheck(Player* /*source*/, Unit* target) override { return target && target->GetAI()->GetData(DATA_SETUP_BOMB); } @@ -2770,7 +2770,7 @@ class achievement_setup_mine : public AchievementCriteriaScript public: achievement_setup_mine() : AchievementCriteriaScript("achievement_setup_mine") { } - bool OnCheck(Player* /*source*/, Unit* target) + bool OnCheck(Player* /*source*/, Unit* target) override { return target && target->GetAI()->GetData(DATA_SETUP_MINE); } @@ -2781,7 +2781,7 @@ class achievement_setup_rocket : public AchievementCriteriaScript public: achievement_setup_rocket() : AchievementCriteriaScript("achievement_setup_rocket") { } - bool OnCheck(Player* /*source*/, Unit* target) + bool OnCheck(Player* /*source*/, Unit* target) override { return target && target->GetAI()->GetData(DATA_SETUP_ROCKET); } @@ -2792,7 +2792,7 @@ class achievement_firefighter : public AchievementCriteriaScript public: achievement_firefighter() : AchievementCriteriaScript("achievement_firefighter") { } - bool OnCheck(Player* /*source*/, Unit* target) + bool OnCheck(Player* /*source*/, Unit* target) override { return target && target->GetAI()->GetData(DATA_FIREFIGHTER); } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp index 8cb20eadc9f..f3aeec85af2 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp @@ -637,7 +637,7 @@ class BoomEvent : public BasicEvent { } - bool Execute(uint64 /*time*/, uint32 /*diff*/) + bool Execute(uint64 /*time*/, uint32 /*diff*/) override { // This hack is here because we suspect our implementation of spell effect execution on targets // is done in the wrong order. We suspect that EFFECT_0 needs to be applied on all targets, diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp index 7da67171b5c..675268b4e93 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp @@ -230,6 +230,9 @@ enum Spells // Descend Into Madness SPELL_TELEPORT_PORTAL_VISUAL = 64416, + SPELL_TELEPORT_TO_STORMWIND_ILLUSION = 63989, + SPELL_TELEPORT_TO_CHAMBER_ILLUSION = 63997, + SPELL_TELEPORT_TO_ICECROWN_ILLUSION = 63998, // Illusions SPELL_GRIM_REPRISAL = 63305, @@ -395,6 +398,14 @@ enum MiscData { ACHIEV_TIMED_START_EVENT = 21001, SOUND_LUNATIC_GAZE = 15757, + MAX_ILLUSION_ROOMS = 3 +}; + +uint32 const IllusionSpells[MAX_ILLUSION_ROOMS] +{ + SPELL_TELEPORT_TO_CHAMBER_ILLUSION, + SPELL_TELEPORT_TO_ICECROWN_ILLUSION, + SPELL_TELEPORT_TO_STORMWIND_ILLUSION }; class StartAttackEvent : public BasicEvent @@ -405,7 +416,7 @@ class StartAttackEvent : public BasicEvent { } - bool Execute(uint64 /*time*/, uint32 /*diff*/) + bool Execute(uint64 /*time*/, uint32 /*diff*/) override { _owner->SetReactState(REACT_AGGRESSIVE); if (Creature* _summoner = ObjectAccessor::GetCreature(*_owner, _summonerGuid)) @@ -1419,7 +1430,11 @@ class npc_descend_into_madness : public CreatureScript { if (!result) return; + clicker->RemoveAurasDueToSpell(SPELL_BRAIN_LINK); + uint32 illusion = _instance->GetData(DATA_ILLUSION); + if (illusion < MAX_ILLUSION_ROOMS) + DoCast(clicker, IllusionSpells[illusion], true); me->DespawnOrUnsummon(); } diff --git a/src/server/scripts/Northrend/isle_of_conquest.cpp b/src/server/scripts/Northrend/isle_of_conquest.cpp index 68121e940c9..11cc645f0cb 100644 --- a/src/server/scripts/Northrend/isle_of_conquest.cpp +++ b/src/server/scripts/Northrend/isle_of_conquest.cpp @@ -210,7 +210,7 @@ class StartLaunchEvent : public BasicEvent { } - bool Execute(uint64 /*time*/, uint32 /*diff*/) + bool Execute(uint64 /*time*/, uint32 /*diff*/) override { Player* player = sObjectMgr->GetPlayerByLowGUID(_lowGuid); if (!player || !player->GetVehicle()) diff --git a/src/server/scripts/Northrend/northrend_script_loader.cpp b/src/server/scripts/Northrend/northrend_script_loader.cpp new file mode 100644 index 00000000000..7d104b85f6d --- /dev/null +++ b/src/server/scripts/Northrend/northrend_script_loader.cpp @@ -0,0 +1,374 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +// This is where scripts' loading functions should be declared: +void AddSC_boss_slad_ran(); +void AddSC_boss_moorabi(); +void AddSC_boss_drakkari_colossus(); +void AddSC_boss_gal_darah(); +void AddSC_boss_eck(); +void AddSC_instance_gundrak(); + +// Azjol-Nerub - Azjol-Nerub +void AddSC_boss_krik_thir(); +void AddSC_boss_hadronox(); +void AddSC_boss_anub_arak(); +void AddSC_instance_azjol_nerub(); + +// Azjol-Nerub - Ahn'kahet +void AddSC_boss_elder_nadox(); +void AddSC_boss_taldaram(); +void AddSC_boss_amanitar(); +void AddSC_boss_jedoga_shadowseeker(); +void AddSC_boss_volazj(); +void AddSC_instance_ahnkahet(); + +// Drak'Tharon Keep +void AddSC_boss_trollgore(); +void AddSC_boss_novos(); +void AddSC_boss_king_dred(); +void AddSC_boss_tharon_ja(); +void AddSC_instance_drak_tharon_keep(); + +void AddSC_boss_argent_challenge(); //Trial of the Champion +void AddSC_boss_black_knight(); +void AddSC_boss_grand_champions(); +void AddSC_instance_trial_of_the_champion(); +void AddSC_trial_of_the_champion(); +void AddSC_boss_anubarak_trial(); //Trial of the Crusader +void AddSC_boss_faction_champions(); +void AddSC_boss_jaraxxus(); +void AddSC_boss_northrend_beasts(); +void AddSC_boss_twin_valkyr(); +void AddSC_trial_of_the_crusader(); +void AddSC_instance_trial_of_the_crusader(); +void AddSC_boss_anubrekhan(); //Naxxramas +void AddSC_boss_maexxna(); +void AddSC_boss_patchwerk(); +void AddSC_boss_grobbulus(); +void AddSC_boss_razuvious(); +void AddSC_boss_kelthuzad(); +void AddSC_boss_loatheb(); +void AddSC_boss_noth(); +void AddSC_boss_gluth(); +void AddSC_boss_sapphiron(); +void AddSC_boss_four_horsemen(); +void AddSC_boss_faerlina(); +void AddSC_boss_heigan(); +void AddSC_boss_gothik(); +void AddSC_boss_thaddius(); +void AddSC_instance_naxxramas(); +void AddSC_boss_nexus_commanders(); // The Nexus Nexus +void AddSC_boss_magus_telestra(); +void AddSC_boss_anomalus(); +void AddSC_boss_ormorok(); +void AddSC_boss_keristrasza(); +void AddSC_instance_nexus(); +void AddSC_boss_drakos(); //The Nexus The Oculus +void AddSC_boss_urom(); +void AddSC_boss_varos(); +void AddSC_boss_eregos(); +void AddSC_instance_oculus(); +void AddSC_oculus(); +void AddSC_boss_malygos(); // The Nexus: Eye of Eternity +void AddSC_instance_eye_of_eternity(); +void AddSC_boss_sartharion(); //Obsidian Sanctum +void AddSC_obsidian_sanctum(); +void AddSC_instance_obsidian_sanctum(); +void AddSC_boss_bjarngrim(); //Ulduar Halls of Lightning +void AddSC_boss_loken(); +void AddSC_boss_ionar(); +void AddSC_boss_volkhan(); +void AddSC_instance_halls_of_lightning(); +void AddSC_boss_maiden_of_grief(); //Ulduar Halls of Stone +void AddSC_boss_krystallus(); +void AddSC_boss_sjonnir(); +void AddSC_instance_halls_of_stone(); +void AddSC_halls_of_stone(); +void AddSC_boss_auriaya(); //Ulduar Ulduar +void AddSC_boss_flame_leviathan(); +void AddSC_boss_ignis(); +void AddSC_boss_razorscale(); +void AddSC_boss_xt002(); +void AddSC_boss_kologarn(); +void AddSC_boss_assembly_of_iron(); +void AddSC_boss_general_vezax(); +void AddSC_boss_mimiron(); +void AddSC_boss_hodir(); +void AddSC_boss_freya(); +void AddSC_boss_yogg_saron(); +void AddSC_boss_algalon_the_observer(); +void AddSC_instance_ulduar(); + +// Utgarde Keep - Utgarde Keep +void AddSC_boss_keleseth(); +void AddSC_boss_skarvald_dalronn(); +void AddSC_boss_ingvar_the_plunderer(); +void AddSC_instance_utgarde_keep(); +void AddSC_utgarde_keep(); + +// Utgarde Keep - Utgarde Pinnacle +void AddSC_boss_svala(); +void AddSC_boss_palehoof(); +void AddSC_boss_skadi(); +void AddSC_boss_ymiron(); +void AddSC_instance_utgarde_pinnacle(); + +// Vault of Archavon +void AddSC_boss_archavon(); +void AddSC_boss_emalon(); +void AddSC_boss_koralon(); +void AddSC_boss_toravon(); +void AddSC_instance_vault_of_archavon(); + +void AddSC_boss_cyanigosa(); //Violet Hold +void AddSC_boss_erekem(); +void AddSC_boss_ichoron(); +void AddSC_boss_lavanthor(); +void AddSC_boss_moragg(); +void AddSC_boss_xevozz(); +void AddSC_boss_zuramat(); +void AddSC_instance_violet_hold(); +void AddSC_violet_hold(); +void AddSC_instance_forge_of_souls(); //Forge of Souls +void AddSC_forge_of_souls(); +void AddSC_boss_bronjahm(); +void AddSC_boss_devourer_of_souls(); +void AddSC_instance_pit_of_saron(); //Pit of Saron +void AddSC_pit_of_saron(); +void AddSC_boss_garfrost(); +void AddSC_boss_ick(); +void AddSC_boss_tyrannus(); +void AddSC_instance_halls_of_reflection(); // Halls of Reflection +void AddSC_halls_of_reflection(); +void AddSC_boss_falric(); +void AddSC_boss_marwyn(); +void AddSC_boss_lord_marrowgar(); // Icecrown Citadel +void AddSC_boss_lady_deathwhisper(); +void AddSC_boss_icecrown_gunship_battle(); +void AddSC_boss_deathbringer_saurfang(); +void AddSC_boss_festergut(); +void AddSC_boss_rotface(); +void AddSC_boss_professor_putricide(); +void AddSC_boss_blood_prince_council(); +void AddSC_boss_blood_queen_lana_thel(); +void AddSC_boss_valithria_dreamwalker(); +void AddSC_boss_sindragosa(); +void AddSC_boss_the_lich_king(); +void AddSC_icecrown_citadel_teleport(); +void AddSC_instance_icecrown_citadel(); +void AddSC_icecrown_citadel(); +void AddSC_instance_ruby_sanctum(); // Ruby Sanctum +void AddSC_ruby_sanctum(); +void AddSC_boss_baltharus_the_warborn(); +void AddSC_boss_saviana_ragefire(); +void AddSC_boss_general_zarithrian(); +void AddSC_boss_halion(); + +void AddSC_dalaran(); +void AddSC_borean_tundra(); +void AddSC_dragonblight(); +void AddSC_grizzly_hills(); +void AddSC_howling_fjord(); +void AddSC_icecrown(); +void AddSC_sholazar_basin(); +void AddSC_storm_peaks(); +void AddSC_wintergrasp(); +void AddSC_zuldrak(); +void AddSC_crystalsong_forest(); +void AddSC_isle_of_conquest(); + +// The name of this function should match: +// void Add${NameOfDirectory}Scripts() +void AddNorthrendScripts() +{ + AddSC_boss_slad_ran(); //Gundrak + AddSC_boss_moorabi(); + AddSC_boss_drakkari_colossus(); + AddSC_boss_gal_darah(); + AddSC_boss_eck(); + AddSC_instance_gundrak(); + + // Azjol-Nerub - Ahn'kahet + AddSC_boss_elder_nadox(); + AddSC_boss_taldaram(); + AddSC_boss_amanitar(); + AddSC_boss_jedoga_shadowseeker(); + AddSC_boss_volazj(); + AddSC_instance_ahnkahet(); + + // Azjol-Nerub - Azjol-Nerub + AddSC_boss_krik_thir(); + AddSC_boss_hadronox(); + AddSC_boss_anub_arak(); + AddSC_instance_azjol_nerub(); + + // Drak'Tharon Keep + AddSC_boss_trollgore(); + AddSC_boss_novos(); + AddSC_boss_king_dred(); + AddSC_boss_tharon_ja(); + AddSC_instance_drak_tharon_keep(); + + AddSC_boss_argent_challenge(); //Trial of the Champion + AddSC_boss_black_knight(); + AddSC_boss_grand_champions(); + AddSC_instance_trial_of_the_champion(); + AddSC_trial_of_the_champion(); + AddSC_boss_anubarak_trial(); //Trial of the Crusader + AddSC_boss_faction_champions(); + AddSC_boss_jaraxxus(); + AddSC_trial_of_the_crusader(); + AddSC_boss_twin_valkyr(); + AddSC_boss_northrend_beasts(); + AddSC_instance_trial_of_the_crusader(); + AddSC_boss_anubrekhan(); //Naxxramas + AddSC_boss_maexxna(); + AddSC_boss_patchwerk(); + AddSC_boss_grobbulus(); + AddSC_boss_razuvious(); + AddSC_boss_kelthuzad(); + AddSC_boss_loatheb(); + AddSC_boss_noth(); + AddSC_boss_gluth(); + AddSC_boss_sapphiron(); + AddSC_boss_four_horsemen(); + AddSC_boss_faerlina(); + AddSC_boss_heigan(); + AddSC_boss_gothik(); + AddSC_boss_thaddius(); + AddSC_instance_naxxramas(); + AddSC_boss_nexus_commanders(); // The Nexus Nexus + AddSC_boss_magus_telestra(); + AddSC_boss_anomalus(); + AddSC_boss_ormorok(); + AddSC_boss_keristrasza(); + AddSC_instance_nexus(); + AddSC_boss_drakos(); //The Nexus The Oculus + AddSC_boss_urom(); + AddSC_boss_varos(); + AddSC_boss_eregos(); + AddSC_instance_oculus(); + AddSC_oculus(); + AddSC_boss_malygos(); // The Nexus: Eye of Eternity + AddSC_instance_eye_of_eternity(); + AddSC_boss_sartharion(); //Obsidian Sanctum + AddSC_obsidian_sanctum(); + AddSC_instance_obsidian_sanctum(); + AddSC_boss_bjarngrim(); //Ulduar Halls of Lightning + AddSC_boss_loken(); + AddSC_boss_ionar(); + AddSC_boss_volkhan(); + AddSC_instance_halls_of_lightning(); + AddSC_boss_maiden_of_grief(); //Ulduar Halls of Stone + AddSC_boss_krystallus(); + AddSC_boss_sjonnir(); + AddSC_instance_halls_of_stone(); + AddSC_halls_of_stone(); + AddSC_boss_auriaya(); //Ulduar Ulduar + AddSC_boss_flame_leviathan(); + AddSC_boss_ignis(); + AddSC_boss_razorscale(); + AddSC_boss_xt002(); + AddSC_boss_general_vezax(); + AddSC_boss_assembly_of_iron(); + AddSC_boss_kologarn(); + AddSC_boss_mimiron(); + AddSC_boss_hodir(); + AddSC_boss_freya(); + AddSC_boss_yogg_saron(); + AddSC_boss_algalon_the_observer(); + AddSC_instance_ulduar(); + + // Utgarde Keep - Utgarde Keep + AddSC_boss_keleseth(); + AddSC_boss_skarvald_dalronn(); + AddSC_boss_ingvar_the_plunderer(); + AddSC_instance_utgarde_keep(); + AddSC_utgarde_keep(); + + // Utgarde Keep - Utgarde Pinnacle + AddSC_boss_svala(); + AddSC_boss_palehoof(); + AddSC_boss_skadi(); + AddSC_boss_ymiron(); + AddSC_instance_utgarde_pinnacle(); + + // Vault of Archavon + AddSC_boss_archavon(); + AddSC_boss_emalon(); + AddSC_boss_koralon(); + AddSC_boss_toravon(); + AddSC_instance_vault_of_archavon(); + + AddSC_boss_cyanigosa(); //Violet Hold + AddSC_boss_erekem(); + AddSC_boss_ichoron(); + AddSC_boss_lavanthor(); + AddSC_boss_moragg(); + AddSC_boss_xevozz(); + AddSC_boss_zuramat(); + AddSC_instance_violet_hold(); + AddSC_violet_hold(); + AddSC_instance_forge_of_souls(); //Forge of Souls + AddSC_forge_of_souls(); + AddSC_boss_bronjahm(); + AddSC_boss_devourer_of_souls(); + AddSC_instance_pit_of_saron(); //Pit of Saron + AddSC_pit_of_saron(); + AddSC_boss_garfrost(); + AddSC_boss_ick(); + AddSC_boss_tyrannus(); + AddSC_instance_halls_of_reflection(); // Halls of Reflection + AddSC_halls_of_reflection(); + AddSC_boss_falric(); + AddSC_boss_marwyn(); + AddSC_boss_lord_marrowgar(); // Icecrown Citadel + AddSC_boss_lady_deathwhisper(); + AddSC_boss_icecrown_gunship_battle(); + AddSC_boss_deathbringer_saurfang(); + AddSC_boss_festergut(); + AddSC_boss_rotface(); + AddSC_boss_professor_putricide(); + AddSC_boss_blood_prince_council(); + AddSC_boss_blood_queen_lana_thel(); + AddSC_boss_valithria_dreamwalker(); + AddSC_boss_sindragosa(); + AddSC_boss_the_lich_king(); + AddSC_icecrown_citadel_teleport(); + AddSC_instance_icecrown_citadel(); + AddSC_icecrown_citadel(); + AddSC_instance_ruby_sanctum(); // Ruby Sanctum + AddSC_ruby_sanctum(); + AddSC_boss_baltharus_the_warborn(); + AddSC_boss_saviana_ragefire(); + AddSC_boss_general_zarithrian(); + AddSC_boss_halion(); + + AddSC_dalaran(); + AddSC_borean_tundra(); + AddSC_dragonblight(); + AddSC_grizzly_hills(); + AddSC_howling_fjord(); + AddSC_icecrown(); + AddSC_sholazar_basin(); + AddSC_storm_peaks(); + AddSC_wintergrasp(); + AddSC_zuldrak(); + AddSC_crystalsong_forest(); + AddSC_isle_of_conquest(); +} diff --git a/src/server/scripts/Northrend/zone_dragonblight.cpp b/src/server/scripts/Northrend/zone_dragonblight.cpp index 2ec2af80624..d7ff1e5cb4d 100644 --- a/src/server/scripts/Northrend/zone_dragonblight.cpp +++ b/src/server/scripts/Northrend/zone_dragonblight.cpp @@ -360,7 +360,7 @@ class npc_commander_eligor_dawnbringer : public CreatureScript uint8 talkWing; }; - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const override { return new npc_commander_eligor_dawnbringerAI(creature); } @@ -695,7 +695,7 @@ class npc_torturer_lecraft : public CreatureScript ObjectGuid _playerGUID; }; - CreatureAI* GetAI(Creature* creature) const + CreatureAI* GetAI(Creature* creature) const override { return new npc_torturer_lecraftAI(creature); } diff --git a/src/server/scripts/OutdoorPvP/CMakeLists.txt b/src/server/scripts/OutdoorPvP/CMakeLists.txt deleted file mode 100644 index 91ce4ce4186..00000000000 --- a/src/server/scripts/OutdoorPvP/CMakeLists.txt +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> -# -# This file is free software; as a special exception the author gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -set(scripts_STAT_SRCS - ${scripts_STAT_SRCS} - OutdoorPvP/OutdoorPvPTF.cpp - OutdoorPvP/OutdoorPvPSI.cpp - OutdoorPvP/OutdoorPvPSI.h - OutdoorPvP/OutdoorPvPZM.cpp - OutdoorPvP/OutdoorPvPNA.cpp - OutdoorPvP/OutdoorPvPHP.cpp - OutdoorPvP/OutdoorPvPTF.h - OutdoorPvP/OutdoorPvPEP.h - OutdoorPvP/OutdoorPvPEP.cpp - OutdoorPvP/OutdoorPvPHP.h - OutdoorPvP/OutdoorPvPZM.h - OutdoorPvP/OutdoorPvPNA.h -) - -message(" -> Prepared: Outdoor PVP Zones") diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPHP.h b/src/server/scripts/OutdoorPvP/OutdoorPvPHP.h index 71dbd139ea0..4fd608ccd1c 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPHP.h +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPHP.h @@ -96,9 +96,9 @@ class OPvPCapturePointHP : public OPvPCapturePoint public: OPvPCapturePointHP(OutdoorPvP* pvp, OutdoorPvPHPTowerType type); - void ChangeState(); + void ChangeState() override; - void FillInitialWorldStates(WorldPacket & data); + void FillInitialWorldStates(WorldPacket & data) override; private: OutdoorPvPHPTowerType m_TowerType; @@ -109,18 +109,18 @@ class OutdoorPvPHP : public OutdoorPvP public: OutdoorPvPHP(); - bool SetupOutdoorPvP(); + bool SetupOutdoorPvP() override; - void HandlePlayerEnterZone(Player* player, uint32 zone); - void HandlePlayerLeaveZone(Player* player, uint32 zone); + void HandlePlayerEnterZone(Player* player, uint32 zone) override; + void HandlePlayerLeaveZone(Player* player, uint32 zone) override; - bool Update(uint32 diff); + bool Update(uint32 diff) override; - void FillInitialWorldStates(WorldPacket &data); + void FillInitialWorldStates(WorldPacket &data) override; - void SendRemoveWorldStates(Player* player); + void SendRemoveWorldStates(Player* player) override; - void HandleKillImpl(Player* player, Unit* killed); + void HandleKillImpl(Player* player, Unit* killed) override; uint32 GetAllianceTowersControlled() const; void SetAllianceTowersControlled(uint32 count); diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPNA.h b/src/server/scripts/OutdoorPvP/OutdoorPvPNA.h index 4ed47c42206..80878828d44 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPNA.h +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPNA.h @@ -311,18 +311,18 @@ class OutdoorPvPNA : public OutdoorPvP public: OutdoorPvPNA(); - bool SetupOutdoorPvP(); + bool SetupOutdoorPvP() override; - void HandlePlayerEnterZone(Player* player, uint32 zone); - void HandlePlayerLeaveZone(Player* player, uint32 zone); + void HandlePlayerEnterZone(Player* player, uint32 zone) override; + void HandlePlayerLeaveZone(Player* player, uint32 zone) override; - bool Update(uint32 diff); + bool Update(uint32 diff) override; - void FillInitialWorldStates(WorldPacket &data); + void FillInitialWorldStates(WorldPacket &data) override; - void SendRemoveWorldStates(Player* player); + void SendRemoveWorldStates(Player* player) override; - void HandleKillImpl(Player* player, Unit* killed); + void HandleKillImpl(Player* player, Unit* killed) override; private: OPvPCapturePointNA * m_obj; diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPSI.h b/src/server/scripts/OutdoorPvP/OutdoorPvPSI.h index f28fea926fc..fae2ea9738e 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPSI.h +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPSI.h @@ -56,22 +56,22 @@ class OutdoorPvPSI : public OutdoorPvP public: OutdoorPvPSI(); - bool SetupOutdoorPvP(); + bool SetupOutdoorPvP() override; - void HandlePlayerEnterZone(Player* player, uint32 zone); - void HandlePlayerLeaveZone(Player* player, uint32 zone); + void HandlePlayerEnterZone(Player* player, uint32 zone) override; + void HandlePlayerLeaveZone(Player* player, uint32 zone) override; - bool Update(uint32 diff); + bool Update(uint32 diff) override; - void FillInitialWorldStates(WorldPacket &data); + void FillInitialWorldStates(WorldPacket &data) override; - void SendRemoveWorldStates(Player* player); + void SendRemoveWorldStates(Player* player) override; - bool HandleAreaTrigger(Player* player, uint32 trigger); + bool HandleAreaTrigger(Player* player, uint32 trigger) override; - bool HandleDropFlag(Player* player, uint32 spellId); + bool HandleDropFlag(Player* player, uint32 spellId) override; - bool HandleCustomSpell(Player* player, uint32 spellId, GameObject* go); + bool HandleCustomSpell(Player* player, uint32 spellId, GameObject* go) override; void UpdateWorldState(); diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPScriptLoader.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPScriptLoader.cpp new file mode 100644 index 00000000000..ebf29910046 --- /dev/null +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPScriptLoader.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +// This is where scripts' loading functions should be declared: +void AddSC_outdoorpvp_ep(); +void AddSC_outdoorpvp_hp(); +void AddSC_outdoorpvp_na(); +void AddSC_outdoorpvp_si(); +void AddSC_outdoorpvp_tf(); +void AddSC_outdoorpvp_zm(); + +// The name of this function should match: +// void Add${NameOfDirectory}Scripts() +void AddOutdoorPvPScripts() +{ + AddSC_outdoorpvp_ep(); + AddSC_outdoorpvp_hp(); + AddSC_outdoorpvp_na(); + AddSC_outdoorpvp_si(); + AddSC_outdoorpvp_tf(); + AddSC_outdoorpvp_zm(); +} diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPTF.h b/src/server/scripts/OutdoorPvP/OutdoorPvPTF.h index 237fee3283b..ebbccfd63cb 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPTF.h +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPTF.h @@ -132,11 +132,11 @@ class OPvPCapturePointTF : public OPvPCapturePoint public: OPvPCapturePointTF(OutdoorPvP* pvp, OutdoorPvPTF_TowerType type); - bool Update(uint32 diff); + bool Update(uint32 diff) override; - void ChangeState(); + void ChangeState() override; - void FillInitialWorldStates(WorldPacket & data); + void FillInitialWorldStates(WorldPacket & data) override; void UpdateTowerState(); @@ -151,16 +151,16 @@ class OutdoorPvPTF : public OutdoorPvP public: OutdoorPvPTF(); - bool SetupOutdoorPvP(); + bool SetupOutdoorPvP() override; - void HandlePlayerEnterZone(Player* player, uint32 zone); - void HandlePlayerLeaveZone(Player* player, uint32 zone); + void HandlePlayerEnterZone(Player* player, uint32 zone) override; + void HandlePlayerLeaveZone(Player* player, uint32 zone) override; - bool Update(uint32 diff); + bool Update(uint32 diff) override; - void FillInitialWorldStates(WorldPacket &data); + void FillInitialWorldStates(WorldPacket &data) override; - void SendRemoveWorldStates(Player* player); + void SendRemoveWorldStates(Player* player) override; uint32 GetAllianceTowersControlled() const; void SetAllianceTowersControlled(uint32 count); diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPZM.h b/src/server/scripts/OutdoorPvP/OutdoorPvPZM.h index e71fbf79280..352e6f108ea 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPZM.h +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPZM.h @@ -161,9 +161,9 @@ class OPvPCapturePointZM_Beacon : public OPvPCapturePoint public: OPvPCapturePointZM_Beacon(OutdoorPvP* pvp, ZM_BeaconType type); - void ChangeState(); + void ChangeState() override; - void FillInitialWorldStates(WorldPacket & data); + void FillInitialWorldStates(WorldPacket & data) override; void UpdateTowerState(); @@ -218,18 +218,18 @@ class OutdoorPvPZM : public OutdoorPvP public: OutdoorPvPZM(); - bool SetupOutdoorPvP(); + bool SetupOutdoorPvP() override; - void HandlePlayerEnterZone(Player* player, uint32 zone); - void HandlePlayerLeaveZone(Player* player, uint32 zone); + void HandlePlayerEnterZone(Player* player, uint32 zone) override; + void HandlePlayerLeaveZone(Player* player, uint32 zone) override; - bool Update(uint32 diff); + bool Update(uint32 diff) override; - void FillInitialWorldStates(WorldPacket &data); + void FillInitialWorldStates(WorldPacket &data) override; - void SendRemoveWorldStates(Player* player); + void SendRemoveWorldStates(Player* player) override; - void HandleKillImpl(Player* player, Unit* killed); + void HandleKillImpl(Player* player, Unit* killed) override; uint32 GetAllianceTowersControlled() const; void SetAllianceTowersControlled(uint32 count); diff --git a/src/server/scripts/Outland/CMakeLists.txt b/src/server/scripts/Outland/CMakeLists.txt deleted file mode 100644 index 55b0452fb0b..00000000000 --- a/src/server/scripts/Outland/CMakeLists.txt +++ /dev/null @@ -1,128 +0,0 @@ -# Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> -# -# This file is free software; as a special exception the author gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -set(scripts_STAT_SRCS - ${scripts_STAT_SRCS} - Outland/zone_nagrand.cpp - Outland/HellfireCitadel/MagtheridonsLair/magtheridons_lair.h - Outland/HellfireCitadel/MagtheridonsLair/instance_magtheridons_lair.cpp - Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp - Outland/HellfireCitadel/HellfireRamparts/instance_hellfire_ramparts.cpp - Outland/HellfireCitadel/HellfireRamparts/boss_omor_the_unscarred.cpp - Outland/HellfireCitadel/HellfireRamparts/boss_watchkeeper_gargolmar.cpp - Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp - Outland/HellfireCitadel/HellfireRamparts/hellfire_ramparts.h - Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp - Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp - Outland/HellfireCitadel/BloodFurnace/blood_furnace.h - Outland/HellfireCitadel/BloodFurnace/instance_blood_furnace.cpp - Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp - Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h - Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp - Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp - Outland/HellfireCitadel/ShatteredHalls/shattered_halls.cpp - Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp - Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp - Outland/CoilfangReservoir/SteamVault/boss_mekgineer_steamrigger.cpp - Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp - Outland/CoilfangReservoir/SteamVault/boss_hydromancer_thespia.cpp - Outland/CoilfangReservoir/SteamVault/boss_warlord_kalithresh.cpp - Outland/CoilfangReservoir/SteamVault/steam_vault.h - Outland/CoilfangReservoir/SerpentShrine/boss_hydross_the_unstable.cpp - Outland/CoilfangReservoir/SerpentShrine/boss_fathomlord_karathress.cpp - Outland/CoilfangReservoir/SerpentShrine/instance_serpent_shrine.cpp - Outland/CoilfangReservoir/SerpentShrine/serpent_shrine.h - Outland/CoilfangReservoir/SerpentShrine/boss_lady_vashj.cpp - Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp - Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp - Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp - Outland/CoilfangReservoir/TheSlavePens/instance_the_slave_pens.cpp - Outland/CoilfangReservoir/TheSlavePens/the_slave_pens.h - Outland/CoilfangReservoir/TheSlavePens/boss_mennu_the_betrayer.cpp - Outland/CoilfangReservoir/TheSlavePens/boss_rokmar_the_crackler.cpp - Outland/CoilfangReservoir/TheSlavePens/boss_quagmirran.cpp - Outland/CoilfangReservoir/TheUnderbog/instance_the_underbog.cpp - Outland/CoilfangReservoir/TheUnderbog/boss_hungarfen.cpp - Outland/CoilfangReservoir/TheUnderbog/boss_the_black_stalker.cpp - Outland/zone_shattrath_city.cpp - Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp - Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp - Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp - Outland/TempestKeep/Mechanar/mechanar.h - Outland/TempestKeep/Mechanar/boss_gatewatcher_gyrokill.cpp - Outland/TempestKeep/Mechanar/instance_mechanar.cpp - Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp - Outland/TempestKeep/Eye/the_eye.h - Outland/TempestKeep/Eye/instance_the_eye.cpp - Outland/TempestKeep/Eye/boss_void_reaver.cpp - Outland/TempestKeep/Eye/boss_astromancer.cpp - Outland/TempestKeep/Eye/boss_alar.cpp - Outland/TempestKeep/Eye/boss_kaelthas.cpp - Outland/TempestKeep/Eye/the_eye.cpp - Outland/TempestKeep/botanica/the_botanica.h - Outland/TempestKeep/botanica/instance_the_botanica.cpp - Outland/TempestKeep/botanica/boss_commander_sarannis.cpp - Outland/TempestKeep/botanica/boss_thorngrin_the_tender.cpp - Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp - Outland/TempestKeep/botanica/boss_warp_splinter.cpp - Outland/TempestKeep/botanica/boss_laj.cpp - Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp - Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp - Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp - Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp - Outland/TempestKeep/arcatraz/instance_arcatraz.cpp - Outland/TempestKeep/arcatraz/arcatraz.h - Outland/TempestKeep/arcatraz/arcatraz.cpp - Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp - Outland/Auchindoun/AuchenaiCrypts/boss_exarch_maladaar.cpp - Outland/Auchindoun/AuchenaiCrypts/instance_auchenai_crypts.cpp - Outland/Auchindoun/AuchenaiCrypts/auchenai_crypts.h - Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp - Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp - Outland/Auchindoun/ManaTombs/instance_mana_tombs.cpp - Outland/Auchindoun/ManaTombs/mana_tombs.h - Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp - Outland/Auchindoun/SethekkHalls/boss_talon_king_ikiss.cpp - Outland/Auchindoun/SethekkHalls/boss_anzu.cpp - Outland/Auchindoun/SethekkHalls/instance_sethekk_halls.cpp - Outland/Auchindoun/SethekkHalls/sethekk_halls.h - Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp - Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp - Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp - Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp - Outland/Auchindoun/ShadowLabyrinth/instance_shadow_labyrinth.cpp - Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.h - Outland/boss_doomwalker.cpp - Outland/zone_terokkar_forest.cpp - Outland/zone_hellfire_peninsula.cpp - Outland/boss_doomlord_kazzak.cpp - Outland/BlackTemple/boss_teron_gorefiend.cpp - Outland/BlackTemple/black_temple.h - Outland/BlackTemple/illidari_council.cpp - Outland/BlackTemple/boss_shade_of_akama.cpp - Outland/BlackTemple/boss_supremus.cpp - Outland/BlackTemple/black_temple.cpp - Outland/BlackTemple/boss_mother_shahraz.cpp - Outland/BlackTemple/instance_black_temple.cpp - Outland/BlackTemple/boss_reliquary_of_souls.cpp - Outland/BlackTemple/boss_warlord_najentus.cpp - Outland/BlackTemple/boss_gurtogg_bloodboil.cpp - Outland/BlackTemple/boss_illidan.cpp - Outland/zone_shadowmoon_valley.cpp - Outland/zone_blades_edge_mountains.cpp - Outland/GruulsLair/boss_high_king_maulgar.cpp - Outland/GruulsLair/boss_gruul.cpp - Outland/GruulsLair/gruuls_lair.h - Outland/GruulsLair/instance_gruuls_lair.cpp - Outland/zone_netherstorm.cpp - Outland/zone_zangarmarsh.cpp -) - -message(" -> Prepared: Outland") diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp index 102d567e810..56010c09897 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp @@ -289,6 +289,7 @@ class boss_alar : public CreatureScript me->SetPosition(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0.0f); me->StopMoving(); WaitEvent = WE_LAND; + return; } else { diff --git a/src/server/scripts/Outland/outland_script_loader.cpp b/src/server/scripts/Outland/outland_script_loader.cpp new file mode 100644 index 00000000000..91ba4e5689f --- /dev/null +++ b/src/server/scripts/Outland/outland_script_loader.cpp @@ -0,0 +1,256 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +// This is where scripts' loading functions should be declared: +// Auchindoun - Auchenai Crypts +void AddSC_boss_shirrak_the_dead_watcher(); +void AddSC_boss_exarch_maladaar(); +void AddSC_instance_auchenai_crypts(); + +// Auchindoun - Mana Tombs +void AddSC_boss_pandemonius(); +void AddSC_boss_nexusprince_shaffar(); +void AddSC_instance_mana_tombs(); + +// Auchindoun - Sekketh Halls +void AddSC_boss_darkweaver_syth(); +void AddSC_boss_talon_king_ikiss(); +void AddSC_boss_anzu(); +void AddSC_instance_sethekk_halls(); + +// Auchindoun - Shadow Labyrinth +void AddSC_boss_ambassador_hellmaw(); +void AddSC_boss_blackheart_the_inciter(); +void AddSC_boss_grandmaster_vorpil(); +void AddSC_boss_murmur(); +void AddSC_instance_shadow_labyrinth(); + +// Black Temple +void AddSC_black_temple(); +void AddSC_boss_illidan(); +void AddSC_boss_shade_of_akama(); +void AddSC_boss_supremus(); +void AddSC_boss_gurtogg_bloodboil(); +void AddSC_boss_mother_shahraz(); +void AddSC_boss_reliquary_of_souls(); +void AddSC_boss_teron_gorefiend(); +void AddSC_boss_najentus(); +void AddSC_boss_illidari_council(); +void AddSC_instance_black_temple(); + +// Coilfang Reservoir - Serpent Shrine Cavern +void AddSC_boss_fathomlord_karathress(); +void AddSC_boss_hydross_the_unstable(); +void AddSC_boss_lady_vashj(); +void AddSC_boss_leotheras_the_blind(); +void AddSC_boss_morogrim_tidewalker(); +void AddSC_instance_serpentshrine_cavern(); +void AddSC_boss_the_lurker_below(); + +// Coilfang Reservoir - The Steam Vault +void AddSC_boss_hydromancer_thespia(); +void AddSC_boss_mekgineer_steamrigger(); +void AddSC_boss_warlord_kalithresh(); +void AddSC_instance_steam_vault(); + +// Coilfang Reservoir - The Slave Pens +void AddSC_instance_the_slave_pens(); +void AddSC_boss_mennu_the_betrayer(); +void AddSC_boss_rokmar_the_crackler(); +void AddSC_boss_quagmirran(); + +// Coilfang Reservoir - The Underbog +void AddSC_instance_the_underbog(); +void AddSC_boss_hungarfen(); +void AddSC_boss_the_black_stalker(); + +// Gruul's Lair +void AddSC_boss_gruul(); +void AddSC_boss_high_king_maulgar(); +void AddSC_instance_gruuls_lair(); +void AddSC_boss_broggok(); //HC Blood Furnace +void AddSC_boss_kelidan_the_breaker(); +void AddSC_boss_the_maker(); +void AddSC_instance_blood_furnace(); +void AddSC_boss_magtheridon(); //HC Magtheridon's Lair +void AddSC_instance_magtheridons_lair(); +void AddSC_boss_grand_warlock_nethekurse(); //HC Shattered Halls +void AddSC_boss_warbringer_omrogg(); +void AddSC_boss_warchief_kargath_bladefist(); +void AddSC_shattered_halls(); +void AddSC_instance_shattered_halls(); +void AddSC_boss_watchkeeper_gargolmar(); //HC Ramparts +void AddSC_boss_omor_the_unscarred(); +void AddSC_boss_vazruden_the_herald(); +void AddSC_instance_ramparts(); +void AddSC_arcatraz(); //TK Arcatraz +void AddSC_boss_zereketh_the_unbound(); +void AddSC_boss_dalliah_the_doomsayer(); +void AddSC_boss_wrath_scryer_soccothrates(); +void AddSC_boss_harbinger_skyriss(); +void AddSC_instance_arcatraz(); +void AddSC_boss_high_botanist_freywinn(); //TK Botanica +void AddSC_boss_laj(); +void AddSC_boss_warp_splinter(); +void AddSC_boss_thorngrin_the_tender(); +void AddSC_boss_commander_sarannis(); +void AddSC_instance_the_botanica(); +void AddSC_boss_alar(); //TK The Eye +void AddSC_boss_kaelthas(); +void AddSC_boss_void_reaver(); +void AddSC_boss_high_astromancer_solarian(); +void AddSC_instance_the_eye(); +void AddSC_the_eye(); +void AddSC_boss_gatewatcher_iron_hand(); //TK The Mechanar +void AddSC_boss_gatewatcher_gyrokill(); +void AddSC_boss_nethermancer_sepethrea(); +void AddSC_boss_pathaleon_the_calculator(); +void AddSC_boss_mechano_lord_capacitus(); +void AddSC_instance_mechanar(); + +void AddSC_blades_edge_mountains(); +void AddSC_boss_doomlordkazzak(); +void AddSC_boss_doomwalker(); +void AddSC_hellfire_peninsula(); +void AddSC_nagrand(); +void AddSC_netherstorm(); +void AddSC_shadowmoon_valley(); +void AddSC_shattrath_city(); +void AddSC_terokkar_forest(); +void AddSC_zangarmarsh(); + +// The name of this function should match: +// void Add${NameOfDirectory}Scripts() +void AddOutlandScripts() +{ + // Auchindoun - Auchenai Crypts + AddSC_boss_shirrak_the_dead_watcher(); + AddSC_boss_exarch_maladaar(); + AddSC_instance_auchenai_crypts(); + + // Auchindoun - Mana Tombs + AddSC_boss_pandemonius(); + AddSC_boss_nexusprince_shaffar(); + AddSC_instance_mana_tombs(); + + // Auchindoun - Sekketh Halls + AddSC_boss_darkweaver_syth(); + AddSC_boss_talon_king_ikiss(); + AddSC_boss_anzu(); + AddSC_instance_sethekk_halls(); + + // Auchindoun - Shadow Labyrinth + AddSC_boss_ambassador_hellmaw(); + AddSC_boss_blackheart_the_inciter(); + AddSC_boss_grandmaster_vorpil(); + AddSC_boss_murmur(); + AddSC_instance_shadow_labyrinth(); + + // Black Temple + AddSC_black_temple(); + AddSC_boss_illidan(); + AddSC_boss_shade_of_akama(); + AddSC_boss_supremus(); + AddSC_boss_gurtogg_bloodboil(); + AddSC_boss_mother_shahraz(); + AddSC_boss_reliquary_of_souls(); + AddSC_boss_teron_gorefiend(); + AddSC_boss_najentus(); + AddSC_boss_illidari_council(); + AddSC_instance_black_temple(); + + // Coilfang Reservoir - Serpent Shrine Cavern + AddSC_boss_fathomlord_karathress(); + AddSC_boss_hydross_the_unstable(); + AddSC_boss_lady_vashj(); + AddSC_boss_leotheras_the_blind(); + AddSC_boss_morogrim_tidewalker(); + AddSC_instance_serpentshrine_cavern(); + AddSC_boss_the_lurker_below(); + + // Coilfang Reservoir - The Steam Vault + AddSC_instance_steam_vault(); + AddSC_boss_hydromancer_thespia(); + AddSC_boss_mekgineer_steamrigger(); + AddSC_boss_warlord_kalithresh(); + + // Coilfang Reservoir - The Slave Pens + AddSC_instance_the_slave_pens(); + AddSC_boss_mennu_the_betrayer(); + AddSC_boss_rokmar_the_crackler(); + AddSC_boss_quagmirran(); + + // Coilfang Reservoir - The Underbog + AddSC_instance_the_underbog(); + AddSC_boss_hungarfen(); + AddSC_boss_the_black_stalker(); + + // Gruul's Lair + AddSC_boss_gruul(); + AddSC_boss_high_king_maulgar(); + AddSC_instance_gruuls_lair(); + AddSC_boss_broggok(); //HC Blood Furnace + AddSC_boss_kelidan_the_breaker(); + AddSC_boss_the_maker(); + AddSC_instance_blood_furnace(); + AddSC_boss_magtheridon(); //HC Magtheridon's Lair + AddSC_instance_magtheridons_lair(); + AddSC_boss_grand_warlock_nethekurse(); //HC Shattered Halls + AddSC_boss_warbringer_omrogg(); + AddSC_boss_warchief_kargath_bladefist(); + AddSC_shattered_halls(); + AddSC_instance_shattered_halls(); + AddSC_boss_watchkeeper_gargolmar(); //HC Ramparts + AddSC_boss_omor_the_unscarred(); + AddSC_boss_vazruden_the_herald(); + AddSC_instance_ramparts(); + AddSC_arcatraz(); //TK Arcatraz + AddSC_boss_zereketh_the_unbound(); + AddSC_boss_dalliah_the_doomsayer(); + AddSC_boss_wrath_scryer_soccothrates(); + AddSC_boss_harbinger_skyriss(); + AddSC_instance_arcatraz(); + AddSC_boss_high_botanist_freywinn(); //TK Botanica + AddSC_boss_laj(); + AddSC_boss_warp_splinter(); + AddSC_boss_thorngrin_the_tender(); + AddSC_boss_commander_sarannis(); + AddSC_instance_the_botanica(); + AddSC_boss_alar(); //TK The Eye + AddSC_boss_kaelthas(); + AddSC_boss_void_reaver(); + AddSC_boss_high_astromancer_solarian(); + AddSC_instance_the_eye(); + AddSC_the_eye(); + AddSC_boss_gatewatcher_iron_hand(); //TK The Mechanar + AddSC_boss_gatewatcher_gyrokill(); + AddSC_boss_nethermancer_sepethrea(); + AddSC_boss_pathaleon_the_calculator(); + AddSC_boss_mechano_lord_capacitus(); + AddSC_instance_mechanar(); + + AddSC_blades_edge_mountains(); + AddSC_boss_doomlordkazzak(); + AddSC_boss_doomwalker(); + AddSC_hellfire_peninsula(); + AddSC_nagrand(); + AddSC_netherstorm(); + AddSC_shadowmoon_valley(); + AddSC_shattrath_city(); + AddSC_terokkar_forest(); + AddSC_zangarmarsh(); +} diff --git a/src/server/scripts/Outland/zone_terokkar_forest.cpp b/src/server/scripts/Outland/zone_terokkar_forest.cpp index 06a8af947b7..4b757544d65 100644 --- a/src/server/scripts/Outland/zone_terokkar_forest.cpp +++ b/src/server/scripts/Outland/zone_terokkar_forest.cpp @@ -27,7 +27,6 @@ EndScriptData */ npc_unkor_the_ruthless npc_infested_root_walker npc_rotting_forest_rager -npc_netherweb_victim npc_floon npc_isla_starmane npc_slim @@ -47,13 +46,13 @@ EndContentData */ enum UnkorTheRuthless { - SAY_SUBMIT = 0, - - FACTION_HOSTILE = 45, - FACTION_FRIENDLY = 35, - QUEST_DONTKILLTHEFATONE = 9889, - - SPELL_PULVERIZE = 2676 + SAY_SUBMIT = 0, + REQUIRED_KILL_COUNT = 10, + FACTION_FRIENDLY = 35, + FACTION_HOSTILE = 45, + SPELL_PULVERIZE = 2676, + QUEST_DONTKILLTHEFATONE = 9889, + NPC_BOULDERFIST_INVADER = 18260 }; class npc_unkor_the_ruthless : public CreatureScript @@ -117,7 +116,7 @@ public: Player* groupie = itr->GetSource(); if (groupie && groupie->GetQuestStatus(QUEST_DONTKILLTHEFATONE) == QUEST_STATUS_INCOMPLETE && - groupie->GetReqKillOrCastCurrentCount(QUEST_DONTKILLTHEFATONE, 18260) == 10) + groupie->GetReqKillOrCastCurrentCount(QUEST_DONTKILLTHEFATONE, NPC_BOULDERFIST_INVADER) == REQUIRED_KILL_COUNT) { groupie->AreaExploredOrEventHappens(QUEST_DONTKILLTHEFATONE); if (!CanDoQuest) @@ -126,7 +125,7 @@ public: } } else if (player->GetQuestStatus(QUEST_DONTKILLTHEFATONE) == QUEST_STATUS_INCOMPLETE && - player->GetReqKillOrCastCurrentCount(QUEST_DONTKILLTHEFATONE, 18260) == 10) + player->GetReqKillOrCastCurrentCount(QUEST_DONTKILLTHEFATONE, NPC_BOULDERFIST_INVADER) == REQUIRED_KILL_COUNT) { player->AreaExploredOrEventHappens(QUEST_DONTKILLTHEFATONE); CanDoQuest = true; @@ -171,6 +170,11 @@ public: ## npc_infested_root_walker ######*/ +enum InfestedRootWalker +{ + SPELL_SUMMON_WOOD_MITES = 39130 +}; + class npc_infested_root_walker : public CreatureScript { public: @@ -194,7 +198,7 @@ public: if (me->GetHealth() <= damage) if (rand32() % 100 < 75) //Summon Wood Mites - DoCast(me, 39130, true); + DoCast(me, SPELL_SUMMON_WOOD_MITES, true); } }; }; @@ -202,6 +206,12 @@ public: /*###### ## npc_skywing ######*/ + +enum Skywing +{ + QUEST_SKYWING = 10898 +}; + class npc_skywing : public CreatureScript { public: @@ -226,7 +236,7 @@ public: switch (waypointId) { case 8: - player->AreaExploredOrEventHappens(10898); + player->AreaExploredOrEventHappens(QUEST_SKYWING); break; } } @@ -240,7 +250,7 @@ public: return; Player* player = who->ToPlayer(); - if (player && player->GetQuestStatus(10898) == QUEST_STATUS_INCOMPLETE) + if (player && player->GetQuestStatus(QUEST_SKYWING) == QUEST_STATUS_INCOMPLETE) if (me->IsWithinDistInMap(who, 10.0f)) Start(false, false, who->GetGUID()); } @@ -258,6 +268,11 @@ public: ## npc_rotting_forest_rager ######*/ +enum RottingForestRager +{ + SPELL_SUMMON_LOTS_OF_WOOD_MITES = 39134 +}; + class npc_rotting_forest_rager : public CreatureScript { public: @@ -280,67 +295,8 @@ public: if (done_by->GetTypeId() == TYPEID_PLAYER) if (me->GetHealth() <= damage) if (rand32() % 100 < 75) - //Summon Lots of Wood Mights - DoCast(me, 39134, true); - } - }; -}; - -/*###### -## npc_netherweb_victim -######*/ - -enum NetherwebVictim -{ - QUEST_TARGET = 22459 - //SPELL_FREE_WEBBED = 38950 -}; - -const uint32 netherwebVictims[6] = -{ - 18470, 16805, 21242, 18452, 22482, 21285 -}; - -class npc_netherweb_victim : public CreatureScript -{ -public: - npc_netherweb_victim() : CreatureScript("npc_netherweb_victim") { } - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_netherweb_victimAI(creature); - } - - struct npc_netherweb_victimAI : public ScriptedAI - { - npc_netherweb_victimAI(Creature* creature) : ScriptedAI(creature) { } - - void Reset() override { } - void EnterCombat(Unit* /*who*/) override { } - void MoveInLineOfSight(Unit* /*who*/) override { } - - - void JustDied(Unit* killer) override - { - Player* player = killer->ToPlayer(); - if (!player) - return; - - if (player->GetQuestStatus(10873) == QUEST_STATUS_INCOMPLETE) - { - if (rand32() % 100 < 25) - { - me->SummonCreature(QUEST_TARGET, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); - player->KilledMonsterCredit(QUEST_TARGET); - } - else - me->SummonCreature(netherwebVictims[rand32() % 6], 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); - - if (rand32() % 100 < 75) - me->SummonCreature(netherwebVictims[rand32() % 6], 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); - - me->SummonCreature(netherwebVictims[rand32() % 6], 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 60000); - } + //Summon Lots of Wood Mites + DoCast(me, SPELL_SUMMON_LOTS_OF_WOOD_MITES, true); } }; }; @@ -349,19 +305,22 @@ public: ## npc_floon ######*/ -#define GOSSIP_FLOON1 "You owe Sim'salabim money. Hand them over or die!" -#define GOSSIP_FLOON2 "Hand over the money or die...again!" - enum Floon { - SAY_FLOON_ATTACK = 0, - - SPELL_SILENCE = 6726, - SPELL_FROSTBOLT = 9672, - SPELL_FROST_NOVA = 11831, - - FACTION_HOSTILE_FL = 1738, - QUEST_CRACK_SKULLS = 10009 + SAY_FLOON_ATTACK = 0, + OPTION_ID_PAY_UP_OR_DIE = 0, + OPTION_ID_COLLECT_A_DEBT = 0, + FACTION_HOSTILE_FLOON = 1738, + MENU_ID_PAY_UP_OR_DIE = 7731, + MENU_ID_COLLECT_A_DEBT = 7732, + GOSSIP_FLOON_STRANGE_SOUNDS = 9442, + GOSSIP_HE_ALREADY_KILLED_ME = 9443, + + SPELL_SILENCE = 6726, + SPELL_FROSTBOLT = 9672, + SPELL_FROST_NOVA = 11831, + + QUEST_CRACKIN_SOME_SKULLS = 10009 }; class npc_floon : public CreatureScript @@ -374,13 +333,13 @@ public: player->PlayerTalkClass->ClearMenus(); if (action == GOSSIP_ACTION_INFO_DEF) { - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_FLOON2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); - player->SEND_GOSSIP_MENU(9443, creature->GetGUID()); + player->ADD_GOSSIP_ITEM_DB(MENU_ID_PAY_UP_OR_DIE, OPTION_ID_PAY_UP_OR_DIE, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); + player->SEND_GOSSIP_MENU(GOSSIP_HE_ALREADY_KILLED_ME, creature->GetGUID()); } if (action == GOSSIP_ACTION_INFO_DEF+1) { player->CLOSE_GOSSIP_MENU(); - creature->setFaction(FACTION_HOSTILE_FL); + creature->setFaction(FACTION_HOSTILE_FLOON); creature->AI()->Talk(SAY_FLOON_ATTACK, player); creature->AI()->AttackStart(player); } @@ -389,10 +348,10 @@ public: bool OnGossipHello(Player* player, Creature* creature) override { - if (player->GetQuestStatus(QUEST_CRACK_SKULLS) == QUEST_STATUS_INCOMPLETE) - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_FLOON1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); + if (player->GetQuestStatus(QUEST_CRACKIN_SOME_SKULLS) == QUEST_STATUS_INCOMPLETE) + player->ADD_GOSSIP_ITEM_DB(MENU_ID_COLLECT_A_DEBT, OPTION_ID_COLLECT_A_DEBT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); - player->SEND_GOSSIP_MENU(9442, creature->GetGUID()); + player->SEND_GOSSIP_MENU(GOSSIP_FLOON_STRANGE_SOUNDS, creature->GetGUID()); return true; } @@ -463,15 +422,16 @@ public: ######*/ enum IslaStarmaneData { - SAY_PROGRESS_1 = 0, - SAY_PROGRESS_2 = 1, - SAY_PROGRESS_3 = 2, - SAY_PROGRESS_4 = 3, - - QUEST_EFTW_H = 10052, - QUEST_EFTW_A = 10051, - GO_CAGE = 182794, - SPELL_CAT = 32447, + SAY_PROGRESS_1 = 0, + SAY_PROGRESS_2 = 1, + SAY_PROGRESS_3 = 2, + SAY_PROGRESS_4 = 3, + GO_DISTANCE = 10, + FACTION_ESCORTEE = 113, + ESCAPE_FROM_FIREWING_POINT_A = 10051, + ESCAPE_FROM_FIREWING_POINT_H = 10052, + SPELL_TRAVEL_FORM_CAT = 32447, + GO_CAGE = 182794 }; class npc_isla_starmane : public CreatureScript @@ -492,7 +452,7 @@ public: switch (waypointId) { case 0: - if (GameObject* Cage = me->FindNearestGameObject(GO_CAGE, 10)) + if (GameObject* Cage = me->FindNearestGameObject(GO_CAGE, GO_DISTANCE)) Cage->SetGoState(GO_STATE_ACTIVE); break; case 2: @@ -507,16 +467,16 @@ public: case 29: Talk(SAY_PROGRESS_4, player); if (player->GetTeam() == ALLIANCE) - player->GroupEventHappens(QUEST_EFTW_A, me); + player->GroupEventHappens(ESCAPE_FROM_FIREWING_POINT_A, me); else if (player->GetTeam() == HORDE) - player->GroupEventHappens(QUEST_EFTW_H, me); + player->GroupEventHappens(ESCAPE_FROM_FIREWING_POINT_H, me); me->SetInFront(player); break; case 30: me->HandleEmoteCommand(EMOTE_ONESHOT_WAVE); break; case 31: - DoCast(me, SPELL_CAT); + DoCast(me, SPELL_TRAVEL_FORM_CAT); me->SetWalk(false); break; } @@ -532,19 +492,19 @@ public: if (Player* player = GetPlayerForEscort()) { if (player->GetTeam() == ALLIANCE) - player->FailQuest(QUEST_EFTW_A); + player->FailQuest(ESCAPE_FROM_FIREWING_POINT_A); else if (player->GetTeam() == HORDE) - player->FailQuest(QUEST_EFTW_H); + player->FailQuest(ESCAPE_FROM_FIREWING_POINT_H); } } }; bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) override { - if (quest->GetQuestId() == QUEST_EFTW_H || quest->GetQuestId() == QUEST_EFTW_A) + if (quest->GetQuestId() == ESCAPE_FROM_FIREWING_POINT_H || quest->GetQuestId() == ESCAPE_FROM_FIREWING_POINT_A) { ENSURE_AI(npc_escortAI, (creature->AI()))->Start(true, false, player->GetGUID()); - creature->setFaction(113); + creature->setFaction(FACTION_ESCORTEE); } return true; } @@ -558,10 +518,20 @@ public: /*###### ## go_skull_pile ######*/ -#define GOSSIP_S_DARKSCREECHER_AKKARAI "Summon Darkscreecher Akkarai" -#define GOSSIP_S_KARROG "Summon Karrog" -#define GOSSIP_S_GEZZARAK_THE_HUNTRESS "Summon Gezzarak the Huntress" -#define GOSSIP_S_VAKKIZ_THE_WINDRAGER "Summon Vakkiz the Windrager" + +enum SkullPile +{ + OPTION_ID_GEZZARAK_THE_HUNTRESS = 0, + OPTION_ID_DARKSCREECHER_AKKARAI = 1, + OPTION_ID_KARROG = 2, + OPTION_ID_VAKKIZ_THE_WINDRAGER = 3, + GOSSIP_MENU_ID_SKULL_PILE = 8660, + ADVERSARIAL_BLOOD = 11885, + SUMMON_GEZZARAK_THE_HUNTRESS = 40632, + SUMMON_KARROG = 40640, + SUMMON_DARKSCREECHER_AKKARAI = 40642, + SUMMON_VAKKIZ_THE_WINDRAGER = 40644 +}; class go_skull_pile : public GameObjectScript { @@ -580,12 +550,12 @@ public: bool OnGossipHello(Player* player, GameObject* go) override { - if ((player->GetQuestStatus(11885) == QUEST_STATUS_INCOMPLETE) || player->GetQuestRewardStatus(11885)) + if ((player->GetQuestStatus(ADVERSARIAL_BLOOD) == QUEST_STATUS_INCOMPLETE) || player->GetQuestRewardStatus(ADVERSARIAL_BLOOD)) { - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_S_DARKSCREECHER_AKKARAI, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_S_KARROG, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_S_GEZZARAK_THE_HUNTRESS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); - player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_S_VAKKIZ_THE_WINDRAGER, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); + player->ADD_GOSSIP_ITEM_DB(GOSSIP_MENU_ID_SKULL_PILE, OPTION_ID_GEZZARAK_THE_HUNTRESS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + player->ADD_GOSSIP_ITEM_DB(GOSSIP_MENU_ID_SKULL_PILE, OPTION_ID_DARKSCREECHER_AKKARAI, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); + player->ADD_GOSSIP_ITEM_DB(GOSSIP_MENU_ID_SKULL_PILE, OPTION_ID_KARROG, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); + player->ADD_GOSSIP_ITEM_DB(GOSSIP_MENU_ID_SKULL_PILE, OPTION_ID_VAKKIZ_THE_WINDRAGER, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); } player->SEND_GOSSIP_MENU(go->GetGOInfo()->questgiver.gossipID, go->GetGUID()); @@ -597,16 +567,16 @@ public: switch (action) { case GOSSIP_ACTION_INFO_DEF + 1: - player->CastSpell(player, 40642, false); + player->CastSpell(player, SUMMON_GEZZARAK_THE_HUNTRESS, false); break; case GOSSIP_ACTION_INFO_DEF + 2: - player->CastSpell(player, 40640, false); + player->CastSpell(player, SUMMON_DARKSCREECHER_AKKARAI, false); break; case GOSSIP_ACTION_INFO_DEF + 3: - player->CastSpell(player, 40632, false); + player->CastSpell(player, SUMMON_KARROG, false); break; case GOSSIP_ACTION_INFO_DEF + 4: - player->CastSpell(player, 40644, false); + player->CastSpell(player, SUMMON_VAKKIZ_THE_WINDRAGER, false); break; } } @@ -618,7 +588,9 @@ public: enum Slim { - FACTION_CONSORTIUM = 933 + FACTION_CONSORTIUM = 933, + NPC_TEXT_NEITHER_SLIM_NOR_SHADY = 9895, + NPC_TEXT_I_SEE_YOU_ARE_A_FRIEND = 9896 }; class npc_slim : public CreatureScript @@ -640,10 +612,10 @@ public: if (creature->IsVendor() && player->GetReputationRank(FACTION_CONSORTIUM) >= REP_FRIENDLY) { player->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE); - player->SEND_GOSSIP_MENU(9896, creature->GetGUID()); + player->SEND_GOSSIP_MENU(NPC_TEXT_I_SEE_YOU_ARE_A_FRIEND, creature->GetGUID()); } else - player->SEND_GOSSIP_MENU(9895, creature->GetGUID()); + player->SEND_GOSSIP_MENU(NPC_TEXT_NEITHER_SLIM_NOR_SHADY, creature->GetGUID()); return true; } @@ -719,7 +691,6 @@ void AddSC_terokkar_forest() new npc_unkor_the_ruthless(); new npc_infested_root_walker(); new npc_rotting_forest_rager(); - new npc_netherweb_victim(); new npc_floon(); new npc_isla_starmane(); new go_skull_pile(); diff --git a/src/server/scripts/Pet/CMakeLists.txt b/src/server/scripts/Pet/CMakeLists.txt deleted file mode 100644 index 9ca268a9a3f..00000000000 --- a/src/server/scripts/Pet/CMakeLists.txt +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> -# -# This file is free software; as a special exception the author gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -set(scripts_STAT_SRCS - ${scripts_STAT_SRCS} - Pet/pet_dk.cpp - Pet/pet_generic.cpp - Pet/pet_hunter.cpp - Pet/pet_mage.cpp - Pet/pet_priest.cpp - Pet/pet_shaman.cpp -) - -message(" -> Prepared: Pet") diff --git a/src/server/scripts/Pet/pet_script_loader.cpp b/src/server/scripts/Pet/pet_script_loader.cpp new file mode 100644 index 00000000000..c3c0079fd46 --- /dev/null +++ b/src/server/scripts/Pet/pet_script_loader.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +// This is where scripts' loading functions should be declared: +void AddSC_deathknight_pet_scripts(); +void AddSC_generic_pet_scripts(); +void AddSC_hunter_pet_scripts(); +void AddSC_mage_pet_scripts(); +void AddSC_priest_pet_scripts(); +void AddSC_shaman_pet_scripts(); + +// The name of this function should match: +// void Add${NameOfDirectory}Scripts() +void AddPetScripts() +{ + AddSC_deathknight_pet_scripts(); + AddSC_generic_pet_scripts(); + AddSC_hunter_pet_scripts(); + AddSC_mage_pet_scripts(); + AddSC_priest_pet_scripts(); + AddSC_shaman_pet_scripts(); +} diff --git a/src/server/scripts/Spells/CMakeLists.txt b/src/server/scripts/Spells/CMakeLists.txt deleted file mode 100644 index 7434d98cf49..00000000000 --- a/src/server/scripts/Spells/CMakeLists.txt +++ /dev/null @@ -1,30 +0,0 @@ -# Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> -# -# This file is free software; as a special exception the author gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -set(scripts_STAT_SRCS - ${scripts_STAT_SRCS} - Spells/spell_shaman.cpp - Spells/spell_hunter.cpp - Spells/spell_rogue.cpp - Spells/spell_druid.cpp - Spells/spell_dk.cpp - Spells/spell_quest.cpp - Spells/spell_warrior.cpp - Spells/spell_generic.cpp - Spells/spell_warlock.cpp - Spells/spell_priest.cpp - Spells/spell_mage.cpp - Spells/spell_paladin.cpp - Spells/spell_item.cpp - Spells/spell_holiday.cpp - Spells/spell_pet.cpp -) - -message(" -> Prepared: Spells") diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp index 3cea620559a..7c2bb0bfaa5 100644 --- a/src/server/scripts/Spells/spell_dk.cpp +++ b/src/server/scripts/Spells/spell_dk.cpp @@ -22,7 +22,7 @@ */ #include "Player.h" -#include "UnitAI.h" +#include "PlayerAI.h" #include "ScriptMgr.h" #include "SpellScript.h" #include "SpellAuraEffects.h" @@ -1909,7 +1909,7 @@ public: if (!player || player->GetGhoulResurrectGhoulGUID().IsEmpty()) return; - oldAI = player->GetAI(); + oldAI = player->AI(); oldAIState = player->IsAIEnabled; player->SetAI(new player_ghoulAI(player, player->GetGhoulResurrectGhoulGUID())); player->IsAIEnabled = true; @@ -1922,7 +1922,7 @@ public: return; player->IsAIEnabled = oldAIState; - UnitAI* thisAI = player->GetAI(); + PlayerAI* thisAI = player->AI(); player->SetAI(oldAI); delete thisAI; @@ -1943,7 +1943,7 @@ public: AfterEffectRemove += AuraEffectRemoveFn(spell_dk_raise_ally_AuraScript::OnRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); } - UnitAI* oldAI; + PlayerAI* oldAI; bool oldAIState; }; diff --git a/src/server/scripts/Spells/spell_hunter.cpp b/src/server/scripts/Spells/spell_hunter.cpp index abf4c6c1ad8..4d7cc277ff6 100644 --- a/src/server/scripts/Spells/spell_hunter.cpp +++ b/src/server/scripts/Spells/spell_hunter.cpp @@ -40,6 +40,7 @@ enum HunterSpells SPELL_HUNTER_CHIMERA_SHOT_SERPENT = 53353, SPELL_HUNTER_CHIMERA_SHOT_VIPER = 53358, SPELL_HUNTER_CHIMERA_SHOT_SCORPID = 53359, + SPELL_HUNTER_GLYPH_OF_ARCANE_SHOT = 61389, SPELL_HUNTER_GLYPH_OF_ASPECT_OF_THE_VIPER = 56851, SPELL_HUNTER_IMPROVED_MEND_PET = 24406, SPELL_HUNTER_INVIGORATION_TRIGGERED = 53398, @@ -192,8 +193,8 @@ class spell_hun_chimera_shot : public SpellScriptLoader { uint32 spellId = 0; int32 basePoint = 0; - Unit::AuraApplicationMap& Auras = unitTarget->GetAppliedAuras(); - for (Unit::AuraApplicationMap::iterator i = Auras.begin(); i != Auras.end(); ++i) + Unit::AuraApplicationMap const& auras = unitTarget->GetAppliedAuras(); + for (Unit::AuraApplicationMap::const_iterator i = auras.begin(); i != auras.end(); ++i) { Aura* aura = i->second->GetBase(); if (aura->GetCasterGUID() != caster->GetGUID()) @@ -296,6 +297,68 @@ class spell_hun_disengage : public SpellScriptLoader } }; +// 56841 - Glyph of Arcane Shot +class spell_hun_glyph_of_arcane_shot : public SpellScriptLoader +{ + public: + spell_hun_glyph_of_arcane_shot() : SpellScriptLoader("spell_hun_glyph_of_arcane_shot") { } + + class spell_hun_glyph_of_arcane_shot_AuraScript : public AuraScript + { + PrepareAuraScript(spell_hun_glyph_of_arcane_shot_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_HUNTER_GLYPH_OF_ARCANE_SHOT)) + return false; + return true; + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + if (Unit* procTarget = eventInfo.GetProcTarget()) + { + Unit::AuraApplicationMap const& auras = procTarget->GetAppliedAuras(); + for (Unit::AuraApplicationMap::const_iterator i = auras.begin(); i != auras.end(); ++i) + { + Aura const* aura = i->second->GetBase(); + if (aura->GetCasterGUID() != GetTarget()->GetGUID()) + continue; + // Search only Serpent Sting, Viper Sting, Scorpid Sting, Wyvern Sting + if (aura->GetSpellInfo()->SpellFamilyName == SPELLFAMILY_HUNTER + && aura->GetSpellInfo()->SpellFamilyFlags.HasFlag(0xC000, 0x1080)) + return true; + } + } + return false; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + SpellInfo const* procSpell = eventInfo.GetSpellInfo(); + if (!procSpell) + return; + + int32 mana = procSpell->CalcPowerCost(GetTarget(), procSpell->GetSchoolMask()); + ApplyPct(mana, aurEff->GetAmount()); + + GetTarget()->CastCustomSpell(SPELL_HUNTER_GLYPH_OF_ARCANE_SHOT, SPELLVALUE_BASE_POINT0, mana, GetTarget()); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_hun_glyph_of_arcane_shot_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_hun_glyph_of_arcane_shot_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_hun_glyph_of_arcane_shot_AuraScript(); + } +}; + // -19572 - Improved Mend Pet class spell_hun_improved_mend_pet : public SpellScriptLoader { @@ -336,6 +399,7 @@ class spell_hun_improved_mend_pet : public SpellScriptLoader return new spell_hun_improved_mend_pet_AuraScript(); } }; + // 53412 - Invigoration class spell_hun_invigoration : public SpellScriptLoader { @@ -952,6 +1016,7 @@ void AddSC_hunter_spell_scripts() new spell_hun_ascpect_of_the_viper(); new spell_hun_chimera_shot(); new spell_hun_disengage(); + new spell_hun_glyph_of_arcane_shot(); new spell_hun_improved_mend_pet(); new spell_hun_invigoration(); new spell_hun_last_stand_pet(); diff --git a/src/server/scripts/Spells/spell_script_loader.cpp b/src/server/scripts/Spells/spell_script_loader.cpp new file mode 100644 index 00000000000..b2c8d6663fa --- /dev/null +++ b/src/server/scripts/Spells/spell_script_loader.cpp @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +// This is where scripts' loading functions should be declared: +void AddSC_deathknight_spell_scripts(); +void AddSC_druid_spell_scripts(); +void AddSC_generic_spell_scripts(); +void AddSC_hunter_spell_scripts(); +void AddSC_mage_spell_scripts(); +void AddSC_paladin_spell_scripts(); +void AddSC_priest_spell_scripts(); +void AddSC_rogue_spell_scripts(); +void AddSC_shaman_spell_scripts(); +void AddSC_warlock_spell_scripts(); +void AddSC_warrior_spell_scripts(); +void AddSC_quest_spell_scripts(); +void AddSC_item_spell_scripts(); +void AddSC_holiday_spell_scripts(); + +// The name of this function should match: +// void Add${NameOfDirectory}Scripts() +void AddSpellsScripts() +{ + AddSC_deathknight_spell_scripts(); + AddSC_druid_spell_scripts(); + AddSC_generic_spell_scripts(); + AddSC_hunter_spell_scripts(); + AddSC_mage_spell_scripts(); + AddSC_paladin_spell_scripts(); + AddSC_priest_spell_scripts(); + AddSC_rogue_spell_scripts(); + AddSC_shaman_spell_scripts(); + AddSC_warlock_spell_scripts(); + AddSC_warrior_spell_scripts(); + AddSC_quest_spell_scripts(); + AddSC_item_spell_scripts(); + AddSC_holiday_spell_scripts(); +} diff --git a/src/server/scripts/World/CMakeLists.txt b/src/server/scripts/World/CMakeLists.txt deleted file mode 100644 index 17b3f2d8492..00000000000 --- a/src/server/scripts/World/CMakeLists.txt +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> -# -# This file is free software; as a special exception the author gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -file(GLOB_RECURSE sources_World World/*.cpp World/*.h) - -set(scripts_STAT_SRCS - ${scripts_STAT_SRCS} - ${sources_World} -) - -message(" -> Prepared: World") diff --git a/src/server/scripts/World/world_script_loader.cpp b/src/server/scripts/World/world_script_loader.cpp new file mode 100644 index 00000000000..0167024799f --- /dev/null +++ b/src/server/scripts/World/world_script_loader.cpp @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "World.h" + +// This is where scripts' loading functions should be declared: +// world +void AddSC_areatrigger_scripts(); +void AddSC_emerald_dragons(); +void AddSC_generic_creature(); +void AddSC_go_scripts(); +void AddSC_guards(); +void AddSC_item_scripts(); +void AddSC_npc_professions(); +void AddSC_npc_innkeeper(); +void AddSC_npcs_special(); +void AddSC_achievement_scripts(); +void AddSC_action_ip_logger(); +void AddSC_duel_reset(); +// player +void AddSC_chat_log(); +void AddSC_action_ip_logger(); + +// The name of this function should match: +// void Add${NameOfDirectory}Scripts() +void AddWorldScripts() +{ + AddSC_areatrigger_scripts(); + AddSC_emerald_dragons(); + AddSC_generic_creature(); + AddSC_go_scripts(); + AddSC_guards(); + AddSC_item_scripts(); + AddSC_npc_professions(); + AddSC_npc_innkeeper(); + AddSC_npcs_special(); + AddSC_achievement_scripts(); + AddSC_chat_log(); // location: scripts\World\chat_log.cpp + + // FIXME: This should be moved in a script validation hook. + // To avoid duplicate code, we check once /*ONLY*/ if logging is permitted or not. + if (sWorld->getBoolConfig(CONFIG_IP_BASED_ACTION_LOGGING)) + AddSC_action_ip_logger(); // location: scripts\World\action_ip_logger.cpp + AddSC_duel_reset(); +} diff --git a/src/server/shared/CMakeLists.txt b/src/server/shared/CMakeLists.txt index b6e5c8b1c6f..d86da1cda7b 100644 --- a/src/server/shared/CMakeLists.txt +++ b/src/server/shared/CMakeLists.txt @@ -16,9 +16,7 @@ file(GLOB_RECURSE sources_DataStores DataStores/*.cpp DataStores/*.h) file(GLOB_RECURSE sources_Dynamic Dynamic/*.cpp Dynamic/*.h) file(GLOB_RECURSE sources_Networking Networking/*.cpp Networking/*.h) file(GLOB_RECURSE sources_Packets Packets/*.cpp Packets/*.h) -if( WIN32 ) - file(GLOB_RECURSE sources_Service Service/*.cpp Service/*.h) -endif( WIN32 ) +file(GLOB_RECURSE sources_Realm Realm/*.cpp Realm/*.h) file(GLOB sources_localdir *.cpp *.h) # @@ -36,6 +34,7 @@ set(shared_STAT_SRCS ${sources_Dynamic} ${sources_Networking} ${sources_Packets} + ${sources_Realm} ${sources_Utilities} ${sources_Service} ${sources_localdir} @@ -44,6 +43,7 @@ set(shared_STAT_SRCS include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/Dynamic ${CMAKE_CURRENT_SOURCE_DIR}/Networking + ${CMAKE_CURRENT_SOURCE_DIR}/Realm ${CMAKE_SOURCE_DIR}/dep/cppformat ${CMAKE_SOURCE_DIR}/src/common/ ${CMAKE_SOURCE_DIR}/src/common/Debugging diff --git a/src/server/shared/Networking/AsyncAcceptor.h b/src/server/shared/Networking/AsyncAcceptor.h index 260e1c8ea11..0f3fd9a145b 100644 --- a/src/server/shared/Networking/AsyncAcceptor.h +++ b/src/server/shared/Networking/AsyncAcceptor.h @@ -20,34 +20,39 @@ #include "Log.h" #include <boost/asio.hpp> +#include <functional> using boost::asio::ip::tcp; class AsyncAcceptor { public: - typedef void(*ManagerAcceptHandler)(tcp::socket&& newSocket); + typedef void(*AcceptCallback)(tcp::socket&& newSocket, uint32 threadIndex); AsyncAcceptor(boost::asio::io_service& ioService, std::string const& bindIp, uint16 port) : _acceptor(ioService, tcp::endpoint(boost::asio::ip::address::from_string(bindIp), port)), - _socket(ioService) + _socket(ioService), _closed(false), _socketFactory(std::bind(&AsyncAcceptor::DefeaultSocketFactory, this)) { } - template <class T> + template<class T> void AsyncAccept(); - void AsyncAcceptManaged(ManagerAcceptHandler mgrHandler) + template<AcceptCallback acceptCallback> + void AsyncAcceptWithCallback() { - _acceptor.async_accept(_socket, [this, mgrHandler](boost::system::error_code error) + tcp::socket* socket; + uint32 threadIndex; + std::tie(socket, threadIndex) = _socketFactory(); + _acceptor.async_accept(*socket, [this, socket, threadIndex](boost::system::error_code error) { if (!error) { try { - _socket.non_blocking(true); + socket->non_blocking(true); - mgrHandler(std::move(_socket)); + acceptCallback(std::move(*socket), threadIndex); } catch (boost::system::system_error const& err) { @@ -55,13 +60,29 @@ public: } } - AsyncAcceptManaged(mgrHandler); + if (!_closed) + this->AsyncAcceptWithCallback<acceptCallback>(); }); } + void Close() + { + if (_closed.exchange(true)) + return; + + boost::system::error_code err; + _acceptor.close(err); + } + + void SetSocketFactory(std::function<std::pair<tcp::socket*, uint32>()> func) { _socketFactory = func; } + private: + std::pair<tcp::socket*, uint32> DefeaultSocketFactory() { return std::make_pair(&_socket, 0); } + tcp::acceptor _acceptor; tcp::socket _socket; + std::atomic<bool> _closed; + std::function<std::pair<tcp::socket*, uint32>()> _socketFactory; }; template<class T> @@ -83,7 +104,8 @@ void AsyncAcceptor::AsyncAccept() } // lets slap some more this-> on this so we can fix this bug with gcc 4.7.2 throwing internals in yo face - this->AsyncAccept<T>(); + if (!_closed) + this->AsyncAccept<T>(); }); } diff --git a/src/server/shared/Networking/MessageBuffer.h b/src/server/shared/Networking/MessageBuffer.h index 189a56f18b6..d68bee181b1 100644 --- a/src/server/shared/Networking/MessageBuffer.h +++ b/src/server/shared/Networking/MessageBuffer.h @@ -105,7 +105,7 @@ public: return std::move(_storage); } - MessageBuffer& operator=(MessageBuffer& right) + MessageBuffer& operator=(MessageBuffer const& right) { if (this != &right) { diff --git a/src/server/shared/Networking/NetworkThread.h b/src/server/shared/Networking/NetworkThread.h index ac216838bce..be0e9f10176 100644 --- a/src/server/shared/Networking/NetworkThread.h +++ b/src/server/shared/Networking/NetworkThread.h @@ -22,6 +22,8 @@ #include "Errors.h" #include "Log.h" #include "Timer.h" +#include <boost/asio/ip/tcp.hpp> +#include <boost/asio/deadline_timer.hpp> #include <atomic> #include <chrono> #include <memory> @@ -29,11 +31,14 @@ #include <set> #include <thread> +using boost::asio::ip::tcp; + template<class SocketType> class NetworkThread { public: - NetworkThread() : _connections(0), _stopped(false), _thread(nullptr) + NetworkThread() : _connections(0), _stopped(false), _thread(nullptr), + _acceptSocket(_io_service), _updateTimer(_io_service) { } @@ -50,6 +55,7 @@ public: void Stop() { _stopped = true; + _io_service.stop(); } bool Start() @@ -80,10 +86,12 @@ public: std::lock_guard<std::mutex> lock(_newSocketsLock); ++_connections; - _newSockets.insert(sock); + _newSockets.push_back(sock); SocketAdded(sock); } + tcp::socket* GetSocketForAccept() { return &_acceptSocket; } + protected: virtual void SocketAdded(std::shared_ptr<SocketType> /*sock*/) { } virtual void SocketRemoved(std::shared_ptr<SocketType> /*sock*/) { } @@ -95,16 +103,15 @@ protected: if (_newSockets.empty()) return; - for (typename SocketSet::const_iterator i = _newSockets.begin(); i != _newSockets.end(); ++i) + for (std::shared_ptr<SocketType> sock : _newSockets) { - if (!(*i)->IsOpen()) + if (!sock->IsOpen()) { - SocketRemoved(*i); - + SocketRemoved(sock); --_connections; } else - _Sockets.insert(*i); + _sockets.push_back(sock); } _newSockets.clear(); @@ -114,53 +121,58 @@ protected: { TC_LOG_DEBUG("misc", "Network Thread Starting"); - typename SocketSet::iterator i, t; + _updateTimer.expires_from_now(boost::posix_time::milliseconds(10)); + _updateTimer.async_wait(std::bind(&NetworkThread<SocketType>::Update, this)); + _io_service.run(); - uint32 sleepTime = 10; - uint32 tickStart = 0, diff = 0; - while (!_stopped) - { - std::this_thread::sleep_for(std::chrono::milliseconds(sleepTime)); + TC_LOG_DEBUG("misc", "Network Thread exits"); + _newSockets.clear(); + _sockets.clear(); + } + + void Update() + { + if (_stopped) + return; - tickStart = getMSTime(); + _updateTimer.expires_from_now(boost::posix_time::milliseconds(10)); + _updateTimer.async_wait(std::bind(&NetworkThread<SocketType>::Update, this)); - AddNewSockets(); + AddNewSockets(); - for (i = _Sockets.begin(); i != _Sockets.end();) + _sockets.erase(std::remove_if(_sockets.begin(), _sockets.end(), [this](std::shared_ptr<SocketType> sock) + { + if (!sock->Update()) { - if (!(*i)->Update()) - { - if ((*i)->IsOpen()) - (*i)->CloseSocket(); - - SocketRemoved(*i); - - --_connections; - _Sockets.erase(i++); - } - else - ++i; - } + if (sock->IsOpen()) + sock->CloseSocket(); - diff = GetMSTimeDiffToNow(tickStart); - sleepTime = diff > 10 ? 0 : 10 - diff; - } + this->SocketRemoved(sock); - TC_LOG_DEBUG("misc", "Network Thread exits"); + --this->_connections; + return true; + } + + return false; + }), _sockets.end()); } private: - typedef std::set<std::shared_ptr<SocketType> > SocketSet; + typedef std::vector<std::shared_ptr<SocketType>> SocketContainer; std::atomic<int32> _connections; std::atomic<bool> _stopped; std::thread* _thread; - SocketSet _Sockets; + SocketContainer _sockets; std::mutex _newSocketsLock; - SocketSet _newSockets; + SocketContainer _newSockets; + + boost::asio::io_service _io_service; + tcp::socket _acceptSocket; + boost::asio::deadline_timer _updateTimer; }; #endif // NetworkThread_h__ diff --git a/src/server/shared/Networking/Socket.h b/src/server/shared/Networking/Socket.h index a2f57b5029e..0674ede57d8 100644 --- a/src/server/shared/Networking/Socket.h +++ b/src/server/shared/Networking/Socket.h @@ -21,15 +21,11 @@ #include "MessageBuffer.h" #include "Log.h" #include <atomic> -#include <vector> -#include <mutex> #include <queue> #include <memory> #include <functional> #include <type_traits> #include <boost/asio/ip/tcp.hpp> -#include <boost/asio/write.hpp> -#include <boost/asio/read.hpp> using boost::asio::ip::tcp; @@ -59,18 +55,14 @@ public: virtual bool Update() { - if (!IsOpen()) + if (_closed) return false; #ifndef TC_SOCKET_USE_IOCP - std::unique_lock<std::mutex> guard(_writeLock); - if (!guard) - return true; - - if (_isWritingAsync || (!_writeBuffer.GetActiveSize() && _writeQueue.empty())) + if (_isWritingAsync || (_writeQueue.empty() && !_closing)) return true; - for (; WriteHandler(guard);) + for (; HandleQueue();) ; #endif @@ -98,14 +90,23 @@ public: std::bind(&Socket<T>::ReadHandlerInternal, this->shared_from_this(), std::placeholders::_1, std::placeholders::_2)); } - void QueuePacket(MessageBuffer&& buffer, std::unique_lock<std::mutex>& guard) + void AsyncReadWithCallback(void (T::*callback)(boost::system::error_code, std::size_t)) + { + if (!IsOpen()) + return; + + _readBuffer.Normalize(); + _readBuffer.EnsureFreeSpace(); + _socket.async_read_some(boost::asio::buffer(_readBuffer.GetWritePointer(), _readBuffer.GetRemainingSpace()), + std::bind(callback, this->shared_from_this(), std::placeholders::_1, std::placeholders::_2)); + } + + void QueuePacket(MessageBuffer&& buffer) { _writeQueue.push(std::move(buffer)); #ifdef TC_SOCKET_USE_IOCP - AsyncProcessQueue(guard); -#else - (void)guard; + AsyncProcessQueue(); #endif } @@ -135,7 +136,7 @@ protected: virtual void ReadHandler() = 0; - bool AsyncProcessQueue(std::unique_lock<std::mutex>&) + bool AsyncProcessQueue() { if (_isWritingAsync) return false; @@ -154,13 +155,14 @@ protected: return false; } - std::mutex _writeLock; - std::queue<MessageBuffer> _writeQueue; -#ifndef TC_SOCKET_USE_IOCP - MessageBuffer _writeBuffer; -#endif - - boost::asio::io_service& io_service() { return _socket.get_io_service(); } + void SetNoDelay(bool enable) + { + boost::system::error_code err; + _socket.set_option(tcp::no_delay(enable), err); + if (err) + TC_LOG_DEBUG("network", "Socket::SetNoDelay: failed to set_option(boost::asio::ip::tcp::no_delay) for %s - %d (%s)", + GetRemoteIpAddress().to_string().c_str(), err.value(), err.message().c_str()); + } private: void ReadHandlerInternal(boost::system::error_code error, size_t transferredBytes) @@ -181,15 +183,13 @@ private: { if (!error) { - std::unique_lock<std::mutex> deleteGuard(_writeLock); - _isWritingAsync = false; _writeQueue.front().ReadCompleted(transferedBytes); if (!_writeQueue.front().GetActiveSize()) _writeQueue.pop(); if (!_writeQueue.empty()) - AsyncProcessQueue(deleteGuard); + AsyncProcessQueue(); else if (_closing) CloseSocket(); } @@ -201,47 +201,11 @@ private: void WriteHandlerWrapper(boost::system::error_code /*error*/, std::size_t /*transferedBytes*/) { - std::unique_lock<std::mutex> guard(_writeLock); _isWritingAsync = false; - WriteHandler(guard); + HandleQueue(); } - bool WriteHandler(std::unique_lock<std::mutex>& guard) - { - if (!IsOpen()) - return false; - - std::size_t bytesToSend = _writeBuffer.GetActiveSize(); - - if (bytesToSend == 0) - return HandleQueue(guard); - - boost::system::error_code error; - std::size_t bytesWritten = _socket.write_some(boost::asio::buffer(_writeBuffer.GetReadPointer(), bytesToSend), error); - - if (error) - { - if (error == boost::asio::error::would_block || error == boost::asio::error::try_again) - return AsyncProcessQueue(guard); - - return false; - } - else if (bytesWritten == 0) - return false; - else if (bytesWritten < bytesToSend) - { - _writeBuffer.ReadCompleted(bytesWritten); - _writeBuffer.Normalize(); - return AsyncProcessQueue(guard); - } - - // now bytesWritten == bytesToSend - _writeBuffer.Reset(); - - return HandleQueue(guard); - } - - bool HandleQueue(std::unique_lock<std::mutex>& guard) + bool HandleQueue() { if (_writeQueue.empty()) return false; @@ -256,23 +220,29 @@ private: if (error) { if (error == boost::asio::error::would_block || error == boost::asio::error::try_again) - return AsyncProcessQueue(guard); + return AsyncProcessQueue(); _writeQueue.pop(); + if (_closing && _writeQueue.empty()) + CloseSocket(); return false; } else if (bytesSent == 0) { _writeQueue.pop(); + if (_closing && _writeQueue.empty()) + CloseSocket(); return false; } else if (bytesSent < bytesToSend) // now n > 0 { queuedMessage.ReadCompleted(bytesSent); - return AsyncProcessQueue(guard); + return AsyncProcessQueue(); } _writeQueue.pop(); + if (_closing && _writeQueue.empty()) + CloseSocket(); return !_writeQueue.empty(); } @@ -284,6 +254,7 @@ private: uint16 _remotePort; MessageBuffer _readBuffer; + std::queue<MessageBuffer> _writeQueue; std::atomic<bool> _closed; std::atomic<bool> _closing; diff --git a/src/server/shared/Networking/SocketMgr.h b/src/server/shared/Networking/SocketMgr.h index ce5bc2d8fc2..b14aac4ca47 100644 --- a/src/server/shared/Networking/SocketMgr.h +++ b/src/server/shared/Networking/SocketMgr.h @@ -33,7 +33,7 @@ class SocketMgr public: virtual ~SocketMgr() { - delete[] _threads; + ASSERT(!_threads && !_acceptor && !_threadCount, "StopNetwork must be called prior to SocketMgr destruction"); } virtual bool StartNetwork(boost::asio::io_service& service, std::string const& bindIp, uint16 port) @@ -68,11 +68,19 @@ public: virtual void StopNetwork() { + _acceptor->Close(); + if (_threadCount != 0) for (int32 i = 0; i < _threadCount; ++i) _threads[i].Stop(); Wait(); + + delete _acceptor; + _acceptor = nullptr; + delete[] _threads; + _threads = nullptr; + _threadCount = 0; } void Wait() @@ -82,20 +90,14 @@ public: _threads[i].Wait(); } - virtual void OnSocketOpen(tcp::socket&& sock) + virtual void OnSocketOpen(tcp::socket&& sock, uint32 threadIndex) { - size_t min = 0; - - for (int32 i = 1; i < _threadCount; ++i) - if (_threads[i].GetConnectionCount() < _threads[min].GetConnectionCount()) - min = i; - try { std::shared_ptr<SocketType> newSocket = std::make_shared<SocketType>(std::move(sock)); newSocket->Start(); - _threads[min].AddSocket(newSocket); + _threads[threadIndex].AddSocket(newSocket); } catch (boost::system::system_error const& err) { @@ -105,6 +107,23 @@ public: int32 GetNetworkThreadCount() const { return _threadCount; } + uint32 SelectThreadWithMinConnections() const + { + uint32 min = 0; + + for (int32 i = 1; i < _threadCount; ++i) + if (_threads[i].GetConnectionCount() < _threads[min].GetConnectionCount()) + min = i; + + return min; + } + + std::pair<tcp::socket*, uint32> GetSocketForAccept() + { + uint32 threadIndex = SelectThreadWithMinConnections(); + return std::make_pair(_threads[threadIndex].GetSocketForAccept(), threadIndex); + } + protected: SocketMgr() : _acceptor(nullptr), _threads(nullptr), _threadCount(1) { diff --git a/src/server/shared/Packets/ByteBuffer.h b/src/server/shared/Packets/ByteBuffer.h index 5ebe5258a44..2aff6b5aabf 100644 --- a/src/server/shared/Packets/ByteBuffer.h +++ b/src/server/shared/Packets/ByteBuffer.h @@ -33,7 +33,6 @@ #include <time.h> #include <cmath> #include <type_traits> -#include <boost/asio/buffer.hpp> class MessageBuffer; @@ -628,15 +627,4 @@ inline void ByteBuffer::read_skip<std::string>() read_skip<char*>(); } -namespace boost -{ - namespace asio - { - inline const_buffers_1 buffer(ByteBuffer const& packet) - { - return buffer(packet.contents(), packet.size()); - } - } -} - #endif diff --git a/src/server/shared/Realm/Realm.cpp b/src/server/shared/Realm/Realm.cpp new file mode 100644 index 00000000000..0c8f4d1d492 --- /dev/null +++ b/src/server/shared/Realm/Realm.cpp @@ -0,0 +1,18 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "Realm.h" diff --git a/src/server/shared/Realm/Realm.h b/src/server/shared/Realm/Realm.h new file mode 100644 index 00000000000..83a344dd817 --- /dev/null +++ b/src/server/shared/Realm/Realm.h @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef Realm_h__ +#define Realm_h__ + +#include "Common.h" +#include <boost/asio/ip/address.hpp> +#include <boost/asio/ip/tcp.hpp> + +using namespace boost::asio; + +enum RealmFlags +{ + REALM_FLAG_NONE = 0x00, + REALM_FLAG_VERSION_MISMATCH = 0x01, + REALM_FLAG_OFFLINE = 0x02, + REALM_FLAG_SPECIFYBUILD = 0x04, + REALM_FLAG_UNK1 = 0x08, + REALM_FLAG_UNK2 = 0x10, + REALM_FLAG_RECOMMENDED = 0x20, + REALM_FLAG_NEW = 0x40, + REALM_FLAG_FULL = 0x80 +}; + +struct RealmHandle +{ + RealmHandle() : Realm(0) { } + RealmHandle(uint32 index) : Realm(index) { } + + uint32 Realm; // primary key in `realmlist` table + + bool operator<(RealmHandle const& r) const + { + return Realm < r.Realm; + } +}; + +/// Type of server, this is values from second column of Cfg_Configs.dbc +enum RealmType +{ + REALM_TYPE_NORMAL = 0, + REALM_TYPE_PVP = 1, + REALM_TYPE_NORMAL2 = 4, + REALM_TYPE_RP = 6, + REALM_TYPE_RPPVP = 8, + + MAX_CLIENT_REALM_TYPE = 14, + + REALM_TYPE_FFA_PVP = 16 // custom, free for all pvp mode like arena PvP in all zones except rest activated places and sanctuaries + // replaced by REALM_PVP in realm list +}; + +// Storage object for a realm +struct Realm +{ + RealmHandle Id; + uint32 Build; + ip::address ExternalAddress; + ip::address LocalAddress; + ip::address LocalSubnetMask; + uint16 Port; + std::string Name; + uint8 Type; // icon + RealmFlags Flags; + uint8 Timezone; + AccountTypes AllowedSecurityLevel; + float PopulationLevel; +}; + +#endif // Realm_h__ diff --git a/src/server/worldserver/CMakeLists.txt b/src/server/worldserver/CMakeLists.txt index 535383ac605..f45dae05c24 100644 --- a/src/server/worldserver/CMakeLists.txt +++ b/src/server/worldserver/CMakeLists.txt @@ -29,7 +29,7 @@ set(worldserver_SRCS if( WIN32 ) set(worldserver_SRCS ${worldserver_SRCS} - ${sources_windows_Debugging} + ${sources_windows} ) if ( MSVC ) set(worldserver_SRCS @@ -58,10 +58,12 @@ include_directories( ${CMAKE_SOURCE_DIR}/src/common/Logging ${CMAKE_SOURCE_DIR}/src/common/Threading ${CMAKE_SOURCE_DIR}/src/common/Utilities + ${CMAKE_SOURCE_DIR}/src/common/Platform ${CMAKE_SOURCE_DIR}/src/server/authserver/Realms ${CMAKE_SOURCE_DIR}/src/server/database/ ${CMAKE_SOURCE_DIR}/src/server/database/Database ${CMAKE_SOURCE_DIR}/src/server/database/Logging + ${CMAKE_SOURCE_DIR}/src/server/database/Updater ${CMAKE_SOURCE_DIR}/src/server/game ${CMAKE_SOURCE_DIR}/src/server/game/Accounts ${CMAKE_SOURCE_DIR}/src/server/game/Addons @@ -131,14 +133,14 @@ set_target_properties(worldserver PROPERTIES LINK_FLAGS "${worldserver_LINK_FLAG target_link_libraries(worldserver game - common + scripts shared database - scripts + common g3dlib gsoap Detour - format + cppformat ${JEMALLOC_LIBRARY} ${READLINE_LIBRARY} ${TERMCAP_LIBRARY} diff --git a/src/server/worldserver/Main.cpp b/src/server/worldserver/Main.cpp index 53c5f250851..8ae8e394ff6 100644 --- a/src/server/worldserver/Main.cpp +++ b/src/server/worldserver/Main.cpp @@ -34,7 +34,6 @@ #include "OpenSSLCrypto.h" #include "ProcessPriority.h" #include "BigNumber.h" -#include "RealmList.h" #include "World.h" #include "MapManager.h" #include "InstanceSaveMgr.h" @@ -47,6 +46,7 @@ #include "GitRevision.h" #include "WorldSocket.h" #include "WorldSocketMgr.h" +#include "Realm/Realm.h" #include "DatabaseLoader.h" #include "AppenderDB.h" @@ -78,11 +78,6 @@ uint32 _worldLoopCounter(0); uint32 _lastChangeMsTime(0); uint32 _maxCoreStuckTimeInMs(0); -WorldDatabaseWorkerPool WorldDatabase; ///< Accessor to the world database -CharacterDatabaseWorkerPool CharacterDatabase; ///< Accessor to the character database -LoginDatabaseWorkerPool LoginDatabase; ///< Accessor to the realm/login database -uint32 realmID; ///< Id of the realm - void SignalHandler(const boost::system::error_code& error, int signalNumber); void FreezeDetectorHandler(const boost::system::error_code& error); AsyncAcceptor* StartRaSocketAcceptor(boost::asio::io_service& ioService); @@ -92,11 +87,14 @@ void WorldUpdateLoop(); void ClearOnlineAccounts(); void ShutdownCLIThread(std::thread* cliThread); void ShutdownThreadPool(std::vector<std::thread>& threadPool); +bool LoadRealmInfo(); variables_map GetConsoleArguments(int argc, char** argv, std::string& cfg_file, std::string& cfg_service); /// Launch the Trinity server extern int main(int argc, char** argv) { + signal(SIGABRT, &Trinity::AbortHandler); + std::string configFile = _TRINITY_CORE_CONFIG; std::string configService; @@ -188,7 +186,9 @@ extern int main(int argc, char** argv) } // Set server offline (not connectable) - LoginDatabase.DirectPExecute("UPDATE realmlist SET flag = (flag & ~%u) | %u WHERE id = '%d'", REALM_FLAG_OFFLINE, REALM_FLAG_INVALID, realmID); + LoginDatabase.DirectPExecute("UPDATE realmlist SET flag = flag | %u WHERE id = '%d'", REALM_FLAG_OFFLINE, realm.Id.Realm); + + LoadRealmInfo(); // Initialize the World sWorld->SetInitialWorldSettings(); @@ -223,7 +223,9 @@ extern int main(int argc, char** argv) sWorldSocketMgr.StartNetwork(_ioService, worldListener, worldPort); // Set server online (allow connecting now) - LoginDatabase.DirectPExecute("UPDATE realmlist SET flag = flag & ~%u, population = 0 WHERE id = '%u'", REALM_FLAG_INVALID, realmID); + LoginDatabase.DirectPExecute("UPDATE realmlist SET flag = flag & ~%u, population = 0 WHERE id = '%u'", REALM_FLAG_OFFLINE, realm.Id.Realm); + realm.PopulationLevel = 0.0f; + realm.Flags = RealmFlags(realm.Flags & ~uint32(REALM_FLAG_OFFLINE)); // Start the freeze check callback cycle in 5 seconds (cycle itself is 1 sec) if (int coreStuckTime = sConfigMgr->GetIntDefault("MaxCoreStuckTime", 0)) @@ -243,6 +245,8 @@ extern int main(int argc, char** argv) // Shutdown starts here ShutdownThreadPool(threadPool); + sLog->SetSynchronous(); + sScriptMgr->OnShutdown(); sWorld->KickAll(); // save and kick all players @@ -259,7 +263,7 @@ extern int main(int argc, char** argv) sScriptMgr->Unload(); // set server offline - LoginDatabase.DirectPExecute("UPDATE realmlist SET flag = flag | %u WHERE id = '%d'", REALM_FLAG_OFFLINE, realmID); + LoginDatabase.DirectPExecute("UPDATE realmlist SET flag = flag | %u WHERE id = '%d'", REALM_FLAG_OFFLINE, realm.Id.Realm); // Clean up threads if any if (soapThread != nullptr) @@ -441,6 +445,59 @@ AsyncAcceptor* StartRaSocketAcceptor(boost::asio::io_service& ioService) return acceptor; } +bool LoadRealmInfo() +{ + boost::asio::ip::tcp::resolver resolver(_ioService); + boost::asio::ip::tcp::resolver::iterator end; + + QueryResult result = LoginDatabase.PQuery("SELECT id, name, address, localAddress, localSubnetMask, port, icon, flag, timezone, allowedSecurityLevel, population, gamebuild FROM realmlist WHERE id = %u", realm.Id.Realm); + if (!result) + return false; + + Field* fields = result->Fetch(); + realm.Name = fields[1].GetString(); + boost::asio::ip::tcp::resolver::query externalAddressQuery(ip::tcp::v4(), fields[2].GetString(), ""); + + boost::system::error_code ec; + boost::asio::ip::tcp::resolver::iterator endPoint = resolver.resolve(externalAddressQuery, ec); + if (endPoint == end || ec) + { + TC_LOG_ERROR("server.worldserver", "Could not resolve address %s", fields[2].GetString().c_str()); + return false; + } + + realm.ExternalAddress = (*endPoint).endpoint().address(); + + boost::asio::ip::tcp::resolver::query localAddressQuery(ip::tcp::v4(), fields[3].GetString(), ""); + endPoint = resolver.resolve(localAddressQuery, ec); + if (endPoint == end || ec) + { + TC_LOG_ERROR("server.worldserver", "Could not resolve address %s", fields[3].GetString().c_str()); + return false; + } + + realm.LocalAddress = (*endPoint).endpoint().address(); + + boost::asio::ip::tcp::resolver::query localSubmaskQuery(ip::tcp::v4(), fields[4].GetString(), ""); + endPoint = resolver.resolve(localSubmaskQuery, ec); + if (endPoint == end || ec) + { + TC_LOG_ERROR("server.worldserver", "Could not resolve address %s", fields[4].GetString().c_str()); + return false; + } + + realm.LocalSubnetMask = (*endPoint).endpoint().address(); + + realm.Port = fields[5].GetUInt16(); + realm.Type = fields[6].GetUInt8(); + realm.Flags = RealmFlags(fields[7].GetUInt8()); + realm.Timezone = fields[8].GetUInt8(); + realm.AllowedSecurityLevel = AccountTypes(fields[9].GetUInt8()); + realm.PopulationLevel = fields[10].GetFloat(); + realm.Build = fields[11].GetUInt32(); + return true; +} + /// Initialize connection to the databases bool StartDB() { @@ -449,21 +506,22 @@ bool StartDB() // Load databases DatabaseLoader loader("server.worldserver", DatabaseLoader::DATABASE_NONE); loader - .AddDatabase(WorldDatabase, "World") + .AddDatabase(LoginDatabase, "Login") .AddDatabase(CharacterDatabase, "Character") - .AddDatabase(LoginDatabase, "Login"); + .AddDatabase(WorldDatabase, "World"); if (!loader.Load()) return false; ///- Get the realm Id from the configuration file - realmID = sConfigMgr->GetIntDefault("RealmID", 0); - if (!realmID) + realm.Id.Realm = sConfigMgr->GetIntDefault("RealmID", 0); + if (!realm.Id.Realm) { TC_LOG_ERROR("server.worldserver", "Realm ID not defined in configuration file"); return false; } - TC_LOG_INFO("server.worldserver", "Realm running as realm ID %d", realmID); + + TC_LOG_INFO("server.worldserver", "Realm running as realm ID %d", realm.Id.Realm); ///- Clean the database before starting ClearOnlineAccounts(); @@ -490,7 +548,7 @@ void StopDB() void ClearOnlineAccounts() { // Reset online status for all accounts with characters on the current realm - LoginDatabase.DirectPExecute("UPDATE account SET online = 0 WHERE online > 0 AND id IN (SELECT acctid FROM realmcharacters WHERE realmid = %d)", realmID); + LoginDatabase.DirectPExecute("UPDATE account SET online = 0 WHERE online > 0 AND id IN (SELECT acctid FROM realmcharacters WHERE realmid = %d)", realm.Id.Realm); // Reset online status for all characters CharacterDatabase.DirectExecute("UPDATE characters SET online = 0 WHERE online <> 0"); diff --git a/src/server/worldserver/RemoteAccess/RASession.cpp b/src/server/worldserver/RemoteAccess/RASession.cpp index 59e7b138c48..1ad1ac1dc6c 100644 --- a/src/server/worldserver/RemoteAccess/RASession.cpp +++ b/src/server/worldserver/RemoteAccess/RASession.cpp @@ -121,7 +121,7 @@ bool RASession::CheckAccessLevel(const std::string& user) { std::string safeUser = user; - AccountMgr::normalizeString(safeUser); + Utf8ToUpperOnlyLatin(safeUser); PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_ACCESS); stmt->setString(0, safeUser); @@ -153,10 +153,10 @@ bool RASession::CheckPassword(const std::string& user, const std::string& pass) { std::string safe_user = user; std::transform(safe_user.begin(), safe_user.end(), safe_user.begin(), ::toupper); - AccountMgr::normalizeString(safe_user); + Utf8ToUpperOnlyLatin(safe_user); std::string safe_pass = pass; - AccountMgr::normalizeString(safe_pass); + Utf8ToUpperOnlyLatin(safe_pass); std::transform(safe_pass.begin(), safe_pass.end(), safe_pass.begin(), ::toupper); std::string hash = AccountMgr::CalculateShaPassHash(safe_user, safe_pass); diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index 217995cb88a..ab567f891f8 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -161,6 +161,45 @@ BindIP = "0.0.0.0" ThreadPool = 2 # +# CMakeCommand +# Description: The path to your CMake binary. +# If the path is left empty, the built-in CMAKE_COMMAND is used. +# Example: "C:/Program Files (x86)/CMake/bin/cmake.exe" +# "/usr/bin/cmake" +# Default: "" + +CMakeCommand = "" + +# +# BuildDirectory +# Description: The path to your build directory. +# If the path is left empty, the built-in CMAKE_BINARY_DIR is used. +# Example: "../TrinityCore" +# Default: "" + +BuildDirectory = "" + +# +# SourceDirectory +# Description: The path to your TrinityCore source directory. +# If the path is left empty, the built-in CMAKE_SOURCE_DIR is used. +# Example: "../TrinityCore" +# Default: "" + +SourceDirectory = "" + +# +# MySQLExecutable +# Description: The path to your mysql cli binary. +# If the path is left empty, built-in path from cmake is used. +# Example: "C:/Program Files/MySQL/MySQL Server 5.6/bin/mysql.exe" +# "mysql.exe" +# "/usr/bin/mysql" +# Default: "" + +MySQLExecutable = "" + +# ################################################################################################### ################################################################################################### @@ -231,6 +270,25 @@ MaxOverspeedPings = 2 GridUnload = 1 # +# BaseMapLoadAllGrids +# Description: Load all grids for base maps upon load. Requires GridUnload to be 0. +# This will take around 5GB of ram upon server load, and will take some time +# to initially load the server. +# Default: 0 - (Don't pre-load all base maps, dynamically load as used) +# 1 - (Preload all grids in all base maps upon load) + +BaseMapLoadAllGrids = 0 + +# +# InstanceMapLoadAllGrids +# Description: Load all grids for instance maps upon load. Requires GridUnload to be 0. +# Upon loading an instance map, all creatures/objects in the map will be pre-loaded +# Default: 0 - (Don't pre-load all base maps, dynamically load as used) +# 1 - (Preload all grids in the instance upon load) + +InstanceMapLoadAllGrids = 0 + +# # SocketTimeOutTime # Description: Time (in milliseconds) after which a connection being idle on the character # selection screen is disconnected. @@ -1061,9 +1119,8 @@ BeepAtStart = 1 # # Motd -# Description: Message of the Day, displayed at login. -# Use '@' for a newline and be sure to escape special characters. -# Example: "Welcome to John\'s Server@This server runs on Trinity Core." +# Description: Message of the Day, displayed at login. Use '@' for a newline. +# Example: "Welcome to John's Server!@This server is proud to be powered by Trinity Core." # Default: "Welcome to a Trinity Core server." Motd = "Welcome to a Trinity Core server." @@ -1167,26 +1224,6 @@ BirthdayTime = 1222964635 Updates.EnableDatabases = 7 # -# Updates.SourcePath -# Description: The path to your TrinityCore source directory. -# If the path is left empty, built-in CMAKE_SOURCE_DIR is used. -# Example: "../TrinityCore" -# Default: "" - -Updates.SourcePath = "" - -# -# Updates.MySqlCLIPath -# Description: The path to your mysql cli binary. -# If the path is left empty, built-in path from cmake is used. -# Example: "C:/Program Files/MySQL/MySQL Server 5.6/bin/mysql.exe" -# "mysql.exe" -# "/usr/bin/mysql" -# Default: "" - -Updates.MySqlCLIPath = "" - -# # Updates.AutoSetup # Description: Auto populate empty databases. # Default: 1 - (Enabled) @@ -1354,10 +1391,11 @@ AllowTwoSide.Trade = 0 # # TalentsInspecting -# Description: Allow inspecting characters from the opposing faction. -# Doesn't affect characters in gamemaster mode. -# Default: 1 - (Enabled) -# 0 - (Disabled) +# Description: Allow/disallow inspecting other characters' talents. +# Doesn't affect game master accounts. +# 2 - (Enabled for all characters) +# Default: 1 - (Enabled for characters of the same faction) +# 0 - (Talent inspecting is disabled) TalentsInspecting = 1 @@ -3058,6 +3096,29 @@ AuctionHouseBot.Items.Orange.Price.Ratio = 100 AuctionHouseBot.Items.Yellow.Price.Ratio = 100 # +# AuctionHouseBot.Class.CLASS.Price.Ratio +# Description: Percentage by which the price of items sold of each class is incremented / decreased (for all houses) +# Default: 100 - (No change) + +AuctionHouseBot.Class.Consumable.Price.Ratio = 100 +AuctionHouseBot.Class.Container.Price.Ratio = 100 +AuctionHouseBot.Class.Weapon.Price.Ratio = 100 +AuctionHouseBot.Class.Gem.Price.Ratio = 100 +AuctionHouseBot.Class.Armor.Price.Ratio = 100 +AuctionHouseBot.Class.Reagent.Price.Ratio = 100 +AuctionHouseBot.Class.Projectile.Price.Ratio = 100 +AuctionHouseBot.Class.TradeGood.Price.Ratio = 100 +AuctionHouseBot.Class.Generic.Price.Ratio = 100 +AuctionHouseBot.Class.Recipe.Price.Ratio = 100 +AuctionHouseBot.Class.Quiver.Price.Ratio = 100 +AuctionHouseBot.Class.Quest.Price.Ratio = 100 +AuctionHouseBot.Class.Key.Price.Ratio = 100 +AuctionHouseBot.Class.Misc.Price.Ratio = 100 +AuctionHouseBot.Class.Glyph.Price.Ratio = 100 + + + +# # AuctionHouseBot.Items.ItemLevel.* # Description: Prevent seller from listing items below/above this item level # Default: 0 - (Disabled) @@ -3133,6 +3194,7 @@ AuctionHouseBot.Class.Key = 1 AuctionHouseBot.Class.Misc = 5 AuctionHouseBot.Class.Glyph = 3 + # ################################################################################################### @@ -3423,6 +3485,7 @@ Logger.server=3,Console Server Logger.commands.gm=3,Console GM Logger.sql.sql=5,Console DBErrors Logger.sql.updates=3,Console Server +Logger.mmaps=3,Server #Logger.achievement=3,Console Server #Logger.addon=3,Console Server diff --git a/src/tools/map_extractor/CMakeLists.txt b/src/tools/map_extractor/CMakeLists.txt index d0f3e42cef8..b30381e099d 100644 --- a/src/tools/map_extractor/CMakeLists.txt +++ b/src/tools/map_extractor/CMakeLists.txt @@ -37,7 +37,7 @@ add_executable(mapextractor target_link_libraries(mapextractor common - format + cppformat g3dlib mpq ${BZIP2_LIBRARIES} diff --git a/src/tools/mmaps_generator/CMakeLists.txt b/src/tools/mmaps_generator/CMakeLists.txt index 4eb416a106b..15f1326317f 100644 --- a/src/tools/mmaps_generator/CMakeLists.txt +++ b/src/tools/mmaps_generator/CMakeLists.txt @@ -13,6 +13,7 @@ file(GLOB_RECURSE mmap_gen_sources *.cpp *.h) set(mmap_gen_Includes ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/dep/libmpq + ${CMAKE_SOURCE_DIR}/dep/cppformat ${CMAKE_SOURCE_DIR}/dep/zlib ${CMAKE_SOURCE_DIR}/dep/bzip2 ${CMAKE_SOURCE_DIR}/dep/g3dlite/include @@ -48,6 +49,7 @@ target_link_libraries(mmaps_generator g3dlib Recast Detour + cppformat ${BZIP2_LIBRARIES} ${ZLIB_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} diff --git a/src/tools/mmaps_generator/MapBuilder.cpp b/src/tools/mmaps_generator/MapBuilder.cpp index 3a63f9718db..80b7b266f27 100644 --- a/src/tools/mmaps_generator/MapBuilder.cpp +++ b/src/tools/mmaps_generator/MapBuilder.cpp @@ -699,7 +699,7 @@ namespace MMAP iv.polyMesh = rcAllocPolyMesh(); if (!iv.polyMesh) { - printf("%s alloc iv.polyMesh FIALED!\n", tileString); + printf("%s alloc iv.polyMesh FAILED!\n", tileString); delete[] pmmerge; delete[] dmmerge; delete[] tiles; @@ -710,7 +710,7 @@ namespace MMAP iv.polyMeshDetail = rcAllocPolyMeshDetail(); if (!iv.polyMeshDetail) { - printf("%s alloc m_dmesh FIALED!\n", tileString); + printf("%s alloc m_dmesh FAILED!\n", tileString); delete[] pmmerge; delete[] dmmerge; delete[] tiles; |